fuse: clean up setting i_size in write
authorMiklos Szeredi <mszeredi@suse.cz>
Wed, 30 Apr 2008 07:54:41 +0000 (00:54 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 30 Apr 2008 15:29:50 +0000 (08:29 -0700)
Extract common code for setting i_size in write functions into a common
helper.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/fuse/file.c

index 68051f3bdf916601844db9e915b891341a403df5..f0f0f278b4eae6cc150daa07f6ad220131d222f4 100644 (file)
@@ -610,13 +610,24 @@ static int fuse_write_begin(struct file *file, struct address_space *mapping,
        return 0;
 }
 
+static void fuse_write_update_size(struct inode *inode, loff_t pos)
+{
+       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_inode *fi = get_fuse_inode(inode);
+
+       spin_lock(&fc->lock);
+       fi->attr_version = ++fc->attr_version;
+       if (pos > inode->i_size)
+               i_size_write(inode, pos);
+       spin_unlock(&fc->lock);
+}
+
 static int fuse_buffered_write(struct file *file, struct inode *inode,
                               loff_t pos, unsigned count, struct page *page)
 {
        int err;
        size_t nres;
        struct fuse_conn *fc = get_fuse_conn(inode);
-       struct fuse_inode *fi = get_fuse_inode(inode);
        unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
        struct fuse_req *req;
 
@@ -643,12 +654,7 @@ static int fuse_buffered_write(struct file *file, struct inode *inode,
                err = -EIO;
        if (!err) {
                pos += nres;
-               spin_lock(&fc->lock);
-               fi->attr_version = ++fc->attr_version;
-               if (pos > inode->i_size)
-                       i_size_write(inode, pos);
-               spin_unlock(&fc->lock);
-
+               fuse_write_update_size(inode, pos);
                if (count == PAGE_CACHE_SIZE)
                        SetPageUptodate(page);
        }
@@ -766,12 +772,8 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
        }
        fuse_put_request(fc, req);
        if (res > 0) {
-               if (write) {
-                       spin_lock(&fc->lock);
-                       if (pos > inode->i_size)
-                               i_size_write(inode, pos);
-                       spin_unlock(&fc->lock);
-               }
+               if (write)
+                       fuse_write_update_size(inode, pos);
                *ppos = pos;
        }
        fuse_invalidate_attr(inode);