Blame view
fs/9p/vfs_super.c
8.59 KB
9e82cf6a8 [PATCH] v9fs: VFS... |
1 2 3 4 5 6 7 8 9 10 |
/* * linux/fs/9p/vfs_super.c * * This file contians superblock ops for 9P2000. It is intended that * you mount this file system on directories. * * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> * * This program is free software; you can redistribute it and/or modify |
42e8c509c [PATCH] v9fs: upd... |
11 12 |
* it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. |
9e82cf6a8 [PATCH] v9fs: VFS... |
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to: * Free Software Foundation * 51 Franklin Street, Fifth Floor * Boston, MA 02111-1301 USA * */ #include <linux/kernel.h> |
9e82cf6a8 [PATCH] v9fs: VFS... |
28 29 30 31 32 33 |
#include <linux/module.h> #include <linux/errno.h> #include <linux/fs.h> #include <linux/file.h> #include <linux/stat.h> #include <linux/string.h> |
9e82cf6a8 [PATCH] v9fs: VFS... |
34 35 36 37 38 |
#include <linux/inet.h> #include <linux/pagemap.h> #include <linux/seq_file.h> #include <linux/mount.h> #include <linux/idr.h> |
e8edc6e03 Detach sched.h fr... |
39 |
#include <linux/sched.h> |
5a0e3ad6a include cleanup: ... |
40 |
#include <linux/slab.h> |
bda8e7752 9p: add 9P2000.L ... |
41 |
#include <linux/statfs.h> |
368c09d2a 9p: Use V9FS_MAGI... |
42 |
#include <linux/magic.h> |
bd238fb43 9p: Reorganizatio... |
43 44 |
#include <net/9p/9p.h> #include <net/9p/client.h> |
9e82cf6a8 [PATCH] v9fs: VFS... |
45 |
|
9e82cf6a8 [PATCH] v9fs: VFS... |
46 |
#include "v9fs.h" |
9e82cf6a8 [PATCH] v9fs: VFS... |
47 |
#include "v9fs_vfs.h" |
9e82cf6a8 [PATCH] v9fs: VFS... |
48 |
#include "fid.h" |
ebf46264a fs/9p: Add suppor... |
49 |
#include "xattr.h" |
85ff872d3 fs/9p: Implement ... |
50 |
#include "acl.h" |
9e82cf6a8 [PATCH] v9fs: VFS... |
51 |
|
9b6533c9b 9p: VFS switches ... |
52 |
static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl; |
9e82cf6a8 [PATCH] v9fs: VFS... |
53 54 |
/** |
9e82cf6a8 [PATCH] v9fs: VFS... |
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
* v9fs_set_super - set the superblock * @s: super block * @data: file system specific data * */ static int v9fs_set_super(struct super_block *s, void *data) { s->s_fs_info = data; return set_anon_super(s, data); } /** * v9fs_fill_super - populate superblock with info * @sb: superblock * @v9ses: session information |
d2d1ea930 convert v9fs |
71 |
* @flags: flags propagated from v9fs_mount() |
9e82cf6a8 [PATCH] v9fs: VFS... |
72 73 74 75 76 |
* */ static void v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, |
4b53e4b50 9p: remove unnece... |
77 |
int flags, void *data) |
9e82cf6a8 [PATCH] v9fs: VFS... |
78 79 80 81 82 |
{ sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_blocksize_bits = fls(v9ses->maxdata - 1); sb->s_blocksize = 1 << sb->s_blocksize_bits; sb->s_magic = V9FS_MAGIC; |
ebf46264a fs/9p: Add suppor... |
83 |
if (v9fs_proto_dotl(v9ses)) { |
9b6533c9b 9p: VFS switches ... |
84 |
sb->s_op = &v9fs_super_ops_dotl; |
ebf46264a fs/9p: Add suppor... |
85 86 |
sb->s_xattr = v9fs_xattr_handlers; } else |
9b6533c9b 9p: VFS switches ... |
87 |
sb->s_op = &v9fs_super_ops; |
0ed07ddb5 9p: add bdi backi... |
88 |
sb->s_bdi = &v9ses->bdi; |
6b365604c fs/9p: set defaul... |
89 90 |
if (v9ses->cache) sb->s_bdi->ra_pages = (VM_MAX_READAHEAD * 1024)/PAGE_CACHE_SIZE; |
9e82cf6a8 [PATCH] v9fs: VFS... |
91 |
|
db5841d4a fs/9p: Mark file ... |
92 93 94 |
sb->s_flags = flags | MS_ACTIVE | MS_DIRSYNC | MS_NOATIME; if (!v9ses->cache) sb->s_flags |= MS_SYNCHRONOUS; |
4b53e4b50 9p: remove unnece... |
95 |
|
85ff872d3 fs/9p: Implement ... |
96 |
#ifdef CONFIG_9P_FS_POSIX_ACL |
e782ef710 [fs/9P] Add posix... |
97 |
if ((v9ses->flags & V9FS_ACL_MASK) == V9FS_POSIX_ACL) |
76381a42e fs/9p: Add access... |
98 |
sb->s_flags |= MS_POSIXACL; |
85ff872d3 fs/9p: Implement ... |
99 |
#endif |
4b53e4b50 9p: remove unnece... |
100 |
save_mount_options(sb, data); |
9e82cf6a8 [PATCH] v9fs: VFS... |
101 102 103 |
} /** |
d2d1ea930 convert v9fs |
104 |
* v9fs_mount - mount a superblock |
9e82cf6a8 [PATCH] v9fs: VFS... |
105 106 107 108 109 110 |
* @fs_type: file system type * @flags: mount flags * @dev_name: device name that was mounted * @data: mount options * */ |
d2d1ea930 convert v9fs |
111 112 |
static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) |
9e82cf6a8 [PATCH] v9fs: VFS... |
113 114 |
{ struct super_block *sb = NULL; |
9e82cf6a8 [PATCH] v9fs: VFS... |
115 116 117 |
struct inode *inode = NULL; struct dentry *root = NULL; struct v9fs_session_info *v9ses = NULL; |
3eda0de67 9p: propagate umo... |
118 |
umode_t mode = S_IRWXUGO | S_ISVTX; |
bd238fb43 9p: Reorganizatio... |
119 |
struct p9_fid *fid; |
9e82cf6a8 [PATCH] v9fs: VFS... |
120 |
int retval = 0; |
5d3851530 9p: Reduce object... |
121 122 |
p9_debug(P9_DEBUG_VFS, " "); |
9e82cf6a8 [PATCH] v9fs: VFS... |
123 |
|
1dac06b20 [PATCH] v9fs: han... |
124 |
v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); |
9e82cf6a8 [PATCH] v9fs: VFS... |
125 |
if (!v9ses) |
d2d1ea930 convert v9fs |
126 |
return ERR_PTR(-ENOMEM); |
9e82cf6a8 [PATCH] v9fs: VFS... |
127 |
|
bd238fb43 9p: Reorganizatio... |
128 129 130 |
fid = v9fs_session_init(v9ses, dev_name, data); if (IS_ERR(fid)) { retval = PTR_ERR(fid); |
5c25f347a fs/9p: Fix error ... |
131 132 133 134 |
/* * we need to call session_close to tear down some * of the data structure setup by session_init */ |
887b3ece6 9p: fix error pat... |
135 |
goto close_session; |
bd238fb43 9p: Reorganizatio... |
136 |
} |
9e82cf6a8 [PATCH] v9fs: VFS... |
137 |
sb = sget(fs_type, NULL, v9fs_set_super, v9ses); |
454e2398b [PATCH] VFS: Perm... |
138 139 |
if (IS_ERR(sb)) { retval = PTR_ERR(sb); |
f08531220 9p: getattr clien... |
140 |
goto clunk_fid; |
454e2398b [PATCH] VFS: Perm... |
141 |
} |
4b53e4b50 9p: remove unnece... |
142 |
v9fs_fill_super(sb, v9ses, flags, data); |
9e82cf6a8 [PATCH] v9fs: VFS... |
143 |
|
98cd3fb0a switch 9p |
144 145 146 147 |
if (v9ses->cache) sb->s_d_op = &v9fs_cached_dentry_operations; else sb->s_d_op = &v9fs_dentry_operations; |
45089142b fs/9p: Don't upda... |
148 |
inode = v9fs_get_inode(sb, S_IFDIR | mode, 0); |
9e82cf6a8 [PATCH] v9fs: VFS... |
149 150 |
if (IS_ERR(inode)) { retval = PTR_ERR(inode); |
887b3ece6 9p: fix error pat... |
151 |
goto release_sb; |
9e82cf6a8 [PATCH] v9fs: VFS... |
152 |
} |
df5d8c80f 9p: revert tsyncf... |
153 |
|
9e82cf6a8 [PATCH] v9fs: VFS... |
154 |
root = d_alloc_root(inode); |
9e82cf6a8 [PATCH] v9fs: VFS... |
155 |
if (!root) { |
c96f58573 Fix a leak in fai... |
156 |
iput(inode); |
9e82cf6a8 [PATCH] v9fs: VFS... |
157 |
retval = -ENOMEM; |
887b3ece6 9p: fix error pat... |
158 |
goto release_sb; |
9e82cf6a8 [PATCH] v9fs: VFS... |
159 |
} |
9e82cf6a8 [PATCH] v9fs: VFS... |
160 |
sb->s_root = root; |
f08531220 9p: getattr clien... |
161 162 163 164 165 |
if (v9fs_proto_dotl(v9ses)) { struct p9_stat_dotl *st = NULL; st = p9_client_getattr_dotl(fid, P9_STATS_BASIC); if (IS_ERR(st)) { retval = PTR_ERR(st); |
5c25f347a fs/9p: Fix error ... |
166 |
goto release_sb; |
f08531220 9p: getattr clien... |
167 |
} |
0e432703a fs/9p: Initialize... |
168 |
root->d_inode->i_ino = v9fs_qid2ino(&st->qid); |
f08531220 9p: getattr clien... |
169 170 171 172 173 174 175 |
v9fs_stat2inode_dotl(st, root->d_inode); kfree(st); } else { struct p9_wstat *st = NULL; st = p9_client_stat(fid); if (IS_ERR(st)) { retval = PTR_ERR(st); |
5c25f347a fs/9p: Fix error ... |
176 |
goto release_sb; |
f08531220 9p: getattr clien... |
177 178 179 180 181 182 183 184 |
} root->d_inode->i_ino = v9fs_qid2ino(&st->qid); v9fs_stat2inode(st, root->d_inode, sb); p9stat_free(st); kfree(st); } |
85ff872d3 fs/9p: Implement ... |
185 186 187 |
retval = v9fs_get_acl(inode, fid); if (retval) goto release_sb; |
df5d8c80f 9p: revert tsyncf... |
188 |
v9fs_fid_add(root, fid); |
9e82cf6a8 [PATCH] v9fs: VFS... |
189 |
|
5d3851530 9p: Reduce object... |
190 191 |
p9_debug(P9_DEBUG_VFS, " simple set mount, return 0 "); |
d2d1ea930 convert v9fs |
192 |
return dget(sb->s_root); |
9e82cf6a8 [PATCH] v9fs: VFS... |
193 |
|
887b3ece6 9p: fix error pat... |
194 195 |
clunk_fid: p9_client_clunk(fid); |
887b3ece6 9p: fix error pat... |
196 197 198 |
close_session: v9fs_session_close(v9ses); kfree(v9ses); |
d2d1ea930 convert v9fs |
199 |
return ERR_PTR(retval); |
df5d8c80f 9p: revert tsyncf... |
200 |
|
1b5ab3e86 9p: Fix possible ... |
201 |
release_sb: |
5c25f347a fs/9p: Fix error ... |
202 |
/* |
df5d8c80f 9p: revert tsyncf... |
203 204 205 206 |
* 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. |
5c25f347a fs/9p: Fix error ... |
207 |
*/ |
df5d8c80f 9p: revert tsyncf... |
208 |
p9_client_clunk(fid); |
1b5ab3e86 9p: Fix possible ... |
209 |
deactivate_locked_super(sb); |
d2d1ea930 convert v9fs |
210 |
return ERR_PTR(retval); |
9e82cf6a8 [PATCH] v9fs: VFS... |
211 212 213 214 215 216 217 218 219 220 221 |
} /** * v9fs_kill_super - Kill Superblock * @s: superblock * */ static void v9fs_kill_super(struct super_block *s) { struct v9fs_session_info *v9ses = s->s_fs_info; |
5d3851530 9p: Reduce object... |
222 223 |
p9_debug(P9_DEBUG_VFS, " %p ", s); |
9e82cf6a8 [PATCH] v9fs: VFS... |
224 |
|
9e82cf6a8 [PATCH] v9fs: VFS... |
225 |
kill_anon_super(s); |
df5d8c80f 9p: revert tsyncf... |
226 |
|
6d96d3ab7 9p: Make sure we ... |
227 |
v9fs_session_cancel(v9ses); |
9e82cf6a8 [PATCH] v9fs: VFS... |
228 229 |
v9fs_session_close(v9ses); kfree(v9ses); |
1b5ab3e86 9p: Fix possible ... |
230 |
s->s_fs_info = NULL; |
5d3851530 9p: Reduce object... |
231 232 |
p9_debug(P9_DEBUG_VFS, "exiting kill_super "); |
9e82cf6a8 [PATCH] v9fs: VFS... |
233 |
} |
322b329ab [PATCH] v9fs: Sup... |
234 |
static void |
42faad996 [PATCH] restore s... |
235 |
v9fs_umount_begin(struct super_block *sb) |
322b329ab [PATCH] v9fs: Sup... |
236 |
{ |
67e55205e vfs: umount_begin... |
237 |
struct v9fs_session_info *v9ses; |
322b329ab [PATCH] v9fs: Sup... |
238 |
|
67e55205e vfs: umount_begin... |
239 |
v9ses = sb->s_fs_info; |
6d96d3ab7 9p: Make sure we ... |
240 |
v9fs_session_begin_cancel(v9ses); |
322b329ab [PATCH] v9fs: Sup... |
241 |
} |
bda8e7752 9p: add 9P2000.L ... |
242 243 244 245 246 247 248 249 250 251 252 253 |
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; } |
42869c8ad fs/9p: Add v9fs_d... |
254 |
v9ses = v9fs_dentry2v9ses(dentry); |
bda8e7752 9p: add 9P2000.L ... |
255 256 257 |
if (v9fs_proto_dotl(v9ses)) { res = p9_client_statfs(fid, &rs); if (res == 0) { |
368c09d2a 9p: Use V9FS_MAGI... |
258 |
buf->f_type = V9FS_MAGIC; |
bda8e7752 9p: add 9P2000.L ... |
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
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; } |
edd73cf54 fs/9p: Add drop_i... |
276 277 278 279 280 281 282 283 284 285 286 287 288 |
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; } |
c2ed38802 fs/9p: Use write_... |
289 290 291 292 293 294 295 296 297 298 |
static int v9fs_write_inode(struct inode *inode, struct writeback_control *wbc) { int ret; struct p9_wstat wstat; struct v9fs_inode *v9inode; /* * send an fsync request to server irrespective of * wbc->sync_mode. */ |
5d3851530 9p: Reduce object... |
299 300 |
p9_debug(P9_DEBUG_VFS, "%s: inode %p ", __func__, inode); |
c2ed38802 fs/9p: Use write_... |
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 |
v9inode = V9FS_I(inode); if (!v9inode->writeback_fid) return 0; v9fs_blank_wstat(&wstat); ret = p9_client_wstat(v9inode->writeback_fid, &wstat); if (ret < 0) { __mark_inode_dirty(inode, I_DIRTY_DATASYNC); return ret; } return 0; } static int v9fs_write_inode_dotl(struct inode *inode, struct writeback_control *wbc) { int ret; struct v9fs_inode *v9inode; /* * send an fsync request to server irrespective of * wbc->sync_mode. */ |
5d3851530 9p: Reduce object... |
323 324 |
p9_debug(P9_DEBUG_VFS, "%s: inode %p ", __func__, inode); |
c2ed38802 fs/9p: Use write_... |
325 326 327 328 329 330 331 332 333 334 |
v9inode = V9FS_I(inode); if (!v9inode->writeback_fid) return 0; ret = p9_client_fsync(v9inode->writeback_fid, 0); if (ret < 0) { __mark_inode_dirty(inode, I_DIRTY_DATASYNC); return ret; } return 0; } |
ee9b6d61a [PATCH] Mark stru... |
335 |
static const struct super_operations v9fs_super_ops = { |
60e78d2c9 9p: Add fscache s... |
336 337 |
.alloc_inode = v9fs_alloc_inode, .destroy_inode = v9fs_destroy_inode, |
9e82cf6a8 [PATCH] v9fs: VFS... |
338 |
.statfs = simple_statfs, |
b57922d97 convert remaining... |
339 |
.evict_inode = v9fs_evict_inode, |
4b53e4b50 9p: remove unnece... |
340 |
.show_options = generic_show_options, |
322b329ab [PATCH] v9fs: Sup... |
341 |
.umount_begin = v9fs_umount_begin, |
c2ed38802 fs/9p: Use write_... |
342 |
.write_inode = v9fs_write_inode, |
9e82cf6a8 [PATCH] v9fs: VFS... |
343 |
}; |
9b6533c9b 9p: VFS switches ... |
344 |
static const struct super_operations v9fs_super_ops_dotl = { |
9b6533c9b 9p: VFS switches ... |
345 346 |
.alloc_inode = v9fs_alloc_inode, .destroy_inode = v9fs_destroy_inode, |
bda8e7752 9p: add 9P2000.L ... |
347 |
.statfs = v9fs_statfs, |
edd73cf54 fs/9p: Add drop_i... |
348 |
.drop_inode = v9fs_drop_inode, |
b57922d97 convert remaining... |
349 |
.evict_inode = v9fs_evict_inode, |
9b6533c9b 9p: VFS switches ... |
350 351 |
.show_options = generic_show_options, .umount_begin = v9fs_umount_begin, |
c2ed38802 fs/9p: Use write_... |
352 |
.write_inode = v9fs_write_inode_dotl, |
9b6533c9b 9p: VFS switches ... |
353 |
}; |
9e82cf6a8 [PATCH] v9fs: VFS... |
354 |
struct file_system_type v9fs_fs_type = { |
67543e508 [PATCH] 9p: fix n... |
355 |
.name = "9p", |
d2d1ea930 convert v9fs |
356 |
.mount = v9fs_mount, |
9e82cf6a8 [PATCH] v9fs: VFS... |
357 358 |
.kill_sb = v9fs_kill_super, .owner = THIS_MODULE, |
823fcfd42 fs/9p: Add . and ... |
359 |
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT, |
9e82cf6a8 [PATCH] v9fs: VFS... |
360 |
}; |