From: Greg Kroah-Hartman Date: Sat, 1 Mar 2014 01:13:21 +0000 (-0800) Subject: 3.10-stable patches X-Git-Tag: v3.10.33~39 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7a941adbf64010f8e65a4979bbd464954e4db9fc;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: fs-fix-iversion-handling.patch --- diff --git a/queue-3.10/fs-fix-iversion-handling.patch b/queue-3.10/fs-fix-iversion-handling.patch new file mode 100644 index 00000000000..9eb77280e0a --- /dev/null +++ b/queue-3.10/fs-fix-iversion-handling.patch @@ -0,0 +1,80 @@ +From dff6efc326a4d5f305797d4a6bba14f374fdd633 Mon Sep 17 00:00:00 2001 +From: Christoph Hellwig +Date: Tue, 19 Nov 2013 07:17:07 -0800 +Subject: fs: fix iversion handling + +From: Christoph Hellwig + +commit dff6efc326a4d5f305797d4a6bba14f374fdd633 upstream. + +Currently notify_change directly updates i_version for size updates, +which not only is counter to how all other fields are updated through +struct iattr, but also breaks XFS, which need inode updates to happen +under its own lock, and synchronized to the structure that gets written +to the log. + +Remove the update in the common code, and it to btrfs and ext4, +XFS already does a proper updaste internally and currently gets a +double update with the existing code. + +IMHO this is 3.13 and -stable material and should go in through the XFS +tree. + +Signed-off-by: Christoph Hellwig +Reviewed-by: Andreas Dilger +Acked-by: Jan Kara +Reviewed-by: Dave Chinner +Signed-off-by: Chris Mason +Signed-off-by: Ben Myers +Signed-off-by: Greg Kroah-Hartman + +--- + fs/attr.c | 5 ----- + fs/btrfs/inode.c | 8 ++++++-- + fs/ext4/inode.c | 4 ++++ + 3 files changed, 10 insertions(+), 7 deletions(-) + +--- a/fs/attr.c ++++ b/fs/attr.c +@@ -182,11 +182,6 @@ int notify_change(struct dentry * dentry + return -EPERM; + } + +- if ((ia_valid & ATTR_SIZE) && IS_I_VERSION(inode)) { +- if (attr->ia_size != inode->i_size) +- inode_inc_iversion(inode); +- } +- + if ((ia_valid & ATTR_MODE)) { + umode_t amode = attr->ia_mode; + /* Flag setting protected by i_mutex */ +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -4527,8 +4527,12 @@ static int btrfs_setsize(struct inode *i + * these flags set. For all other operations the VFS set these flags + * explicitly if it wants a timestamp update. + */ +- if (newsize != oldsize && (!(mask & (ATTR_CTIME | ATTR_MTIME)))) +- inode->i_ctime = inode->i_mtime = current_fs_time(inode->i_sb); ++ if (newsize != oldsize) { ++ inode_inc_iversion(inode); ++ if (!(mask & (ATTR_CTIME | ATTR_MTIME))) ++ inode->i_ctime = inode->i_mtime = ++ current_fs_time(inode->i_sb); ++ } + + if (newsize > oldsize) { + truncate_pagecache(inode, oldsize, newsize); +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -4704,6 +4704,10 @@ int ext4_setattr(struct dentry *dentry, + if (attr->ia_size > sbi->s_bitmap_maxbytes) + return -EFBIG; + } ++ ++ if (IS_I_VERSION(inode) && attr->ia_size != inode->i_size) ++ inode_inc_iversion(inode); ++ + if (S_ISREG(inode->i_mode) && + (attr->ia_size < inode->i_size)) { + if (ext4_should_order_data(inode)) { diff --git a/queue-3.10/series b/queue-3.10/series index 4cebd2f6220..820506d6745 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -37,3 +37,4 @@ net-ip-ipv6-handle-gso-skbs-in-forwarding-path.patch net-use-__gfp_noretry-for-high-order-allocations.patch memcg-fix-endless-loop-caused-by-mem_cgroup_iter.patch cgroup-use-an-ordered-workqueue-for-cgroup-destruction.patch +fs-fix-iversion-handling.patch