diff options
-rw-r--r-- | fs/nfsd/nfsctl.c | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index fa268d1b775f..b6a847faa0bb 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c | |||
@@ -911,6 +911,37 @@ static ssize_t write_versions(struct file *file, char *buf, size_t size) | |||
911 | } | 911 | } |
912 | 912 | ||
913 | /* | 913 | /* |
914 | * A single 'fd' number was written, in which case it must be for | ||
915 | * a socket of a supported family/protocol, and we use it as an | ||
916 | * nfsd listener. | ||
917 | */ | ||
918 | static ssize_t __write_ports_addfd(char *buf) | ||
919 | { | ||
920 | char *mesg = buf; | ||
921 | int fd, err; | ||
922 | |||
923 | err = get_int(&mesg, &fd); | ||
924 | if (err != 0 || fd < 0) | ||
925 | return -EINVAL; | ||
926 | |||
927 | err = nfsd_create_serv(); | ||
928 | if (err != 0) | ||
929 | return err; | ||
930 | |||
931 | err = svc_addsock(nfsd_serv, fd, buf); | ||
932 | if (err >= 0) { | ||
933 | err = lockd_up(); | ||
934 | if (err < 0) | ||
935 | svc_sock_names(buf + strlen(buf) + 1, nfsd_serv, buf); | ||
936 | |||
937 | /* Decrease the count, but don't shut down the service */ | ||
938 | nfsd_serv->sv_nrthreads--; | ||
939 | } | ||
940 | |||
941 | return err < 0 ? err : 0; | ||
942 | } | ||
943 | |||
944 | /* | ||
914 | * A '-' followed by the 'name' of a socket means we close the socket. | 945 | * A '-' followed by the 'name' of a socket means we close the socket. |
915 | */ | 946 | */ |
916 | static ssize_t __write_ports_delfd(char *buf) | 947 | static ssize_t __write_ports_delfd(char *buf) |
@@ -995,36 +1026,9 @@ static ssize_t __write_ports(struct file *file, char *buf, size_t size) | |||
995 | len = svc_xprt_names(nfsd_serv, buf, 0); | 1026 | len = svc_xprt_names(nfsd_serv, buf, 0); |
996 | return len; | 1027 | return len; |
997 | } | 1028 | } |
998 | /* Either a single 'fd' number is written, in which | 1029 | |
999 | * case it must be for a socket of a supported family/protocol, | 1030 | if (isdigit(buf[0])) |
1000 | * and we use it as an nfsd socket, or | 1031 | return __write_ports_addfd(buf); |
1001 | * A '-' followed by the 'name' of a socket in which case | ||
1002 | * we close the socket. | ||
1003 | */ | ||
1004 | if (isdigit(buf[0])) { | ||
1005 | char *mesg = buf; | ||
1006 | int fd; | ||
1007 | int err; | ||
1008 | err = get_int(&mesg, &fd); | ||
1009 | if (err) | ||
1010 | return -EINVAL; | ||
1011 | if (fd < 0) | ||
1012 | return -EINVAL; | ||
1013 | err = nfsd_create_serv(); | ||
1014 | if (!err) { | ||
1015 | err = svc_addsock(nfsd_serv, fd, buf); | ||
1016 | if (err >= 0) { | ||
1017 | err = lockd_up(); | ||
1018 | if (err < 0) | ||
1019 | svc_sock_names(buf+strlen(buf)+1, nfsd_serv, buf); | ||
1020 | } | ||
1021 | /* Decrease the count, but don't shutdown the | ||
1022 | * the service | ||
1023 | */ | ||
1024 | nfsd_serv->sv_nrthreads--; | ||
1025 | } | ||
1026 | return err < 0 ? err : 0; | ||
1027 | } | ||
1028 | 1032 | ||
1029 | if (buf[0] == '-' && isdigit(buf[1])) | 1033 | if (buf[0] == '-' && isdigit(buf[1])) |
1030 | return __write_ports_delfd(buf); | 1034 | return __write_ports_delfd(buf); |