diff options
-rw-r--r-- | net/sunrpc/rpc_pipe.c | 78 |
1 files changed, 50 insertions, 28 deletions
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 1613d858ba38..57e9cd3c49b6 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -406,19 +406,6 @@ struct rpc_filelist { | |||
406 | umode_t mode; | 406 | umode_t mode; |
407 | }; | 407 | }; |
408 | 408 | ||
409 | enum { | ||
410 | RPCAUTH_info, | ||
411 | RPCAUTH_EOF | ||
412 | }; | ||
413 | |||
414 | static const struct rpc_filelist authfiles[] = { | ||
415 | [RPCAUTH_info] = { | ||
416 | .name = "info", | ||
417 | .i_fop = &rpc_info_operations, | ||
418 | .mode = S_IFREG | S_IRUSR, | ||
419 | }, | ||
420 | }; | ||
421 | |||
422 | struct vfsmount *rpc_get_mount(void) | 409 | struct vfsmount *rpc_get_mount(void) |
423 | { | 410 | { |
424 | int err; | 411 | int err; |
@@ -698,8 +685,9 @@ out_bad: | |||
698 | return err; | 685 | return err; |
699 | } | 686 | } |
700 | 687 | ||
701 | struct dentry *rpc_mkdir_populate(struct dentry *parent, | 688 | static struct dentry *rpc_mkdir_populate(struct dentry *parent, |
702 | struct qstr *name, umode_t mode, void *private) | 689 | struct qstr *name, umode_t mode, void *private, |
690 | int (*populate)(struct dentry *, void *), void *args_populate) | ||
703 | { | 691 | { |
704 | struct dentry *dentry; | 692 | struct dentry *dentry; |
705 | struct inode *dir = parent->d_inode; | 693 | struct inode *dir = parent->d_inode; |
@@ -712,10 +700,11 @@ struct dentry *rpc_mkdir_populate(struct dentry *parent, | |||
712 | error = __rpc_mkdir(dir, dentry, mode, NULL, private); | 700 | error = __rpc_mkdir(dir, dentry, mode, NULL, private); |
713 | if (error != 0) | 701 | if (error != 0) |
714 | goto out_err; | 702 | goto out_err; |
715 | error = rpc_populate(dentry, authfiles, | 703 | if (populate != NULL) { |
716 | RPCAUTH_info, RPCAUTH_EOF, private); | 704 | error = populate(dentry, args_populate); |
717 | if (error) | 705 | if (error) |
718 | goto err_rmdir; | 706 | goto err_rmdir; |
707 | } | ||
719 | out: | 708 | out: |
720 | mutex_unlock(&dir->i_mutex); | 709 | mutex_unlock(&dir->i_mutex); |
721 | return dentry; | 710 | return dentry; |
@@ -726,11 +715,8 @@ out_err: | |||
726 | goto out; | 715 | goto out; |
727 | } | 716 | } |
728 | 717 | ||
729 | /** | 718 | static int rpc_rmdir_depopulate(struct dentry *dentry, |
730 | * rpc_remove_client_dir - Remove a directory created with rpc_create_client_dir() | 719 | void (*depopulate)(struct dentry *)) |
731 | * @dentry: directory to remove | ||
732 | */ | ||
733 | int rpc_remove_client_dir(struct dentry *dentry) | ||
734 | { | 720 | { |
735 | struct dentry *parent; | 721 | struct dentry *parent; |
736 | struct inode *dir; | 722 | struct inode *dir; |
@@ -739,7 +725,8 @@ int rpc_remove_client_dir(struct dentry *dentry) | |||
739 | parent = dget_parent(dentry); | 725 | parent = dget_parent(dentry); |
740 | dir = parent->d_inode; | 726 | dir = parent->d_inode; |
741 | mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); | 727 | mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); |
742 | rpc_depopulate(dentry, authfiles, RPCAUTH_info, RPCAUTH_EOF); | 728 | if (depopulate != NULL) |
729 | depopulate(dentry); | ||
743 | error = __rpc_rmdir(dir, dentry); | 730 | error = __rpc_rmdir(dir, dentry); |
744 | mutex_unlock(&dir->i_mutex); | 731 | mutex_unlock(&dir->i_mutex); |
745 | dput(parent); | 732 | dput(parent); |
@@ -843,6 +830,31 @@ rpc_unlink(struct dentry *dentry) | |||
843 | } | 830 | } |
844 | EXPORT_SYMBOL_GPL(rpc_unlink); | 831 | EXPORT_SYMBOL_GPL(rpc_unlink); |
845 | 832 | ||
833 | enum { | ||
834 | RPCAUTH_info, | ||
835 | RPCAUTH_EOF | ||
836 | }; | ||
837 | |||
838 | static const struct rpc_filelist authfiles[] = { | ||
839 | [RPCAUTH_info] = { | ||
840 | .name = "info", | ||
841 | .i_fop = &rpc_info_operations, | ||
842 | .mode = S_IFREG | S_IRUSR, | ||
843 | }, | ||
844 | }; | ||
845 | |||
846 | static int rpc_clntdir_populate(struct dentry *dentry, void *private) | ||
847 | { | ||
848 | return rpc_populate(dentry, | ||
849 | authfiles, RPCAUTH_info, RPCAUTH_EOF, | ||
850 | private); | ||
851 | } | ||
852 | |||
853 | static void rpc_clntdir_depopulate(struct dentry *dentry) | ||
854 | { | ||
855 | rpc_depopulate(dentry, authfiles, RPCAUTH_info, RPCAUTH_EOF); | ||
856 | } | ||
857 | |||
846 | /** | 858 | /** |
847 | * rpc_create_client_dir - Create a new rpc_client directory in rpc_pipefs | 859 | * rpc_create_client_dir - Create a new rpc_client directory in rpc_pipefs |
848 | * @path: path from the rpc_pipefs root to the new directory | 860 | * @path: path from the rpc_pipefs root to the new directory |
@@ -854,10 +866,20 @@ EXPORT_SYMBOL_GPL(rpc_unlink); | |||
854 | * later be created using rpc_mkpipe(). | 866 | * later be created using rpc_mkpipe(). |
855 | */ | 867 | */ |
856 | struct dentry *rpc_create_client_dir(struct dentry *dentry, | 868 | struct dentry *rpc_create_client_dir(struct dentry *dentry, |
857 | struct qstr *name, | 869 | struct qstr *name, |
858 | struct rpc_clnt *rpc_client) | 870 | struct rpc_clnt *rpc_client) |
871 | { | ||
872 | return rpc_mkdir_populate(dentry, name, S_IRUGO | S_IXUGO, NULL, | ||
873 | rpc_clntdir_populate, rpc_client); | ||
874 | } | ||
875 | |||
876 | /** | ||
877 | * rpc_remove_client_dir - Remove a directory created with rpc_create_client_dir() | ||
878 | * @dentry: directory to remove | ||
879 | */ | ||
880 | int rpc_remove_client_dir(struct dentry *dentry) | ||
859 | { | 881 | { |
860 | return rpc_mkdir_populate(dentry, name, S_IRUGO | S_IXUGO, rpc_client); | 882 | return rpc_rmdir_depopulate(dentry, rpc_clntdir_depopulate); |
861 | } | 883 | } |
862 | 884 | ||
863 | /* | 885 | /* |