Blame view

fs/9p/vfs_super.c 6.84 KB
9e82cf6a8   Eric Van Hensbergen   [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   Eric Van Hensbergen   [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   Eric Van Hensbergen   [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   Eric Van Hensbergen   [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   Eric Van Hensbergen   [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   Alexey Dobriyan   Detach sched.h fr...
39
  #include <linux/sched.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
40
  #include <linux/slab.h>
bda8e7752   Sripathi Kodi   9p: add 9P2000.L ...
41
  #include <linux/statfs.h>
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
42
43
  #include <net/9p/9p.h>
  #include <net/9p/client.h>
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
44

9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
45
  #include "v9fs.h"
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
46
  #include "v9fs_vfs.h"
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
47
  #include "fid.h"
ebf46264a   Aneesh Kumar K.V   fs/9p: Add suppor...
48
  #include "xattr.h"
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
49

9b6533c9b   Sripathi Kodi   9p: VFS switches ...
50
  static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
51
52
  
  /**
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
   * 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
ee443996a   Eric Van Hensbergen   9p: Documentation...
69
   * @flags: flags propagated from v9fs_get_sb()
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
70
71
72
73
74
   *
   */
  
  static void
  v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
4b53e4b50   Abhishek Kulkarni   9p: remove unnece...
75
  		int flags, void *data)
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
76
77
78
79
80
  {
  	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   Aneesh Kumar K.V   fs/9p: Add suppor...
81
  	if (v9fs_proto_dotl(v9ses)) {
9b6533c9b   Sripathi Kodi   9p: VFS switches ...
82
  		sb->s_op = &v9fs_super_ops_dotl;
ebf46264a   Aneesh Kumar K.V   fs/9p: Add suppor...
83
84
  		sb->s_xattr = v9fs_xattr_handlers;
  	} else
9b6533c9b   Sripathi Kodi   9p: VFS switches ...
85
  		sb->s_op = &v9fs_super_ops;
0ed07ddb5   Jens Axboe   9p: add bdi backi...
86
  	sb->s_bdi = &v9ses->bdi;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
87
88
  
  	sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC |
0d456fa42   Christoph Hellwig   [PATCH] 9p: remov...
89
  	    MS_NOATIME;
4b53e4b50   Abhishek Kulkarni   9p: remove unnece...
90
91
  
  	save_mount_options(sb, data);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
92
93
94
95
96
97
98
99
  }
  
  /**
   * v9fs_get_sb - mount a superblock
   * @fs_type: file system type
   * @flags: mount flags
   * @dev_name: device name that was mounted
   * @data: mount options
454e2398b   David Howells   [PATCH] VFS: Perm...
100
   * @mnt: mountpoint record to be instantiated
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
101
102
   *
   */
454e2398b   David Howells   [PATCH] VFS: Perm...
103
104
105
  static int v9fs_get_sb(struct file_system_type *fs_type, int flags,
  		       const char *dev_name, void *data,
  		       struct vfsmount *mnt)
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
106
107
  {
  	struct super_block *sb = NULL;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
108
109
110
  	struct inode *inode = NULL;
  	struct dentry *root = NULL;
  	struct v9fs_session_info *v9ses = NULL;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
111
  	int mode = S_IRWXUGO | S_ISVTX;
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
112
  	struct p9_fid *fid;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
113
  	int retval = 0;
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
114
115
  	P9_DPRINTK(P9_DEBUG_VFS, " 
  ");
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
116

1dac06b20   Latchesar Ionkov   [PATCH] v9fs: han...
117
  	v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
118
  	if (!v9ses)
454e2398b   David Howells   [PATCH] VFS: Perm...
119
  		return -ENOMEM;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
120

bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
121
122
123
  	fid = v9fs_session_init(v9ses, dev_name, data);
  	if (IS_ERR(fid)) {
  		retval = PTR_ERR(fid);
5c25f347a   Aneesh Kumar K.V   fs/9p: Fix error ...
124
125
126
127
  		/*
  		 * we need to call session_close to tear down some
  		 * of the data structure setup by session_init
  		 */
887b3ece6   Eric Van Hensbergen   9p: fix error pat...
128
  		goto close_session;
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
129
  	}
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
130
  	sb = sget(fs_type, NULL, v9fs_set_super, v9ses);
454e2398b   David Howells   [PATCH] VFS: Perm...
131
132
  	if (IS_ERR(sb)) {
  		retval = PTR_ERR(sb);
f08531220   Sripathi Kodi   9p: getattr clien...
133
  		goto clunk_fid;
454e2398b   David Howells   [PATCH] VFS: Perm...
134
  	}
4b53e4b50   Abhishek Kulkarni   9p: remove unnece...
135
  	v9fs_fill_super(sb, v9ses, flags, data);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
136
137
138
139
  
  	inode = v9fs_get_inode(sb, S_IFDIR | mode);
  	if (IS_ERR(inode)) {
  		retval = PTR_ERR(inode);
887b3ece6   Eric Van Hensbergen   9p: fix error pat...
140
  		goto release_sb;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
141
  	}
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
142
  	root = d_alloc_root(inode);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
143
  	if (!root) {
c96f58573   Al Viro   Fix a leak in fai...
144
  		iput(inode);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
145
  		retval = -ENOMEM;
887b3ece6   Eric Van Hensbergen   9p: fix error pat...
146
  		goto release_sb;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
147
  	}
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
148
  	sb->s_root = root;
51a87c552   Eric Van Hensbergen   9p: rework client...
149

f08531220   Sripathi Kodi   9p: getattr clien...
150
151
152
153
154
  	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   Aneesh Kumar K.V   fs/9p: Fix error ...
155
  			goto release_sb;
f08531220   Sripathi Kodi   9p: getattr clien...
156
157
158
159
160
161
162
163
164
  		}
  
  		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   Aneesh Kumar K.V   fs/9p: Fix error ...
165
  			goto release_sb;
f08531220   Sripathi Kodi   9p: getattr clien...
166
167
168
169
170
171
172
173
  		}
  
  		root->d_inode->i_ino = v9fs_qid2ino(&st->qid);
  		v9fs_stat2inode(st, root->d_inode, sb);
  
  		p9stat_free(st);
  		kfree(st);
  	}
51a87c552   Eric Van Hensbergen   9p: rework client...
174

bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
175
  	v9fs_fid_add(root, fid);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
176

5c25f347a   Aneesh Kumar K.V   fs/9p: Fix error ...
177
178
  	P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0
  ");
a3ec947c8   Sukadev Bhattiprolu   vfs: simple_set_m...
179
180
  	simple_set_mnt(mnt, sb);
  	return 0;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
181

887b3ece6   Eric Van Hensbergen   9p: fix error pat...
182
183
  clunk_fid:
  	p9_client_clunk(fid);
887b3ece6   Eric Van Hensbergen   9p: fix error pat...
184
185
186
  close_session:
  	v9fs_session_close(v9ses);
  	kfree(v9ses);
1b5ab3e86   Abhishek Kulkarni   9p: Fix possible ...
187
  	return retval;
1b5ab3e86   Abhishek Kulkarni   9p: Fix possible ...
188
  release_sb:
5c25f347a   Aneesh Kumar K.V   fs/9p: Fix error ...
189
190
191
192
193
194
195
  	/*
  	 * 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.
  	 */
  	p9_client_clunk(fid);
1b5ab3e86   Abhishek Kulkarni   9p: Fix possible ...
196
  	deactivate_locked_super(sb);
454e2398b   David Howells   [PATCH] VFS: Perm...
197
  	return retval;
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
198
199
200
201
202
203
204
205
206
207
208
  }
  
  /**
   * 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;
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
209
210
  	P9_DPRINTK(P9_DEBUG_VFS, " %p
  ", s);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
211

083c73c25   Al Viro   fix oops in fs/9p...
212
213
  	if (s->s_root)
  		v9fs_dentry_release(s->s_root);	/* clunk root */
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
214
215
  
  	kill_anon_super(s);
6d96d3ab7   Aneesh Kumar K.V   9p: Make sure we ...
216
  	v9fs_session_cancel(v9ses);
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
217
218
  	v9fs_session_close(v9ses);
  	kfree(v9ses);
1b5ab3e86   Abhishek Kulkarni   9p: Fix possible ...
219
  	s->s_fs_info = NULL;
bd238fb43   Latchesar Ionkov   9p: Reorganizatio...
220
221
  	P9_DPRINTK(P9_DEBUG_VFS, "exiting kill_super
  ");
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
222
  }
322b329ab   Eric Van Hensbergen   [PATCH] v9fs: Sup...
223
  static void
42faad996   Al Viro   [PATCH] restore s...
224
  v9fs_umount_begin(struct super_block *sb)
322b329ab   Eric Van Hensbergen   [PATCH] v9fs: Sup...
225
  {
67e55205e   Alessio Igor Bogani   vfs: umount_begin...
226
  	struct v9fs_session_info *v9ses;
322b329ab   Eric Van Hensbergen   [PATCH] v9fs: Sup...
227

67e55205e   Alessio Igor Bogani   vfs: umount_begin...
228
  	v9ses = sb->s_fs_info;
6d96d3ab7   Aneesh Kumar K.V   9p: Make sure we ...
229
  	v9fs_session_begin_cancel(v9ses);
322b329ab   Eric Van Hensbergen   [PATCH] v9fs: Sup...
230
  }
bda8e7752   Sripathi Kodi   9p: add 9P2000.L ...
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  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;
  }
ee9b6d61a   Josef 'Jeff' Sipek   [PATCH] Mark stru...
266
  static const struct super_operations v9fs_super_ops = {
60e78d2c9   Abhishek Kulkarni   9p: Add fscache s...
267
268
269
270
  #ifdef CONFIG_9P_FSCACHE
  	.alloc_inode = v9fs_alloc_inode,
  	.destroy_inode = v9fs_destroy_inode,
  #endif
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
271
  	.statfs = simple_statfs,
b57922d97   Al Viro   convert remaining...
272
  	.evict_inode = v9fs_evict_inode,
4b53e4b50   Abhishek Kulkarni   9p: remove unnece...
273
  	.show_options = generic_show_options,
322b329ab   Eric Van Hensbergen   [PATCH] v9fs: Sup...
274
  	.umount_begin = v9fs_umount_begin,
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
275
  };
9b6533c9b   Sripathi Kodi   9p: VFS switches ...
276
277
278
279
280
  static const struct super_operations v9fs_super_ops_dotl = {
  #ifdef CONFIG_9P_FSCACHE
  	.alloc_inode = v9fs_alloc_inode,
  	.destroy_inode = v9fs_destroy_inode,
  #endif
bda8e7752   Sripathi Kodi   9p: add 9P2000.L ...
281
  	.statfs = v9fs_statfs,
b57922d97   Al Viro   convert remaining...
282
  	.evict_inode = v9fs_evict_inode,
9b6533c9b   Sripathi Kodi   9p: VFS switches ...
283
284
285
  	.show_options = generic_show_options,
  	.umount_begin = v9fs_umount_begin,
  };
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
286
  struct file_system_type v9fs_fs_type = {
67543e508   Eric Van Hensbergen   [PATCH] 9p: fix n...
287
  	.name = "9p",
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
288
289
290
  	.get_sb = v9fs_get_sb,
  	.kill_sb = v9fs_kill_super,
  	.owner = THIS_MODULE,
a534c8d15   Aneesh Kumar K.V   fs/9p: Prevent pa...
291
  	.fs_flags = FS_RENAME_DOES_D_MOVE,
9e82cf6a8   Eric Van Hensbergen   [PATCH] v9fs: VFS...
292
  };