diff options
Diffstat (limited to 'fs/9p/vfs_super.c')
-rw-r--r-- | fs/9p/vfs_super.c | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index be74d020436e..f9311077de68 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include "v9fs.h" | 45 | #include "v9fs.h" |
46 | #include "v9fs_vfs.h" | 46 | #include "v9fs_vfs.h" |
47 | #include "fid.h" | 47 | #include "fid.h" |
48 | #include "xattr.h" | ||
48 | 49 | ||
49 | static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl; | 50 | static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl; |
50 | 51 | ||
@@ -77,9 +78,10 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | |||
77 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); | 78 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); |
78 | sb->s_blocksize = 1 << sb->s_blocksize_bits; | 79 | sb->s_blocksize = 1 << sb->s_blocksize_bits; |
79 | sb->s_magic = V9FS_MAGIC; | 80 | sb->s_magic = V9FS_MAGIC; |
80 | if (v9fs_proto_dotl(v9ses)) | 81 | if (v9fs_proto_dotl(v9ses)) { |
81 | sb->s_op = &v9fs_super_ops_dotl; | 82 | sb->s_op = &v9fs_super_ops_dotl; |
82 | else | 83 | sb->s_xattr = v9fs_xattr_handlers; |
84 | } else | ||
83 | sb->s_op = &v9fs_super_ops; | 85 | sb->s_op = &v9fs_super_ops; |
84 | sb->s_bdi = &v9ses->bdi; | 86 | sb->s_bdi = &v9ses->bdi; |
85 | 87 | ||
@@ -107,7 +109,6 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
107 | struct inode *inode = NULL; | 109 | struct inode *inode = NULL; |
108 | struct dentry *root = NULL; | 110 | struct dentry *root = NULL; |
109 | struct v9fs_session_info *v9ses = NULL; | 111 | struct v9fs_session_info *v9ses = NULL; |
110 | struct p9_wstat *st = NULL; | ||
111 | int mode = S_IRWXUGO | S_ISVTX; | 112 | int mode = S_IRWXUGO | S_ISVTX; |
112 | struct p9_fid *fid; | 113 | struct p9_fid *fid; |
113 | int retval = 0; | 114 | int retval = 0; |
@@ -124,16 +125,10 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
124 | goto close_session; | 125 | goto close_session; |
125 | } | 126 | } |
126 | 127 | ||
127 | st = p9_client_stat(fid); | ||
128 | if (IS_ERR(st)) { | ||
129 | retval = PTR_ERR(st); | ||
130 | goto clunk_fid; | ||
131 | } | ||
132 | |||
133 | sb = sget(fs_type, NULL, v9fs_set_super, v9ses); | 128 | sb = sget(fs_type, NULL, v9fs_set_super, v9ses); |
134 | if (IS_ERR(sb)) { | 129 | if (IS_ERR(sb)) { |
135 | retval = PTR_ERR(sb); | 130 | retval = PTR_ERR(sb); |
136 | goto free_stat; | 131 | goto clunk_fid; |
137 | } | 132 | } |
138 | v9fs_fill_super(sb, v9ses, flags, data); | 133 | v9fs_fill_super(sb, v9ses, flags, data); |
139 | 134 | ||
@@ -151,22 +146,38 @@ static int v9fs_get_sb(struct file_system_type *fs_type, int flags, | |||
151 | } | 146 | } |
152 | 147 | ||
153 | sb->s_root = root; | 148 | sb->s_root = root; |
154 | root->d_inode->i_ino = v9fs_qid2ino(&st->qid); | ||
155 | 149 | ||
156 | v9fs_stat2inode(st, root->d_inode, sb); | 150 | if (v9fs_proto_dotl(v9ses)) { |
151 | struct p9_stat_dotl *st = NULL; | ||
152 | st = p9_client_getattr_dotl(fid, P9_STATS_BASIC); | ||
153 | if (IS_ERR(st)) { | ||
154 | retval = PTR_ERR(st); | ||
155 | goto clunk_fid; | ||
156 | } | ||
157 | |||
158 | v9fs_stat2inode_dotl(st, root->d_inode); | ||
159 | kfree(st); | ||
160 | } else { | ||
161 | struct p9_wstat *st = NULL; | ||
162 | st = p9_client_stat(fid); | ||
163 | if (IS_ERR(st)) { | ||
164 | retval = PTR_ERR(st); | ||
165 | goto clunk_fid; | ||
166 | } | ||
167 | |||
168 | root->d_inode->i_ino = v9fs_qid2ino(&st->qid); | ||
169 | v9fs_stat2inode(st, root->d_inode, sb); | ||
170 | |||
171 | p9stat_free(st); | ||
172 | kfree(st); | ||
173 | } | ||
157 | 174 | ||
158 | v9fs_fid_add(root, fid); | 175 | v9fs_fid_add(root, fid); |
159 | p9stat_free(st); | ||
160 | kfree(st); | ||
161 | 176 | ||
162 | P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); | 177 | P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); |
163 | simple_set_mnt(mnt, sb); | 178 | simple_set_mnt(mnt, sb); |
164 | return 0; | 179 | return 0; |
165 | 180 | ||
166 | free_stat: | ||
167 | p9stat_free(st); | ||
168 | kfree(st); | ||
169 | |||
170 | clunk_fid: | 181 | clunk_fid: |
171 | p9_client_clunk(fid); | 182 | p9_client_clunk(fid); |
172 | 183 | ||
@@ -176,8 +187,6 @@ close_session: | |||
176 | return retval; | 187 | return retval; |
177 | 188 | ||
178 | release_sb: | 189 | release_sb: |
179 | p9stat_free(st); | ||
180 | kfree(st); | ||
181 | deactivate_locked_super(sb); | 190 | deactivate_locked_super(sb); |
182 | return retval; | 191 | return retval; |
183 | } | 192 | } |
@@ -257,7 +266,7 @@ static const struct super_operations v9fs_super_ops = { | |||
257 | .destroy_inode = v9fs_destroy_inode, | 266 | .destroy_inode = v9fs_destroy_inode, |
258 | #endif | 267 | #endif |
259 | .statfs = simple_statfs, | 268 | .statfs = simple_statfs, |
260 | .clear_inode = v9fs_clear_inode, | 269 | .evict_inode = v9fs_evict_inode, |
261 | .show_options = generic_show_options, | 270 | .show_options = generic_show_options, |
262 | .umount_begin = v9fs_umount_begin, | 271 | .umount_begin = v9fs_umount_begin, |
263 | }; | 272 | }; |
@@ -268,7 +277,7 @@ static const struct super_operations v9fs_super_ops_dotl = { | |||
268 | .destroy_inode = v9fs_destroy_inode, | 277 | .destroy_inode = v9fs_destroy_inode, |
269 | #endif | 278 | #endif |
270 | .statfs = v9fs_statfs, | 279 | .statfs = v9fs_statfs, |
271 | .clear_inode = v9fs_clear_inode, | 280 | .evict_inode = v9fs_evict_inode, |
272 | .show_options = generic_show_options, | 281 | .show_options = generic_show_options, |
273 | .umount_begin = v9fs_umount_begin, | 282 | .umount_begin = v9fs_umount_begin, |
274 | }; | 283 | }; |
@@ -278,4 +287,5 @@ struct file_system_type v9fs_fs_type = { | |||
278 | .get_sb = v9fs_get_sb, | 287 | .get_sb = v9fs_get_sb, |
279 | .kill_sb = v9fs_kill_super, | 288 | .kill_sb = v9fs_kill_super, |
280 | .owner = THIS_MODULE, | 289 | .owner = THIS_MODULE, |
290 | .fs_flags = FS_RENAME_DOES_D_MOVE, | ||
281 | }; | 291 | }; |