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)