diff options
Diffstat (limited to 'fs/9p/vfs_super.c')
-rw-r--r-- | fs/9p/vfs_super.c | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index dbaabe3b8131..09fd08d1606f 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c | |||
@@ -86,12 +86,15 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | |||
86 | } else | 86 | } else |
87 | sb->s_op = &v9fs_super_ops; | 87 | sb->s_op = &v9fs_super_ops; |
88 | sb->s_bdi = &v9ses->bdi; | 88 | sb->s_bdi = &v9ses->bdi; |
89 | if (v9ses->cache) | ||
90 | sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024)/PAGE_CACHE_SIZE; | ||
89 | 91 | ||
90 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | | 92 | sb->s_flags = flags | MS_ACTIVE | MS_DIRSYNC | MS_NOATIME; |
91 | MS_NOATIME; | 93 | if (!v9ses->cache) |
94 | sb->s_flags |= MS_SYNCHRONOUS; | ||
92 | 95 | ||
93 | #ifdef CONFIG_9P_FS_POSIX_ACL | 96 | #ifdef CONFIG_9P_FS_POSIX_ACL |
94 | if ((v9ses->flags & V9FS_ACCESS_MASK) == V9FS_ACCESS_CLIENT) | 97 | if ((v9ses->flags & V9FS_ACL_MASK) == V9FS_POSIX_ACL) |
95 | sb->s_flags |= MS_POSIXACL; | 98 | sb->s_flags |= MS_POSIXACL; |
96 | #endif | 99 | #endif |
97 | 100 | ||
@@ -151,7 +154,6 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, | |||
151 | retval = PTR_ERR(inode); | 154 | retval = PTR_ERR(inode); |
152 | goto release_sb; | 155 | goto release_sb; |
153 | } | 156 | } |
154 | |||
155 | root = d_alloc_root(inode); | 157 | root = d_alloc_root(inode); |
156 | if (!root) { | 158 | if (!root) { |
157 | iput(inode); | 159 | iput(inode); |
@@ -166,7 +168,7 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, | |||
166 | retval = PTR_ERR(st); | 168 | retval = PTR_ERR(st); |
167 | goto release_sb; | 169 | goto release_sb; |
168 | } | 170 | } |
169 | 171 | root->d_inode->i_ino = v9fs_qid2ino(&st->qid); | |
170 | v9fs_stat2inode_dotl(st, root->d_inode); | 172 | v9fs_stat2inode_dotl(st, root->d_inode); |
171 | kfree(st); | 173 | kfree(st); |
172 | } else { | 174 | } else { |
@@ -183,10 +185,21 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, | |||
183 | p9stat_free(st); | 185 | p9stat_free(st); |
184 | kfree(st); | 186 | kfree(st); |
185 | } | 187 | } |
188 | v9fs_fid_add(root, fid); | ||
186 | retval = v9fs_get_acl(inode, fid); | 189 | retval = v9fs_get_acl(inode, fid); |
187 | if (retval) | 190 | if (retval) |
188 | goto release_sb; | 191 | goto release_sb; |
189 | v9fs_fid_add(root, fid); | 192 | /* |
193 | * Add the root fid to session info. This is used | ||
194 | * for file system sync. We want a cloned fid here | ||
195 | * so that we can do a sync_filesystem after a | ||
196 | * shrink_dcache_for_umount | ||
197 | */ | ||
198 | v9ses->root_fid = v9fs_fid_clone(root); | ||
199 | if (IS_ERR(v9ses->root_fid)) { | ||
200 | retval = PTR_ERR(v9ses->root_fid); | ||
201 | goto release_sb; | ||
202 | } | ||
190 | 203 | ||
191 | P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); | 204 | P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); |
192 | return dget(sb->s_root); | 205 | return dget(sb->s_root); |
@@ -197,15 +210,11 @@ close_session: | |||
197 | v9fs_session_close(v9ses); | 210 | v9fs_session_close(v9ses); |
198 | kfree(v9ses); | 211 | kfree(v9ses); |
199 | return ERR_PTR(retval); | 212 | return ERR_PTR(retval); |
200 | |||
201 | release_sb: | 213 | release_sb: |
202 | /* | 214 | /* |
203 | * we will do the session_close and root dentry release | 215 | * we will do the session_close and root dentry |
204 | * in the below call. But we need to clunk fid, because we haven't | 216 | * release in the below call. |
205 | * attached the fid to dentry so it won't get clunked | ||
206 | * automatically. | ||
207 | */ | 217 | */ |
208 | p9_client_clunk(fid); | ||
209 | deactivate_locked_super(sb); | 218 | deactivate_locked_super(sb); |
210 | return ERR_PTR(retval); | 219 | return ERR_PTR(retval); |
211 | } | 220 | } |
@@ -223,7 +232,7 @@ static void v9fs_kill_super(struct super_block *s) | |||
223 | P9_DPRINTK(P9_DEBUG_VFS, " %p\n", s); | 232 | P9_DPRINTK(P9_DEBUG_VFS, " %p\n", s); |
224 | 233 | ||
225 | kill_anon_super(s); | 234 | kill_anon_super(s); |
226 | 235 | p9_client_clunk(v9ses->root_fid); | |
227 | v9fs_session_cancel(v9ses); | 236 | v9fs_session_cancel(v9ses); |
228 | v9fs_session_close(v9ses); | 237 | v9fs_session_close(v9ses); |
229 | kfree(v9ses); | 238 | kfree(v9ses); |
@@ -276,11 +285,31 @@ done: | |||
276 | return res; | 285 | return res; |
277 | } | 286 | } |
278 | 287 | ||
288 | static int v9fs_sync_fs(struct super_block *sb, int wait) | ||
289 | { | ||
290 | struct v9fs_session_info *v9ses = sb->s_fs_info; | ||
291 | |||
292 | P9_DPRINTK(P9_DEBUG_VFS, "v9fs_sync_fs: super_block %p\n", sb); | ||
293 | return p9_client_sync_fs(v9ses->root_fid); | ||
294 | } | ||
295 | |||
296 | static int v9fs_drop_inode(struct inode *inode) | ||
297 | { | ||
298 | struct v9fs_session_info *v9ses; | ||
299 | v9ses = v9fs_inode2v9ses(inode); | ||
300 | if (v9ses->cache) | ||
301 | return generic_drop_inode(inode); | ||
302 | /* | ||
303 | * in case of non cached mode always drop the | ||
304 | * the inode because we want the inode attribute | ||
305 | * to always match that on the server. | ||
306 | */ | ||
307 | return 1; | ||
308 | } | ||
309 | |||
279 | static const struct super_operations v9fs_super_ops = { | 310 | static const struct super_operations v9fs_super_ops = { |
280 | #ifdef CONFIG_9P_FSCACHE | ||
281 | .alloc_inode = v9fs_alloc_inode, | 311 | .alloc_inode = v9fs_alloc_inode, |
282 | .destroy_inode = v9fs_destroy_inode, | 312 | .destroy_inode = v9fs_destroy_inode, |
283 | #endif | ||
284 | .statfs = simple_statfs, | 313 | .statfs = simple_statfs, |
285 | .evict_inode = v9fs_evict_inode, | 314 | .evict_inode = v9fs_evict_inode, |
286 | .show_options = generic_show_options, | 315 | .show_options = generic_show_options, |
@@ -288,11 +317,11 @@ static const struct super_operations v9fs_super_ops = { | |||
288 | }; | 317 | }; |
289 | 318 | ||
290 | static const struct super_operations v9fs_super_ops_dotl = { | 319 | static const struct super_operations v9fs_super_ops_dotl = { |
291 | #ifdef CONFIG_9P_FSCACHE | ||
292 | .alloc_inode = v9fs_alloc_inode, | 320 | .alloc_inode = v9fs_alloc_inode, |
293 | .destroy_inode = v9fs_destroy_inode, | 321 | .destroy_inode = v9fs_destroy_inode, |
294 | #endif | 322 | .sync_fs = v9fs_sync_fs, |
295 | .statfs = v9fs_statfs, | 323 | .statfs = v9fs_statfs, |
324 | .drop_inode = v9fs_drop_inode, | ||
296 | .evict_inode = v9fs_evict_inode, | 325 | .evict_inode = v9fs_evict_inode, |
297 | .show_options = generic_show_options, | 326 | .show_options = generic_show_options, |
298 | .umount_begin = v9fs_umount_begin, | 327 | .umount_begin = v9fs_umount_begin, |
@@ -303,5 +332,5 @@ struct file_system_type v9fs_fs_type = { | |||
303 | .mount = v9fs_mount, | 332 | .mount = v9fs_mount, |
304 | .kill_sb = v9fs_kill_super, | 333 | .kill_sb = v9fs_kill_super, |
305 | .owner = THIS_MODULE, | 334 | .owner = THIS_MODULE, |
306 | .fs_flags = FS_RENAME_DOES_D_MOVE, | 335 | .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT, |
307 | }; | 336 | }; |