Commit 4116092b authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust

NFSD: Support IPv6 addresses in write_failover_ip()

In write_failover_ip(), replace the sscanf() with a call to the common
sunrpc.ko presentation address parser.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent c15128c5
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/nfsd/xdr.h> #include <linux/nfsd/xdr.h>
#include <linux/nfsd/syscall.h> #include <linux/nfsd/syscall.h>
#include <linux/lockd/lockd.h> #include <linux/lockd/lockd.h>
#include <linux/sunrpc/clnt.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <net/ipv6.h> #include <net/ipv6.h>
...@@ -490,22 +491,18 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size) ...@@ -490,22 +491,18 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
* *
* Input: * Input:
* buf: '\n'-terminated C string containing a * buf: '\n'-terminated C string containing a
* presentation format IPv4 address * presentation format IP address
* size: length of C string in @buf * size: length of C string in @buf
* Output: * Output:
* On success: returns zero if all specified locks were released; * On success: returns zero if all specified locks were released;
* returns one if one or more locks were not released * returns one if one or more locks were not released
* On error: return code is negative errno value * On error: return code is negative errno value
*
* Note: Only AF_INET client addresses are passed in
*/ */
static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size) static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size)
{ {
struct sockaddr_in sin = { struct sockaddr_storage address;
.sin_family = AF_INET, struct sockaddr *sap = (struct sockaddr *)&address;
}; size_t salen = sizeof(address);
int b1, b2, b3, b4;
char c;
char *fo_path; char *fo_path;
/* sanity check */ /* sanity check */
...@@ -519,14 +516,10 @@ static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size) ...@@ -519,14 +516,10 @@ static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size)
if (qword_get(&buf, fo_path, size) < 0) if (qword_get(&buf, fo_path, size) < 0)
return -EINVAL; return -EINVAL;
/* get ipv4 address */ if (rpc_pton(fo_path, size, sap, salen) == 0)
if (sscanf(fo_path, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) != 4)
return -EINVAL;
if (b1 > 255 || b2 > 255 || b3 > 255 || b4 > 255)
return -EINVAL; return -EINVAL;
sin.sin_addr.s_addr = htonl((b1 << 24) | (b2 << 16) | (b3 << 8) | b4);
return nlmsvc_unlock_all_by_ip((struct sockaddr *)&sin); return nlmsvc_unlock_all_by_ip(sap);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment