diff options
-rw-r--r-- | fs/9p/v9fs_vfs.h | 2 | ||||
-rw-r--r-- | fs/9p/vfs_dir.c | 8 | ||||
-rw-r--r-- | fs/9p/vfs_file.c | 11 | ||||
-rw-r--r-- | fs/9p/vfs_inode.c | 71 | ||||
-rw-r--r-- | fs/9p/vfs_super.c | 18 |
5 files changed, 97 insertions, 13 deletions
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h index ed835836e0dc..32ef4009d030 100644 --- a/fs/9p/v9fs_vfs.h +++ b/fs/9p/v9fs_vfs.h | |||
@@ -40,7 +40,9 @@ | |||
40 | extern struct file_system_type v9fs_fs_type; | 40 | extern struct file_system_type v9fs_fs_type; |
41 | extern const struct address_space_operations v9fs_addr_operations; | 41 | extern const struct address_space_operations v9fs_addr_operations; |
42 | extern const struct file_operations v9fs_file_operations; | 42 | extern const struct file_operations v9fs_file_operations; |
43 | extern const struct file_operations v9fs_file_operations_dotl; | ||
43 | extern const struct file_operations v9fs_dir_operations; | 44 | extern const struct file_operations v9fs_dir_operations; |
45 | extern const struct file_operations v9fs_dir_operations_dotl; | ||
44 | extern const struct dentry_operations v9fs_dentry_operations; | 46 | extern const struct dentry_operations v9fs_dentry_operations; |
45 | extern const struct dentry_operations v9fs_cached_dentry_operations; | 47 | extern const struct dentry_operations v9fs_cached_dentry_operations; |
46 | 48 | ||
diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index 0adfd64dfcee..d61e3b28ce37 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c | |||
@@ -203,3 +203,11 @@ const struct file_operations v9fs_dir_operations = { | |||
203 | .open = v9fs_file_open, | 203 | .open = v9fs_file_open, |
204 | .release = v9fs_dir_release, | 204 | .release = v9fs_dir_release, |
205 | }; | 205 | }; |
206 | |||
207 | const struct file_operations v9fs_dir_operations_dotl = { | ||
208 | .read = generic_read_dir, | ||
209 | .llseek = generic_file_llseek, | ||
210 | .readdir = v9fs_dir_readdir, | ||
211 | .open = v9fs_file_open, | ||
212 | .release = v9fs_dir_release, | ||
213 | }; | ||
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index df52d488d2a6..25b300e1c9d7 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c | |||
@@ -296,3 +296,14 @@ const struct file_operations v9fs_file_operations = { | |||
296 | .mmap = generic_file_readonly_mmap, | 296 | .mmap = generic_file_readonly_mmap, |
297 | .fsync = v9fs_file_fsync, | 297 | .fsync = v9fs_file_fsync, |
298 | }; | 298 | }; |
299 | |||
300 | const struct file_operations v9fs_file_operations_dotl = { | ||
301 | .llseek = generic_file_llseek, | ||
302 | .read = v9fs_file_read, | ||
303 | .write = v9fs_file_write, | ||
304 | .open = v9fs_file_open, | ||
305 | .release = v9fs_dir_release, | ||
306 | .lock = v9fs_file_lock, | ||
307 | .mmap = generic_file_readonly_mmap, | ||
308 | .fsync = v9fs_file_fsync, | ||
309 | }; | ||
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index f2434fc9d2c4..13a8ed6088b8 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -44,9 +44,12 @@ | |||
44 | #include "cache.h" | 44 | #include "cache.h" |
45 | 45 | ||
46 | static const struct inode_operations v9fs_dir_inode_operations; | 46 | static const struct inode_operations v9fs_dir_inode_operations; |
47 | static const struct inode_operations v9fs_dir_inode_operations_ext; | 47 | static const struct inode_operations v9fs_dir_inode_operations_dotu; |
48 | static const struct inode_operations v9fs_dir_inode_operations_dotl; | ||
48 | static const struct inode_operations v9fs_file_inode_operations; | 49 | static const struct inode_operations v9fs_file_inode_operations; |
50 | static const struct inode_operations v9fs_file_inode_operations_dotl; | ||
49 | static const struct inode_operations v9fs_symlink_inode_operations; | 51 | static const struct inode_operations v9fs_symlink_inode_operations; |
52 | static const struct inode_operations v9fs_symlink_inode_operations_dotl; | ||
50 | 53 | ||
51 | /** | 54 | /** |
52 | * unixmode2p9mode - convert unix mode bits to plan 9 | 55 | * unixmode2p9mode - convert unix mode bits to plan 9 |
@@ -275,25 +278,44 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode) | |||
275 | init_special_inode(inode, inode->i_mode, inode->i_rdev); | 278 | init_special_inode(inode, inode->i_mode, inode->i_rdev); |
276 | break; | 279 | break; |
277 | case S_IFREG: | 280 | case S_IFREG: |
278 | inode->i_op = &v9fs_file_inode_operations; | 281 | if (v9fs_proto_dotl(v9ses)) { |
279 | inode->i_fop = &v9fs_file_operations; | 282 | inode->i_op = &v9fs_file_inode_operations_dotl; |
283 | inode->i_fop = &v9fs_file_operations_dotl; | ||
284 | } else { | ||
285 | inode->i_op = &v9fs_file_inode_operations; | ||
286 | inode->i_fop = &v9fs_file_operations; | ||
287 | } | ||
288 | |||
280 | break; | 289 | break; |
290 | |||
281 | case S_IFLNK: | 291 | case S_IFLNK: |
282 | if (!v9fs_proto_dotu(v9ses)) { | 292 | if (!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)) { |
283 | P9_DPRINTK(P9_DEBUG_ERROR, | 293 | P9_DPRINTK(P9_DEBUG_ERROR, "extended modes used with " |
284 | "extended modes used w/o 9P2000.u\n"); | 294 | "legacy protocol.\n"); |
285 | err = -EINVAL; | 295 | err = -EINVAL; |
286 | goto error; | 296 | goto error; |
287 | } | 297 | } |
288 | inode->i_op = &v9fs_symlink_inode_operations; | 298 | |
299 | if (v9fs_proto_dotl(v9ses)) | ||
300 | inode->i_op = &v9fs_symlink_inode_operations_dotl; | ||
301 | else | ||
302 | inode->i_op = &v9fs_symlink_inode_operations; | ||
303 | |||
289 | break; | 304 | break; |
290 | case S_IFDIR: | 305 | case S_IFDIR: |
291 | inc_nlink(inode); | 306 | inc_nlink(inode); |
292 | if (v9fs_proto_dotu(v9ses)) | 307 | if (v9fs_proto_dotl(v9ses)) |
293 | inode->i_op = &v9fs_dir_inode_operations_ext; | 308 | inode->i_op = &v9fs_dir_inode_operations_dotl; |
309 | else if (v9fs_proto_dotu(v9ses)) | ||
310 | inode->i_op = &v9fs_dir_inode_operations_dotu; | ||
294 | else | 311 | else |
295 | inode->i_op = &v9fs_dir_inode_operations; | 312 | inode->i_op = &v9fs_dir_inode_operations; |
296 | inode->i_fop = &v9fs_dir_operations; | 313 | |
314 | if (v9fs_proto_dotl(v9ses)) | ||
315 | inode->i_fop = &v9fs_dir_operations_dotl; | ||
316 | else | ||
317 | inode->i_fop = &v9fs_dir_operations; | ||
318 | |||
297 | break; | 319 | break; |
298 | default: | 320 | default: |
299 | P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n", | 321 | P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n", |
@@ -1208,7 +1230,21 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) | |||
1208 | return retval; | 1230 | return retval; |
1209 | } | 1231 | } |
1210 | 1232 | ||
1211 | static const struct inode_operations v9fs_dir_inode_operations_ext = { | 1233 | static const struct inode_operations v9fs_dir_inode_operations_dotu = { |
1234 | .create = v9fs_vfs_create, | ||
1235 | .lookup = v9fs_vfs_lookup, | ||
1236 | .symlink = v9fs_vfs_symlink, | ||
1237 | .link = v9fs_vfs_link, | ||
1238 | .unlink = v9fs_vfs_unlink, | ||
1239 | .mkdir = v9fs_vfs_mkdir, | ||
1240 | .rmdir = v9fs_vfs_rmdir, | ||
1241 | .mknod = v9fs_vfs_mknod, | ||
1242 | .rename = v9fs_vfs_rename, | ||
1243 | .getattr = v9fs_vfs_getattr, | ||
1244 | .setattr = v9fs_vfs_setattr, | ||
1245 | }; | ||
1246 | |||
1247 | static const struct inode_operations v9fs_dir_inode_operations_dotl = { | ||
1212 | .create = v9fs_vfs_create, | 1248 | .create = v9fs_vfs_create, |
1213 | .lookup = v9fs_vfs_lookup, | 1249 | .lookup = v9fs_vfs_lookup, |
1214 | .symlink = v9fs_vfs_symlink, | 1250 | .symlink = v9fs_vfs_symlink, |
@@ -1239,6 +1275,11 @@ static const struct inode_operations v9fs_file_inode_operations = { | |||
1239 | .setattr = v9fs_vfs_setattr, | 1275 | .setattr = v9fs_vfs_setattr, |
1240 | }; | 1276 | }; |
1241 | 1277 | ||
1278 | static const struct inode_operations v9fs_file_inode_operations_dotl = { | ||
1279 | .getattr = v9fs_vfs_getattr, | ||
1280 | .setattr = v9fs_vfs_setattr, | ||
1281 | }; | ||
1282 | |||
1242 | static const struct inode_operations v9fs_symlink_inode_operations = { | 1283 | static const struct inode_operations v9fs_symlink_inode_operations = { |
1243 | .readlink = generic_readlink, | 1284 | .readlink = generic_readlink, |
1244 | .follow_link = v9fs_vfs_follow_link, | 1285 | .follow_link = v9fs_vfs_follow_link, |
@@ -1246,3 +1287,11 @@ static const struct inode_operations v9fs_symlink_inode_operations = { | |||
1246 | .getattr = v9fs_vfs_getattr, | 1287 | .getattr = v9fs_vfs_getattr, |
1247 | .setattr = v9fs_vfs_setattr, | 1288 | .setattr = v9fs_vfs_setattr, |
1248 | }; | 1289 | }; |
1290 | |||
1291 | static const struct inode_operations v9fs_symlink_inode_operations_dotl = { | ||
1292 | .readlink = generic_readlink, | ||
1293 | .follow_link = v9fs_vfs_follow_link, | ||
1294 | .put_link = v9fs_vfs_put_link, | ||
1295 | .getattr = v9fs_vfs_getattr, | ||
1296 | .setattr = v9fs_vfs_setattr, | ||
1297 | }; | ||
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 806da5d3b3a0..cc3fa8c3aab6 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c | |||
@@ -45,7 +45,7 @@ | |||
45 | #include "v9fs_vfs.h" | 45 | #include "v9fs_vfs.h" |
46 | #include "fid.h" | 46 | #include "fid.h" |
47 | 47 | ||
48 | static const struct super_operations v9fs_super_ops; | 48 | static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl; |
49 | 49 | ||
50 | /** | 50 | /** |
51 | * v9fs_set_super - set the superblock | 51 | * v9fs_set_super - set the superblock |
@@ -76,7 +76,10 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, | |||
76 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); | 76 | sb->s_blocksize_bits = fls(v9ses->maxdata - 1); |
77 | sb->s_blocksize = 1 << sb->s_blocksize_bits; | 77 | sb->s_blocksize = 1 << sb->s_blocksize_bits; |
78 | sb->s_magic = V9FS_MAGIC; | 78 | sb->s_magic = V9FS_MAGIC; |
79 | sb->s_op = &v9fs_super_ops; | 79 | if (v9fs_proto_dotl(v9ses)) |
80 | sb->s_op = &v9fs_super_ops_dotl; | ||
81 | else | ||
82 | sb->s_op = &v9fs_super_ops; | ||
80 | sb->s_bdi = &v9ses->bdi; | 83 | sb->s_bdi = &v9ses->bdi; |
81 | 84 | ||
82 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | | 85 | sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC | |
@@ -222,6 +225,17 @@ static const struct super_operations v9fs_super_ops = { | |||
222 | .umount_begin = v9fs_umount_begin, | 225 | .umount_begin = v9fs_umount_begin, |
223 | }; | 226 | }; |
224 | 227 | ||
228 | static const struct super_operations v9fs_super_ops_dotl = { | ||
229 | #ifdef CONFIG_9P_FSCACHE | ||
230 | .alloc_inode = v9fs_alloc_inode, | ||
231 | .destroy_inode = v9fs_destroy_inode, | ||
232 | #endif | ||
233 | .statfs = simple_statfs, | ||
234 | .clear_inode = v9fs_clear_inode, | ||
235 | .show_options = generic_show_options, | ||
236 | .umount_begin = v9fs_umount_begin, | ||
237 | }; | ||
238 | |||
225 | struct file_system_type v9fs_fs_type = { | 239 | struct file_system_type v9fs_fs_type = { |
226 | .name = "9p", | 240 | .name = "9p", |
227 | .get_sb = v9fs_get_sb, | 241 | .get_sb = v9fs_get_sb, |