diff options
Diffstat (limited to 'fs/9p/vfs_super.c')
| -rw-r--r-- | fs/9p/vfs_super.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 491108bd6e0d..be74d020436e 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/idr.h> | 38 | #include <linux/idr.h> |
| 39 | #include <linux/sched.h> | 39 | #include <linux/sched.h> |
| 40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
| 41 | #include <linux/statfs.h> | ||
| 41 | #include <net/9p/9p.h> | 42 | #include <net/9p/9p.h> |
| 42 | #include <net/9p/client.h> | 43 | #include <net/9p/client.h> |
| 43 | 44 | ||
| @@ -45,7 +46,7 @@ | |||
| 45 | #include "v9fs_vfs.h" | 46 | #include "v9fs_vfs.h" |
| 46 | #include "fid.h" | 47 | #include "fid.h" |
| 47 | 48 | ||
| 48 | static const struct super_operations v9fs_super_ops; | 49 | static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl; |
| 49 | 50 | ||
| 50 | /** | 51 | /** |
| 51 | * v9fs_set_super - set the superblock | 52 | * v9fs_set_super - set the superblock |
| @@ -76,7 +77,11 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | |||
| 76 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); | 77 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); |
| 77 | sb->s_blocksize = 1 << sb->s_blocksize_bits; | 78 | sb->s_blocksize = 1 << sb->s_blocksize_bits; |
| 78 | sb->s_magic = V9FS_MAGIC; | 79 | sb->s_magic = V9FS_MAGIC; |
| 79 | sb->s_op = &v9fs_super_ops; | 80 | if (v9fs_proto_dotl(v9ses)) |
| 81 | sb->s_op = &v9fs_super_ops_dotl; | ||
| 82 | else | ||
| 83 | sb->s_op = &v9fs_super_ops; | ||
| 84 | sb->s_bdi = &v9ses->bdi; | ||
| 80 | 85 | ||
| 81 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | | 86 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | |
| 82 | MS_NOATIME; | 87 | MS_NOATIME; |
| @@ -210,6 +215,42 @@ v9fs_umount_begin(struct super_block *sb) | |||
| 210 | v9fs_session_begin_cancel(v9ses); | 215 | v9fs_session_begin_cancel(v9ses); |
| 211 | } | 216 | } |
| 212 | 217 | ||
| 218 | static int v9fs_statfs(struct dentry *dentry, struct kstatfs *buf) | ||
| 219 | { | ||
| 220 | struct v9fs_session_info *v9ses; | ||
| 221 | struct p9_fid *fid; | ||
| 222 | struct p9_rstatfs rs; | ||
| 223 | int res; | ||
| 224 | |||
| 225 | fid = v9fs_fid_lookup(dentry); | ||
| 226 | if (IS_ERR(fid)) { | ||
| 227 | res = PTR_ERR(fid); | ||
| 228 | goto done; | ||
| 229 | } | ||
| 230 | |||
| 231 | v9ses = v9fs_inode2v9ses(dentry->d_inode); | ||
| 232 | if (v9fs_proto_dotl(v9ses)) { | ||
| 233 | res = p9_client_statfs(fid, &rs); | ||
| 234 | if (res == 0) { | ||
| 235 | buf->f_type = rs.type; | ||
| 236 | buf->f_bsize = rs.bsize; | ||
| 237 | buf->f_blocks = rs.blocks; | ||
| 238 | buf->f_bfree = rs.bfree; | ||
| 239 | buf->f_bavail = rs.bavail; | ||
| 240 | buf->f_files = rs.files; | ||
| 241 | buf->f_ffree = rs.ffree; | ||
| 242 | buf->f_fsid.val[0] = rs.fsid & 0xFFFFFFFFUL; | ||
| 243 | buf->f_fsid.val[1] = (rs.fsid >> 32) & 0xFFFFFFFFUL; | ||
| 244 | buf->f_namelen = rs.namelen; | ||
| 245 | } | ||
| 246 | if (res != -ENOSYS) | ||
| 247 | goto done; | ||
| 248 | } | ||
| 249 | res = simple_statfs(dentry, buf); | ||
| 250 | done: | ||
| 251 | return res; | ||
| 252 | } | ||
| 253 | |||
| 213 | static const struct super_operations v9fs_super_ops = { | 254 | static const struct super_operations v9fs_super_ops = { |
| 214 | #ifdef CONFIG_9P_FSCACHE | 255 | #ifdef CONFIG_9P_FSCACHE |
| 215 | .alloc_inode = v9fs_alloc_inode, | 256 | .alloc_inode = v9fs_alloc_inode, |
| @@ -221,6 +262,17 @@ static const struct super_operations v9fs_super_ops = { | |||
| 221 | .umount_begin = v9fs_umount_begin, | 262 | .umount_begin = v9fs_umount_begin, |
| 222 | }; | 263 | }; |
| 223 | 264 | ||
| 265 | static const struct super_operations v9fs_super_ops_dotl = { | ||
| 266 | #ifdef CONFIG_9P_FSCACHE | ||
| 267 | .alloc_inode = v9fs_alloc_inode, | ||
| 268 | .destroy_inode = v9fs_destroy_inode, | ||
| 269 | #endif | ||
| 270 | .statfs = v9fs_statfs, | ||
| 271 | .clear_inode = v9fs_clear_inode, | ||
| 272 | .show_options = generic_show_options, | ||
| 273 | .umount_begin = v9fs_umount_begin, | ||
| 274 | }; | ||
| 275 | |||
| 224 | struct file_system_type v9fs_fs_type = { | 276 | struct file_system_type v9fs_fs_type = { |
| 225 | .name = "9p", | 277 | .name = "9p", |
| 226 | .get_sb = v9fs_get_sb, | 278 | .get_sb = v9fs_get_sb, |
