]> git.openpandora.org Git - pandora-kernel.git/commitdiff
ext4: move i_size,i_disksize update routines to helper function
authorDmitry Monakhov <dmonakhov@openvz.org>
Sat, 23 Aug 2014 21:48:28 +0000 (17:48 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 23 Aug 2014 21:48:28 +0000 (17:48 -0400)
Cc: stable@vger.kernel.org # needed for bug fix patches
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/ext4.h
fs/ext4/extents.c
fs/ext4/inode.c

index 4d95c330177513a432a7e6b9dffd5c3d9a4ff7f3..b0c225cdb52cd20ba5927149c338d9749e951f57 100644 (file)
@@ -2454,6 +2454,22 @@ static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize)
        up_write(&EXT4_I(inode)->i_data_sem);
 }
 
+/* Update i_size, i_disksize. Requires i_mutex to avoid races with truncate */
+static inline int ext4_update_inode_size(struct inode *inode, loff_t newsize)
+{
+       int changed = 0;
+
+       if (newsize > inode->i_size) {
+               i_size_write(inode, newsize);
+               changed = 1;
+       }
+       if (newsize > EXT4_I(inode)->i_disksize) {
+               ext4_update_i_disksize(inode, newsize);
+               changed |= 2;
+       }
+       return changed;
+}
+
 struct ext4_group_info {
        unsigned long   bb_state;
        struct rb_root  bb_free_root;
index 76c2df382b7d05619bbe4093d2115ca6dafa617e..f0e6934291dd2ff592644aa5d4fe1c8c866e37f7 100644 (file)
@@ -4839,12 +4839,8 @@ static long ext4_zero_range(struct file *file, loff_t offset,
        }
 
        inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
-
        if (new_size) {
-               if (new_size > i_size_read(inode))
-                       i_size_write(inode, new_size);
-               if (new_size > EXT4_I(inode)->i_disksize)
-                       ext4_update_i_disksize(inode, new_size);
+               ext4_update_inode_size(inode, new_size);
        } else {
                /*
                * Mark that we allocate beyond EOF so the subsequent truncate
@@ -4886,7 +4882,6 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
        int ret = 0;
        int flags;
        ext4_lblk_t lblk;
-       struct timespec tv;
        unsigned int blkbits = inode->i_blkbits;
 
        /* Return error if mode is not supported */
@@ -4945,15 +4940,11 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
        if (IS_ERR(handle))
                goto out;
 
-       tv = inode->i_ctime = ext4_current_time(inode);
+       inode->i_ctime = ext4_current_time(inode);
 
        if (new_size) {
-               if (new_size > i_size_read(inode)) {
-                       i_size_write(inode, new_size);
-                       inode->i_mtime = tv;
-               }
-               if (new_size > EXT4_I(inode)->i_disksize)
-                       ext4_update_i_disksize(inode, new_size);
+               if (ext4_update_inode_size(inode, new_size) & 0x1)
+                       inode->i_mtime = inode->i_ctime;
        } else {
                /*
                * Mark that we allocate beyond EOF so the subsequent truncate
diff --cc fs/ext4/inode.c
Simple merge