fuse: Linking file to inode helper
authorPavel Emelyanov <xemul@openvz.org>
Thu, 10 Oct 2013 13:10:04 +0000 (17:10 +0400)
committerMiklos Szeredi <mszeredi@suse.cz>
Wed, 2 Apr 2014 13:38:47 +0000 (15:38 +0200)
When writeback is ON every writeable file should be in per-inode write list,
not only mmap-ed ones. Thus introduce a helper for this linkage.

Signed-off-by: Maxim Patlasov <MPatlasov@parallels.com>
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
fs/fuse/file.c

index 77bcc303c3aeb9214ba4b13098da14fb8bcbe20b..2489aca4d1a6882aaff86e3ecfbfb21368c0d405 100644 (file)
@@ -188,6 +188,22 @@ int fuse_do_open(struct fuse_conn *fc, u64 nodeid, struct file *file,
 }
 EXPORT_SYMBOL_GPL(fuse_do_open);
 
+static void fuse_link_write_file(struct file *file)
+{
+       struct inode *inode = file_inode(file);
+       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_inode *fi = get_fuse_inode(inode);
+       struct fuse_file *ff = file->private_data;
+       /*
+        * file may be written through mmap, so chain it onto the
+        * inodes's write_file list
+        */
+       spin_lock(&fc->lock);
+       if (list_empty(&ff->write_entry))
+               list_add(&ff->write_entry, &fi->write_files);
+       spin_unlock(&fc->lock);
+}
+
 void fuse_finish_open(struct inode *inode, struct file *file)
 {
        struct fuse_file *ff = file->private_data;
@@ -1946,20 +1962,9 @@ static const struct vm_operations_struct fuse_file_vm_ops = {
 
 static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma)
 {
-       if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE)) {
-               struct inode *inode = file_inode(file);
-               struct fuse_conn *fc = get_fuse_conn(inode);
-               struct fuse_inode *fi = get_fuse_inode(inode);
-               struct fuse_file *ff = file->private_data;
-               /*
-                * file may be written through mmap, so chain it onto the
-                * inodes's write_file list
-                */
-               spin_lock(&fc->lock);
-               if (list_empty(&ff->write_entry))
-                       list_add(&ff->write_entry, &fi->write_files);
-               spin_unlock(&fc->lock);
-       }
+       if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE))
+               fuse_link_write_file(file);
+
        file_accessed(file);
        vma->vm_ops = &fuse_file_vm_ops;
        return 0;