Add a new nfsd procfs file "resume_ip" to enable per-ip base lockd grace period:

Example Usage:
root-shell> echo 10.1.1.64 > /proc/fs/nfsd/resume_ip

Only support IPV4 address for this patch submission.

-- Wendy

Add a new nfsd procfs file "resume_ip" to enable per-ip base lockd grace 
period:

Example Usage:
root-shell> echo 10.1.1.64 > /proc/fs/nfsd/resume_ip

Only support IPV4 address for this patch submission.

Signed-off-by: S. Wendy Cheng <[EMAIL PROTECTED]>
Signed-off-by: Lon Hohberger  <[EMAIL PROTECTED]>

 fs/lockd/svcsubs.c          |    9 +++++++++
 fs/nfsd/nfsctl.c            |   43 ++++++++++++++++++++++++++++++++++++++-----
 include/linux/lockd/lockd.h |    1 +
 3 files changed, 48 insertions(+), 5 deletions(-)

--- linux-1/fs/nfsd/nfsctl.c	2008-01-22 10:36:24.000000000 -0500
+++ linux-2/fs/nfsd/nfsctl.c	2008-01-24 17:03:12.000000000 -0500
@@ -56,6 +56,7 @@ enum {
 	NFSD_Fh,
 	NFSD_FO_UnlockIP,
 	NFSD_FO_UnlockFS,
+	NFSD_FO_ResumeIP,
 	NFSD_Threads,
 	NFSD_Pool_Threads,
 	NFSD_Versions,
@@ -94,6 +95,7 @@ static ssize_t write_recoverydir(struct 
 
 static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size);
 static ssize_t failover_unlock_fs(struct file *file, char *buf, size_t size);
+static ssize_t failover_resume_ip(struct file *file, char *buf, size_t size);
 
 static ssize_t (*write_op[])(struct file *, char *, size_t) = {
 	[NFSD_Svc] = write_svc,
@@ -106,6 +108,7 @@ static ssize_t (*write_op[])(struct file
 	[NFSD_Fh] = write_filehandle,
 	[NFSD_FO_UnlockIP] = failover_unlock_ip,
 	[NFSD_FO_UnlockFS] = failover_unlock_fs,
+	[NFSD_FO_ResumeIP] = failover_resume_ip,
 	[NFSD_Threads] = write_threads,
 	[NFSD_Pool_Threads] = write_pool_threads,
 	[NFSD_Versions] = write_versions,
@@ -297,11 +300,13 @@ static ssize_t write_getfd(struct file *
 	return err;
 }
 
-static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size)
+static int failover_parse_ip(struct file *file,
+			     char *buf,
+			     size_t size,
+			     __be32 *server_ip)
 {
-	__be32 server_ip;
 	char *fo_path, c;
-	int b1, b2, b3, b4;
+	int b1, b2, b3, b4, len;
 
 	/* sanity check */
 	if (size == 0)
@@ -315,13 +320,39 @@ static ssize_t failover_unlock_ip(struct
 		return -EINVAL;
 
 	/* get ipv4 address */
-	if (sscanf(fo_path, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) != 4)
+	len = sscanf(fo_path, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c);
+	if (len != 4)
 		return -EINVAL;
-	server_ip = htonl((((((b1<<8)|b2)<<8)|b3)<<8)|b4);
+
+	*server_ip = htonl((((((b1<<8)|b2)<<8)|b3)<<8)|b4);
+
+	return len;
+}
+
+static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size)
+{
+	__be32 server_ip;
+	int rc;
+
+	rc = failover_parse_ip(file, buf, size, &server_ip);
+	if (rc < 0)
+		return rc;
 
 	return nlmsvc_failover_ip(server_ip);
 }
 
+static ssize_t failover_resume_ip(struct file *file, char *buf, size_t size)
+{
+	__be32 server_ip;
+	int len;
+
+	len = failover_parse_ip(file, buf, size, &server_ip);
+	if (len < 0)
+		return len;
+
+	return nlmsvc_failover_setgrace(&server_ip, len);
+}
+
 static ssize_t failover_unlock_fs(struct file *file, char *buf, size_t size)
 {
 	struct nameidata nd;
@@ -711,6 +742,8 @@ static int nfsd_fill_super(struct super_
 					&transaction_ops, S_IWUSR|S_IRUSR},
 		[NFSD_FO_UnlockFS] = {"unlock_filesystem",
 					&transaction_ops, S_IWUSR|S_IRUSR},
+		[NFSD_FO_ResumeIP] = {"resume_ip",
+					&transaction_ops, S_IWUSR|S_IRUSR},
 		[NFSD_Fh] = {"filehandle", &transaction_ops, S_IWUSR|S_IRUSR},
 		[NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR},
 		[NFSD_Pool_Threads] = {"pool_threads", &transaction_ops, S_IWUSR|S_IRUSR},
--- linux-1/fs/lockd/svcsubs.c	2008-01-22 10:36:24.000000000 -0500
+++ linux-2/fs/lockd/svcsubs.c	2008-01-22 11:45:44.000000000 -0500
@@ -422,3 +422,12 @@ nlmsvc_failover_ip(__be32 server_addr)
 			nlmsvc_failover_file_ok_ip);
 }
 EXPORT_SYMBOL_GPL(nlmsvc_failover_ip);
+
+int
+nlmsvc_failover_setgrace(void *server_ip, int ip_size)
+{
+	/* implemented by resume_002.patch */
+	return ENOSYS;
+}
+EXPORT_SYMBOL_GPL(nlmsvc_failover_setgrace);
+
--- linux-1/include/linux/lockd/lockd.h	2008-01-22 10:36:24.000000000 -0500
+++ linux-2/include/linux/lockd/lockd.h	2008-01-22 11:45:44.000000000 -0500
@@ -220,6 +220,7 @@ void		  nlmsvc_invalidate_all(void);
  */
 int           nlmsvc_failover_path(struct nameidata *nd);
 int           nlmsvc_failover_ip(__be32 server_addr);
+int           nlmsvc_failover_setgrace(void *server_ip, int ip_size);
 
 static __inline__ struct inode *
 nlmsvc_file_inode(struct nlm_file *file)

Reply via email to