]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/9p/vfs_super.c
Merge branches 'irq-fixes-for-linus' and 'sched-fixes-for-linus' of git://git.kernel...
[mirror_ubuntu-bionic-kernel.git] / fs / 9p / vfs_super.c
index dbaabe3b8131f5060d9e14ad537568f7e1ed53af..09fd08d1606fb5bf97b05de78722e74eb7f4b710 100644 (file)
@@ -86,12 +86,15 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
        } else
                sb->s_op = &v9fs_super_ops;
        sb->s_bdi = &v9ses->bdi;
+       if (v9ses->cache)
+               sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024)/PAGE_CACHE_SIZE;
 
-       sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC |
-           MS_NOATIME;
+       sb->s_flags = flags | MS_ACTIVE | MS_DIRSYNC | MS_NOATIME;
+       if (!v9ses->cache)
+               sb->s_flags |= MS_SYNCHRONOUS;
 
 #ifdef CONFIG_9P_FS_POSIX_ACL
-       if ((v9ses->flags & V9FS_ACCESS_MASK) == V9FS_ACCESS_CLIENT)
+       if ((v9ses->flags & V9FS_ACL_MASK) == V9FS_POSIX_ACL)
                sb->s_flags |= MS_POSIXACL;
 #endif
 
@@ -151,7 +154,6 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags,
                retval = PTR_ERR(inode);
                goto release_sb;
        }
-
        root = d_alloc_root(inode);
        if (!root) {
                iput(inode);
@@ -166,7 +168,7 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags,
                        retval = PTR_ERR(st);
                        goto release_sb;
                }
-
+               root->d_inode->i_ino = v9fs_qid2ino(&st->qid);
                v9fs_stat2inode_dotl(st, root->d_inode);
                kfree(st);
        } else {
@@ -183,10 +185,21 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags,
                p9stat_free(st);
                kfree(st);
        }
+       v9fs_fid_add(root, fid);
        retval = v9fs_get_acl(inode, fid);
        if (retval)
                goto release_sb;
-       v9fs_fid_add(root, fid);
+       /*
+        * Add the root fid to session info. This is used
+        * for file system sync. We want a cloned fid here
+        * so that we can do a sync_filesystem after a
+        * shrink_dcache_for_umount
+        */
+       v9ses->root_fid = v9fs_fid_clone(root);
+       if (IS_ERR(v9ses->root_fid)) {
+               retval = PTR_ERR(v9ses->root_fid);
+               goto release_sb;
+       }
 
        P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n");
        return dget(sb->s_root);
@@ -197,15 +210,11 @@ close_session:
        v9fs_session_close(v9ses);
        kfree(v9ses);
        return ERR_PTR(retval);
-
 release_sb:
        /*
-        * we will do the session_close and root dentry release
-        * in the below call. But we need to clunk fid, because we haven't
-        * attached the fid to dentry so it won't get clunked
-        * automatically.
+        * we will do the session_close and root dentry
+        * release in the below call.
         */
-       p9_client_clunk(fid);
        deactivate_locked_super(sb);
        return ERR_PTR(retval);
 }
@@ -223,7 +232,7 @@ static void v9fs_kill_super(struct super_block *s)
        P9_DPRINTK(P9_DEBUG_VFS, " %p\n", s);
 
        kill_anon_super(s);
-
+       p9_client_clunk(v9ses->root_fid);
        v9fs_session_cancel(v9ses);
        v9fs_session_close(v9ses);
        kfree(v9ses);
@@ -276,11 +285,31 @@ done:
        return res;
 }
 
+static int v9fs_sync_fs(struct super_block *sb, int wait)
+{
+       struct v9fs_session_info *v9ses = sb->s_fs_info;
+
+       P9_DPRINTK(P9_DEBUG_VFS, "v9fs_sync_fs: super_block %p\n", sb);
+       return p9_client_sync_fs(v9ses->root_fid);
+}
+
+static int v9fs_drop_inode(struct inode *inode)
+{
+       struct v9fs_session_info *v9ses;
+       v9ses = v9fs_inode2v9ses(inode);
+       if (v9ses->cache)
+               return generic_drop_inode(inode);
+       /*
+        * in case of non cached mode always drop the
+        * the inode because we want the inode attribute
+        * to always match that on the server.
+        */
+       return 1;
+}
+
 static const struct super_operations v9fs_super_ops = {
-#ifdef CONFIG_9P_FSCACHE
        .alloc_inode = v9fs_alloc_inode,
        .destroy_inode = v9fs_destroy_inode,
-#endif
        .statfs = simple_statfs,
        .evict_inode = v9fs_evict_inode,
        .show_options = generic_show_options,
@@ -288,11 +317,11 @@ static const struct super_operations v9fs_super_ops = {
 };
 
 static const struct super_operations v9fs_super_ops_dotl = {
-#ifdef CONFIG_9P_FSCACHE
        .alloc_inode = v9fs_alloc_inode,
        .destroy_inode = v9fs_destroy_inode,
-#endif
+       .sync_fs = v9fs_sync_fs,
        .statfs = v9fs_statfs,
+       .drop_inode = v9fs_drop_inode,
        .evict_inode = v9fs_evict_inode,
        .show_options = generic_show_options,
        .umount_begin = v9fs_umount_begin,
@@ -303,5 +332,5 @@ struct file_system_type v9fs_fs_type = {
        .mount = v9fs_mount,
        .kill_sb = v9fs_kill_super,
        .owner = THIS_MODULE,
-       .fs_flags = FS_RENAME_DOES_D_MOVE,
+       .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT,
 };