]> Git Repo - linux.git/blobdiff - fs/9p/vfs_super.c
Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
[linux.git] / fs / 9p / vfs_super.c
index 806da5d3b3a0803ee572eab76af384c772dba18d..be74d020436e2d7badad70f6e89e430d12f9d6e8 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/idr.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
+#include <linux/statfs.h>
 #include <net/9p/9p.h>
 #include <net/9p/client.h>
 
@@ -45,7 +46,7 @@
 #include "v9fs_vfs.h"
 #include "fid.h"
 
-static const struct super_operations v9fs_super_ops;
+static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl;
 
 /**
  * v9fs_set_super - set the superblock
@@ -76,7 +77,10 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
        sb->s_blocksize_bits = fls(v9ses->maxdata - 1);
        sb->s_blocksize = 1 << sb->s_blocksize_bits;
        sb->s_magic = V9FS_MAGIC;
-       sb->s_op = &v9fs_super_ops;
+       if (v9fs_proto_dotl(v9ses))
+               sb->s_op = &v9fs_super_ops_dotl;
+       else
+               sb->s_op = &v9fs_super_ops;
        sb->s_bdi = &v9ses->bdi;
 
        sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC |
@@ -211,6 +215,42 @@ v9fs_umount_begin(struct super_block *sb)
        v9fs_session_begin_cancel(v9ses);
 }
 
+static int v9fs_statfs(struct dentry *dentry, struct kstatfs *buf)
+{
+       struct v9fs_session_info *v9ses;
+       struct p9_fid *fid;
+       struct p9_rstatfs rs;
+       int res;
+
+       fid = v9fs_fid_lookup(dentry);
+       if (IS_ERR(fid)) {
+               res = PTR_ERR(fid);
+               goto done;
+       }
+
+       v9ses = v9fs_inode2v9ses(dentry->d_inode);
+       if (v9fs_proto_dotl(v9ses)) {
+               res = p9_client_statfs(fid, &rs);
+               if (res == 0) {
+                       buf->f_type = rs.type;
+                       buf->f_bsize = rs.bsize;
+                       buf->f_blocks = rs.blocks;
+                       buf->f_bfree = rs.bfree;
+                       buf->f_bavail = rs.bavail;
+                       buf->f_files = rs.files;
+                       buf->f_ffree = rs.ffree;
+                       buf->f_fsid.val[0] = rs.fsid & 0xFFFFFFFFUL;
+                       buf->f_fsid.val[1] = (rs.fsid >> 32) & 0xFFFFFFFFUL;
+                       buf->f_namelen = rs.namelen;
+               }
+               if (res != -ENOSYS)
+                       goto done;
+       }
+       res = simple_statfs(dentry, buf);
+done:
+       return res;
+}
+
 static const struct super_operations v9fs_super_ops = {
 #ifdef CONFIG_9P_FSCACHE
        .alloc_inode = v9fs_alloc_inode,
@@ -222,6 +262,17 @@ static const struct super_operations v9fs_super_ops = {
        .umount_begin = v9fs_umount_begin,
 };
 
+static const struct super_operations v9fs_super_ops_dotl = {
+#ifdef CONFIG_9P_FSCACHE
+       .alloc_inode = v9fs_alloc_inode,
+       .destroy_inode = v9fs_destroy_inode,
+#endif
+       .statfs = v9fs_statfs,
+       .clear_inode = v9fs_clear_inode,
+       .show_options = generic_show_options,
+       .umount_begin = v9fs_umount_begin,
+};
+
 struct file_system_type v9fs_fs_type = {
        .name = "9p",
        .get_sb = v9fs_get_sb,
This page took 0.035309 seconds and 4 git commands to generate.