diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/inode.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 648f593de0fe..550a84dd41a2 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -2444,6 +2444,20 @@ static struct file_system_type clone_nfs4_fs_type = { | |||
2444 | .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, | 2444 | .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, |
2445 | }; | 2445 | }; |
2446 | 2446 | ||
2447 | static struct vfsmount *nfs_do_clone_mount(struct nfs_server *server, char *devname, struct nfs_clone_mount *mountdata) | ||
2448 | { | ||
2449 | struct vfsmount *mnt = NULL; | ||
2450 | switch (server->rpc_ops->version) { | ||
2451 | case 2: | ||
2452 | case 3: | ||
2453 | mnt = vfs_kern_mount(&clone_nfs_fs_type, 0, devname, &mountdata); | ||
2454 | break; | ||
2455 | case 4: | ||
2456 | mnt = vfs_kern_mount(&clone_nfs4_fs_type, 0, devname, mountdata); | ||
2457 | } | ||
2458 | return mnt; | ||
2459 | } | ||
2460 | |||
2447 | #define nfs4_init_once(nfsi) \ | 2461 | #define nfs4_init_once(nfsi) \ |
2448 | do { \ | 2462 | do { \ |
2449 | INIT_LIST_HEAD(&(nfsi)->open_states); \ | 2463 | INIT_LIST_HEAD(&(nfsi)->open_states); \ |
@@ -2477,6 +2491,10 @@ static inline void unregister_nfs4fs(void) | |||
2477 | do { } while (0) | 2491 | do { } while (0) |
2478 | #define register_nfs4fs() (0) | 2492 | #define register_nfs4fs() (0) |
2479 | #define unregister_nfs4fs() | 2493 | #define unregister_nfs4fs() |
2494 | static struct vfsmount *nfs_do_clone_mount(struct nfs_server *server, char *devname, struct nfs_clone_mount *mountdata) | ||
2495 | { | ||
2496 | return vfs_kern_mount(&clone_nfs_fs_type, 0, devname, &mountdata); | ||
2497 | } | ||
2480 | #endif | 2498 | #endif |
2481 | 2499 | ||
2482 | static inline char *nfs_devname(const struct vfsmount *mnt_parent, | 2500 | static inline char *nfs_devname(const struct vfsmount *mnt_parent, |
@@ -2517,17 +2535,7 @@ struct vfsmount *nfs_do_submount(const struct vfsmount *mnt_parent, | |||
2517 | mnt = (struct vfsmount *)devname; | 2535 | mnt = (struct vfsmount *)devname; |
2518 | if (IS_ERR(devname)) | 2536 | if (IS_ERR(devname)) |
2519 | goto free_page; | 2537 | goto free_page; |
2520 | switch (NFS_SB(mnt_parent->mnt_sb)->rpc_ops->version) { | 2538 | mnt = nfs_do_clone_mount(NFS_SB(mnt_parent->mnt_sb), devname, &mountdata); |
2521 | case 2: | ||
2522 | case 3: | ||
2523 | mnt = vfs_kern_mount(&clone_nfs_fs_type, 0, devname, &mountdata); | ||
2524 | break; | ||
2525 | case 4: | ||
2526 | mnt = vfs_kern_mount(&clone_nfs4_fs_type, 0, devname, &mountdata); | ||
2527 | break; | ||
2528 | default: | ||
2529 | BUG(); | ||
2530 | } | ||
2531 | free_page: | 2539 | free_page: |
2532 | free_page((unsigned long)page); | 2540 | free_page((unsigned long)page); |
2533 | out: | 2541 | out: |
@@ -2535,6 +2543,7 @@ out: | |||
2535 | return mnt; | 2543 | return mnt; |
2536 | } | 2544 | } |
2537 | 2545 | ||
2546 | #ifdef CONFIG_NFS_V4 | ||
2538 | /* Check if fs_root is valid */ | 2547 | /* Check if fs_root is valid */ |
2539 | static inline char *nfs4_pathname_string(struct nfs4_pathname *pathname, char *buffer, ssize_t buflen) | 2548 | static inline char *nfs4_pathname_string(struct nfs4_pathname *pathname, char *buffer, ssize_t buflen) |
2540 | { | 2549 | { |
@@ -2789,6 +2798,12 @@ out: | |||
2789 | dprintk("%s: done\n", __FUNCTION__); | 2798 | dprintk("%s: done\n", __FUNCTION__); |
2790 | return mnt; | 2799 | return mnt; |
2791 | } | 2800 | } |
2801 | #else | ||
2802 | struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry) | ||
2803 | { | ||
2804 | return ERR_PTR(-ENOENT); | ||
2805 | } | ||
2806 | #endif | ||
2792 | 2807 | ||
2793 | extern int nfs_init_nfspagecache(void); | 2808 | extern int nfs_init_nfspagecache(void); |
2794 | extern void nfs_destroy_nfspagecache(void); | 2809 | extern void nfs_destroy_nfspagecache(void); |