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:
commit
2b95550a43
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
Loading…
Reference in New Issue
Block a user