2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-15 16:53:54 +08:00

Merge branch 'for-linus-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs

Pull btrfs fixes from Chris Mason:
 "This has two last minute fixes. The highest priority here is a
  regression fix for the decompression code, but we also fixed up a
  problem with the 32-bit compat ioctls.

  The decompression bug could hand back the wrong data on big reads when
  zlib was used. I have a larger cleanup to make the math here less
  error prone, but at this stage in the release Omar's patch is the best
  choice"

* 'for-linus-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
  btrfs: fix btrfs_decompress_buf2page()
  btrfs: fix btrfs_compat_ioctl failures on non-compat ioctls
This commit is contained in:
Linus Torvalds 2017-02-11 09:15:58 -08:00
commit 2b95550a43
2 changed files with 28 additions and 17 deletions

View File

@ -1024,6 +1024,7 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start,
unsigned long buf_offset; unsigned long buf_offset;
unsigned long current_buf_start; unsigned long current_buf_start;
unsigned long start_byte; unsigned long start_byte;
unsigned long prev_start_byte;
unsigned long working_bytes = total_out - buf_start; unsigned long working_bytes = total_out - buf_start;
unsigned long bytes; unsigned long bytes;
char *kaddr; char *kaddr;
@ -1071,26 +1072,34 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start,
if (!bio->bi_iter.bi_size) if (!bio->bi_iter.bi_size)
return 0; return 0;
bvec = bio_iter_iovec(bio, bio->bi_iter); bvec = bio_iter_iovec(bio, bio->bi_iter);
prev_start_byte = start_byte;
start_byte = page_offset(bvec.bv_page) - disk_start; start_byte = page_offset(bvec.bv_page) - disk_start;
/* /*
* make sure our new page is covered by this * We need to make sure we're only adjusting
* working buffer * our offset into compression working buffer when
* we're switching pages. Otherwise we can incorrectly
* keep copying when we were actually done.
*/ */
if (total_out <= start_byte) if (start_byte != prev_start_byte) {
return 1; /*
* make sure our new page is covered by this
* working buffer
*/
if (total_out <= start_byte)
return 1;
/* /*
* the next page in the biovec might not be adjacent * the next page in the biovec might not be adjacent
* to the last page, but it might still be found * to the last page, but it might still be found
* inside this working buffer. bump our offset pointer * inside this working buffer. bump our offset pointer
*/ */
if (total_out > start_byte && if (total_out > start_byte &&
current_buf_start < start_byte) { current_buf_start < start_byte) {
buf_offset = start_byte - buf_start; buf_offset = start_byte - buf_start;
working_bytes = total_out - start_byte; working_bytes = total_out - start_byte;
current_buf_start = buf_start + buf_offset; current_buf_start = buf_start + buf_offset;
}
} }
} }

View File

@ -5653,6 +5653,10 @@ long btrfs_ioctl(struct file *file, unsigned int
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{ {
/*
* These all access 32-bit values anyway so no further
* handling is necessary.
*/
switch (cmd) { switch (cmd) {
case FS_IOC32_GETFLAGS: case FS_IOC32_GETFLAGS:
cmd = FS_IOC_GETFLAGS; cmd = FS_IOC_GETFLAGS;
@ -5663,8 +5667,6 @@ long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case FS_IOC32_GETVERSION: case FS_IOC32_GETVERSION:
cmd = FS_IOC_GETVERSION; cmd = FS_IOC_GETVERSION;
break; break;
default:
return -ENOIOCTLCMD;
} }
return btrfs_ioctl(file, cmd, (unsigned long) compat_ptr(arg)); return btrfs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));