FAILED: patch "[PATCH] btrfs: fix potential overflow in cluster_pages_for_defrag on" failed to apply to 4.9-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a1fbc6750e212c5675a4e48d7f51d44607eb8756 Mon Sep 17 00:00:00 2001
From: "Matthew Wilcox (Oracle)" <[email protected]>
Date: Sun, 4 Oct 2020 19:04:26 +0100
Subject: [PATCH] btrfs: fix potential overflow in cluster_pages_for_defrag on
32bit arch
On 32-bit systems, this shift will overflow for files larger than 4GB as start_index is unsigned long while the calls to btrfs_delalloc_*_space expect u64.
CC [email protected] # 4.4+
Fixes df480633b891 ("btrfs: extent-tree: Switch to new delalloc space reserve and release")
Reviewed-by Josef Bacik <[email protected]>
Signed-off-by Matthew Wilcox (Oracle) <[email protected]>
Reviewed-by David Sterba <[email protected]>
[ define the variable instead of repeating the shift ]
Signed-off-by David Sterba <[email protected]>
fs/btrfs/ioctl.c +4 -6
@@ -1274,6 +1274,7 @@ static int cluster_pages_for_defrag(struct inode *inode,u64 page_start;u64 page_end;u64 page_cnt; +u64 start = (u64 )start_index <<PAGE_SHIFT ;int ret;int i;int i_done;
@@ -1290,8 +1291,7 @@ static int cluster_pages_for_defrag(struct inode *inode, page_cnt =min_t (u64, (u64 )num_pages, (u64 )file_end - start_index +1 ); ret =btrfs_delalloc_reserve_space (BTRFS_I (inode), &data_reserved, - start_index <<PAGE_SHIFT , - page_cnt <<PAGE_SHIFT ); + start, page_cnt <<PAGE_SHIFT );if (ret)return ret; i_done =0 ;
@@ -1380,8 +1380,7 @@ again:btrfs_mod_outstanding_extents (BTRFS_I (inode),1 );spin_unlock (&BTRFS_I (inode)->lock);btrfs_delalloc_release_space (BTRFS_I (inode), data_reserved, - start_index <<PAGE_SHIFT , - (page_cnt - i_done) <<PAGE_SHIFT , true); + start, (page_cnt - i_done) <<PAGE_SHIFT , true); }
@@ -1408,8 +1407,7 @@ out:put_page (pages[i]); }btrfs_delalloc_release_space (BTRFS_I (inode), data_reserved, - start_index <<PAGE_SHIFT , - page_cnt <<PAGE_SHIFT , true); + start, page_cnt <<PAGE_SHIFT , true);btrfs_delalloc_release_extents (BTRFS_I (inode), page_cnt <<PAGE_SHIFT );extent_changeset_free (data_reserved);return ret;