From: Wendy Cheng <wcheng@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [RFC PATCH 2/3] NLM lock failover - per ip grace period
Date: Thu, 29 Jun 2006 14:21:51 -0400 [thread overview]
Message-ID: <44A41A3F.7050207@redhat.com> (raw)
This patch enables per ip NLM lock grace period. The implementation is
based on a global single linked list nlm_servs that contains entries of
per server ip info. It is expected this would not be a frequent event.
The nlm_servs list should be short and the entries would expire within a
maximum of 50 seconds. The grace period setting follows the existing
NLM grace period handling without changes. Logic is triggered via
echoing the ipv4 dot address into /proc/fs/nfsd/nlm_set_ip_grace file.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: gfs_nlm_ip_grace.patch
URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20060629/2fdf9f7e/attachment.ksh>
WARNING: multiple messages have this Message-ID (diff)
From: Wendy Cheng <wcheng@redhat.com>
To: nfs@lists.sourceforge.net, cluster-devel@redhat.com
Cc: Lon Hohberger <lhh@redhat.com>
Subject: [RFC PATCH 2/3] NLM lock failover - per ip grace period
Date: Thu, 29 Jun 2006 14:21:51 -0400 [thread overview]
Message-ID: <44A41A3F.7050207@redhat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 503 bytes --]
This patch enables per ip NLM lock grace period. The implementation is
based on a global single linked list nlm_servs that contains entries of
per server ip info. It is expected this would not be a frequent event.
The nlm_servs list should be short and the entries would expire within a
maximum of 50 seconds. The grace period setting follows the existing
NLM grace period handling without changes. Logic is triggered via
echoing the ipv4 dot address into /proc/fs/nfsd/nlm_set_ip_grace file.
[-- Attachment #2: gfs_nlm_ip_grace.patch --]
[-- Type: text/plain, Size: 16411 bytes --]
fs/lockd/svc.c | 8 +-
fs/lockd/svc4proc.c | 41 ++++++++++---
fs/lockd/svcproc.c | 43 +++++++++++--
fs/lockd/svcsubs.c | 138 ++++++++++++++++++++++++++++++++++++++++++++
fs/nfsd/nfsctl.c | 36 +++++++++++
include/linux/lockd/bind.h | 3
include/linux/lockd/lockd.h | 15 ++++
7 files changed, 266 insertions(+), 18 deletions(-)
--- linux-2.6.17-1/include/linux/lockd/lockd.h 2006-06-27 10:58:47.000000000 -0400
+++ linux-2.6.17-2/include/linux/lockd/lockd.h 2006-06-27 23:38:48.000000000 -0400
@@ -108,6 +108,13 @@ struct nlm_file {
__u32 f_iaddr; /* server ip for failover */
};
+/* Server ip linked list for NLM lock failover */
+struct nlm_serv {
+ struct nlm_serv * s_next; /* linked list */
+ unsigned long s_grace_period; /* per ip grace period */
+ struct in_addr s_ip; /* server ip */
+};
+
/*
* This is a server block (i.e. a lock requested by some client which
* couldn't be granted because of a conflicting lock).
@@ -137,6 +144,13 @@ struct nlm_block {
#define NLM_ACT_FO_UNLOCK 3 /* failover release locks */
/*
+ * Floating ip failover grace period check
+ */
+#define NLMSVC_FO_PASSTHRU 0
+#define NLMSVC_FO_RECLAIM 1
+#define NLMSVC_FO_BLOCK_ANY 2
+
+/*
* Global variables
*/
extern struct rpc_program nlm_program;
@@ -199,6 +213,7 @@ void nlmsvc_mark_resources(void);
void nlmsvc_free_host_resources(struct nlm_host *);
void nlmsvc_invalidate_all(void);
int nlmsvc_fo_unlock(struct in_addr *);
+int nlmsvc_fo_check(__u32);
static __inline__ struct inode *
nlmsvc_file_inode(struct nlm_file *file)
--- linux-2.6.17-1/fs/lockd/svcsubs.c 2006-06-28 14:55:33.000000000 -0400
+++ linux-2.6.17-2/fs/lockd/svcsubs.c 2006-06-28 14:59:53.000000000 -0400
@@ -63,6 +63,10 @@ static inline void nlm_debug_print_file(
}
#endif
+/* Global control structure for lock failover */
+static DEFINE_MUTEX(nlm_ip_mutex);
+struct nlm_serv *nlm_servs=NULL;
+
static inline unsigned int file_hash(struct nfs_fh *f)
{
unsigned int tmp=0;
@@ -380,3 +384,137 @@ nlmsvc_fo_unlock(struct in_addr *serv_ip
return (nlm_traverse_files(NULL, serv_ip, NLM_ACT_FO_UNLOCK));
}
+extern unsigned long set_grace_period(void); /* see fs/lockd/svc.c */
+
+EXPORT_SYMBOL(nlmsvc_fo_setgrace);
+
+/*
+ * Add serv_ip into global nlm_servs list.
+ */
+int
+nlmsvc_fo_setgrace(struct in_addr *serv_ip)
+{
+ struct nlm_serv *per_ip, *entry;
+
+ /* allocate the entry */
+ per_ip = kmalloc(sizeof(struct nlm_serv), GFP_KERNEL);
+ if (per_ip == NULL) {
+ printk("lockd: nlmsvc_fo_setgrace kmalloc fails\n");
+ return(-ENOMEM);
+ }
+
+ dprintk("lockd: nlmsvc_fo_setgrace ip=%u.%u.%u.%u jiffies=%lu\n",
+ NIPQUAD(serv_ip->s_addr), jiffies);
+
+ /* fill in info */
+ per_ip->s_grace_period = set_grace_period();
+ per_ip->s_ip = *serv_ip;
+
+ /* link into the global list */
+ mutex_lock(&nlm_ip_mutex);
+
+ entry = nlm_servs;
+ if (entry) {
+ per_ip->s_next = entry;
+ nlm_servs = per_ip;
+ } else {
+ per_ip->s_next = NULL;
+ nlm_servs = per_ip;
+ }
+
+ /* done */
+ mutex_unlock(&nlm_ip_mutex);
+ return 0;
+}
+
+/* nlm_servs gargabe collection
+ * - caller should hold nlm_ip_mutex
+ */
+static inline void
+__nlm_servs_gc(struct nlm_serv *e_purge)
+{
+ struct nlm_serv *e_next;
+
+ while (e_purge) {
+ e_next = e_purge->s_next;
+ dprintk("lockd: nlm purge per ip (%u.%u.%u.%u) grace period at jiffies=%lu\n",
+ NIPQUAD(e_purge->s_ip.s_addr), jiffies);
+ kfree(e_purge);
+ e_purge = e_next;
+ }
+}
+
+/*
+ * Reset global nlm_servs list
+ */
+void
+nlmsvc_fo_reset_servs()
+{
+ struct nlm_serv *e_purge;
+
+ mutex_lock(&nlm_ip_mutex);
+
+ /* nothing to do */
+ if (!nlm_servs) {
+ mutex_unlock(&nlm_ip_mutex);
+ return;
+ }
+
+ dprintk("lockd: nlmsvc_fo_reset nlm_servs\n");
+
+ /* purge the entries */
+ e_purge = nlm_servs;
+ nlm_servs = NULL;
+ __nlm_servs_gc(e_purge);
+
+ mutex_unlock(&nlm_ip_mutex);
+ return;
+}
+
+/*
+ * Check whether the ip is in the failover list: nlm_servs.
+ */
+int
+nlmsvc_fo_check(__u32 this_ip)
+{
+ struct nlm_serv **e_top, *e_this, *e_purge=NULL;
+ int rc=0;
+
+ dprintk("lockd: nlmsvc_fo_check (%u.%u.%u.%u)\n", NIPQUAD(this_ip));
+
+ mutex_lock(&nlm_ip_mutex);
+
+ /* no failover floating ip */
+ if (!(e_this = nlm_servs)) {
+ mutex_unlock(&nlm_ip_mutex);
+ return 0;
+ }
+
+ /* check to see whether this_ip is in nlm_servs list */
+ e_top = &nlm_servs;
+ while (e_this) {
+ if (time_before(e_this->s_grace_period, jiffies)) {
+ dprintk("lockd: nlmsvc %u.%u.%u.%u grace period expires\n",
+ NIPQUAD(e_this->s_ip.s_addr));
+ e_purge = e_this;
+ break;
+ } else if (e_this->s_ip.s_addr == this_ip) {
+ dprintk("lockd: nlmsvc %u.%u.%u.%u in grace period\n",
+ NIPQUAD(e_this->s_ip.s_addr));
+ rc = 1;
+ }
+ e_top = &(e_this->s_next);
+ e_this = e_this->s_next;
+ }
+
+ /* piggy back nlm_servs garbage collection */
+ if (e_purge) {
+ *e_top = NULL;
+ __nlm_servs_gc(e_purge);
+ }
+
+ /* done */
+ mutex_unlock(&nlm_ip_mutex);
+ return rc;
+}
+
--- linux-2.6.17-1/include/linux/lockd/bind.h 2006-06-27 10:58:51.000000000 -0400
+++ linux-2.6.17-2/include/linux/lockd/bind.h 2006-06-27 23:38:48.000000000 -0400
@@ -37,5 +37,8 @@ extern void lockd_down(void);
* NLM failover
*/
extern int nlmsvc_fo_unlock(struct in_addr *);
+extern int nlmsvc_fo_setgrace(struct in_addr *);
+extern void nlmsvc_fo_reset_servs(void);
+
#endif /* LINUX_LOCKD_BIND_H */
--- linux-2.6.17-1/fs/nfsd/nfsctl.c 2006-06-27 23:37:05.000000000 -0400
+++ linux-2.6.17-2/fs/nfsd/nfsctl.c 2006-06-29 09:28:39.000000000 -0400
@@ -57,6 +57,7 @@ enum {
NFSD_List,
NFSD_Fh,
NFSD_Nlm_unlock,
+ NFSD_Nlm_ipgrace,
NFSD_Threads,
NFSD_Versions,
/*
@@ -91,6 +92,7 @@ static ssize_t write_recoverydir(struct
* NLM lock failover
*/
static ssize_t do_nlm_fo_unlock(struct file *file, char *buf, size_t size);
+static ssize_t do_nlm_ip_grace(struct file *file, char *buf, size_t size);
static ssize_t (*write_op[])(struct file *, char *, size_t) = {
[NFSD_Svc] = write_svc,
@@ -102,6 +104,7 @@ static ssize_t (*write_op[])(struct file
[NFSD_Getfs] = write_getfs,
[NFSD_Fh] = write_filehandle,
[NFSD_Nlm_unlock] = do_nlm_fo_unlock,
+ [NFSD_Nlm_ipgrace] = do_nlm_ip_grace,
[NFSD_Threads] = write_threads,
[NFSD_Versions] = write_versions,
#ifdef CONFIG_NFSD_V4
@@ -360,9 +363,38 @@ int __get_nlm_host(char *buf, size_t siz
host_addr->s_addr = in_aton(buf);
printk("nfsd: __get_nlm_host (%u.%u.%u.%u)\n",
NIPQUAD(host_addr->s_addr));
+
return 0;
}
+static ssize_t do_nlm_ip_grace(struct file *file, char *buf, size_t size)
+{
+ struct in_addr serv_addr;
+ int rc;
+
+ /* convert string into valid ip address */
+ rc = __get_nlm_host(buf, size, &serv_addr);
+ if (rc) {
+ printk("do_nlm_ip_grace: invalid ip (%s)\n", buf);
+ return rc;
+ }
+
+ /* call nlm to set the grace period */
+ rc = nlmsvc_fo_setgrace(&serv_addr);
+ if (rc) {
+ printk("nlmsvc_fo_setgrace return rc=%d\n", rc);
+ return rc;
+ }
+
+ printk("nlm set per ip grace period for %u.%u.%u.%u\n",
+ NIPQUAD(serv_addr.s_addr));
+
+ /* done */
+ sprintf(buf, "nlm set per ip grace period for %u.%u.%u.%u\n",
+ NIPQUAD(serv_addr.s_addr));
+ return strlen(buf);
+}
+
static ssize_t do_nlm_fo_unlock(struct file *file, char *buf, size_t size)
{
struct in_addr serv_addr;
@@ -382,6 +414,9 @@ static ssize_t do_nlm_fo_unlock(struct f
return rc;
}
+ printk("nlm ip unlock released for %u.%u.%u.%u\n",
+ NIPQUAD(serv_addr.s_addr));
+
/* done */
sprintf(buf, "nlm ip unlock released for %u.%u.%u.%u\n",
NIPQUAD(serv_addr.s_addr));
@@ -537,6 +572,7 @@ static int nfsd_fill_super(struct super_
[NFSD_List] = {"exports", &exports_operations, S_IRUGO},
[NFSD_Fh] = {"filehandle", &transaction_ops, S_IWUSR|S_IRUSR},
[NFSD_Nlm_unlock] = {"nlm_unlock", &transaction_ops, S_IWUSR|S_IRUSR},
+ [NFSD_Nlm_ipgrace] = {"nlm_set_ip_grace", &transaction_ops, S_IWUSR|S_IRUSR},
[NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR},
[NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},
#ifdef CONFIG_NFSD_V4
--- linux-2.6.17-1/fs/lockd/svc4proc.c 2006-06-27 10:56:30.000000000 -0400
+++ linux-2.6.17-2/fs/lockd/svc4proc.c 2006-06-28 14:19:24.000000000 -0400
@@ -21,12 +21,15 @@
#define NLMDBG_FACILITY NLMDBG_CLIENT
+extern struct nlm_serv *nlm_servs;
+
/*
* Obtain client and file from arguments
*/
static u32
nlm4svc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
- struct nlm_host **hostp, struct nlm_file **filp)
+ struct nlm_host **hostp, struct nlm_file **filp,
+ int passthru_check)
{
struct nlm_host *host = NULL;
struct nlm_file *file = NULL;
@@ -37,6 +40,22 @@ nlm4svc_retrieve_args(struct svc_rqst *r
if (!nlmsvc_ops)
return nlm_lck_denied_nolocks;
+ /* Floating ip failover grace period */
+ if (unlikely(nlm_servs)) {
+ if (nlmsvc_fo_check(rqstp->rq_daddr)) {
+ dprintk("lockd: nlm v4 fo passthru_check= %d\n",
+ passthru_check);
+ switch (passthru_check) {
+ case NLMSVC_FO_PASSTHRU:
+ break;
+ case NLMSVC_FO_RECLAIM:
+ if (argp->reclaim) break;
+ default:
+ return nlm_lck_denied_grace_period;
+ }
+ }
+ }
+
/* Obtain host handle */
if (!(host = nlmsvc_lookup_host(rqstp))
|| (argp->monitor && !host->h_monitored && nsm_monitor(host) < 0))
@@ -95,7 +114,8 @@ nlm4svc_proc_test(struct svc_rqst *rqstp
}
/* Obtain client and file */
- if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Now check for conflicting locks */
@@ -125,7 +145,8 @@ nlm4svc_proc_lock(struct svc_rqst *rqstp
}
/* Obtain client and file */
- if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_RECLAIM)))
return rpc_success;
#if 0
@@ -168,7 +189,8 @@ nlm4svc_proc_cancel(struct svc_rqst *rqs
}
/* Obtain client and file */
- if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Try to cancel request. */
@@ -201,7 +223,8 @@ nlm4svc_proc_unlock(struct svc_rqst *rqs
}
/* Obtain client and file */
- if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Now try to remove the lock */
@@ -336,7 +359,8 @@ nlm4svc_proc_share(struct svc_rqst *rqst
}
/* Obtain client and file */
- if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_RECLAIM)))
return rpc_success;
/* Now try to create the share */
@@ -369,7 +393,8 @@ nlm4svc_proc_unshare(struct svc_rqst *rq
}
/* Obtain client and file */
- if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlm4svc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Now try to lock the file */
@@ -404,7 +429,7 @@ nlm4svc_proc_free_all(struct svc_rqst *r
struct nlm_host *host;
/* Obtain client */
- if (nlm4svc_retrieve_args(rqstp, argp, &host, NULL))
+ if (nlm4svc_retrieve_args(rqstp, argp, &host, NULL, NLMSVC_FO_PASSTHRU))
return rpc_success;
nlmsvc_free_host_resources(host);
--- linux-2.6.17-1/fs/lockd/svcproc.c 2006-06-27 10:56:30.000000000 -0400
+++ linux-2.6.17-2/fs/lockd/svcproc.c 2006-06-28 14:19:50.000000000 -0400
@@ -50,12 +50,15 @@ cast_to_nlm(u32 status, u32 vers)
#define cast_status(status) (status)
#endif
+extern struct nlm_serv *nlm_servs;
+
/*
* Obtain client and file from arguments
*/
static u32
nlmsvc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp,
- struct nlm_host **hostp, struct nlm_file **filp)
+ struct nlm_host **hostp, struct nlm_file **filp,
+ int passthru_check)
{
struct nlm_host *host = NULL;
struct nlm_file *file = NULL;
@@ -66,6 +69,24 @@ nlmsvc_retrieve_args(struct svc_rqst *rq
if (!nlmsvc_ops)
return nlm_lck_denied_nolocks;
+ /* Floating ip failover grace period */
+ if (unlikely(nlm_servs)) {
+ if (nlmsvc_fo_check(rqstp->rq_daddr)) {
+
+ dprintk("lockd: nlm fo passthru_check = %d\n",
+ passthru_check);
+
+ switch (passthru_check) {
+ case NLMSVC_FO_PASSTHRU:
+ break;
+ case NLMSVC_FO_RECLAIM:
+ if (argp->reclaim) break;
+ default:
+ return nlm_lck_denied_grace_period;
+ }
+ }
+ }
+
/* Obtain host handle */
if (!(host = nlmsvc_lookup_host(rqstp))
|| (argp->monitor && !host->h_monitored && nsm_monitor(host) < 0))
@@ -122,7 +143,8 @@ nlmsvc_proc_test(struct svc_rqst *rqstp,
}
/* Obtain client and file */
- if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Now check for conflicting locks */
@@ -153,7 +175,8 @@ nlmsvc_proc_lock(struct svc_rqst *rqstp,
}
/* Obtain client and file */
- if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_RECLAIM)))
return rpc_success;
#if 0
@@ -196,7 +219,8 @@ nlmsvc_proc_cancel(struct svc_rqst *rqst
}
/* Obtain client and file */
- if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Try to cancel request. */
@@ -229,7 +253,8 @@ nlmsvc_proc_unlock(struct svc_rqst *rqst
}
/* Obtain client and file */
- if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Now try to remove the lock */
@@ -366,7 +391,8 @@ nlmsvc_proc_share(struct svc_rqst *rqstp
}
/* Obtain client and file */
- if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_RECLAIM)))
return rpc_success;
/* Now try to create the share */
@@ -399,7 +425,8 @@ nlmsvc_proc_unshare(struct svc_rqst *rqs
}
/* Obtain client and file */
- if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file)))
+ if ((resp->status = nlmsvc_retrieve_args(rqstp, argp, &host, &file,
+ NLMSVC_FO_BLOCK_ANY)))
return rpc_success;
/* Now try to unshare the file */
@@ -434,7 +461,7 @@ nlmsvc_proc_free_all(struct svc_rqst *rq
struct nlm_host *host;
/* Obtain client */
- if (nlmsvc_retrieve_args(rqstp, argp, &host, NULL))
+ if (nlmsvc_retrieve_args(rqstp, argp, &host, NULL, NLMSVC_FO_PASSTHRU))
return rpc_success;
nlmsvc_free_host_resources(host);
--- linux-2.6.17-1/fs/lockd/svc.c 2006-06-27 10:56:30.000000000 -0400
+++ linux-2.6.17-2/fs/lockd/svc.c 2006-06-27 23:38:48.000000000 -0400
@@ -72,7 +72,7 @@ static const int nlm_port_min = 0, nlm_
static struct ctl_table_header * nlm_sysctl_table;
-static unsigned long set_grace_period(void)
+unsigned long set_grace_period(void)
{
unsigned long grace_period;
@@ -82,7 +82,6 @@ static unsigned long set_grace_period(vo
/ nlm_timeout) * nlm_timeout * HZ;
else
grace_period = nlm_timeout * 5 * HZ;
- nlmsvc_grace_period = 1;
return grace_period + jiffies;
}
@@ -130,6 +129,8 @@ lockd(struct svc_rqst *rqstp)
nlmsvc_timeout = nlm_timeout * HZ;
grace_period_expire = set_grace_period();
+ nlmsvc_grace_period = 1;
+ (void) nlmsvc_fo_reset_servs();
/*
* The main request loop. We don't terminate until the last
@@ -144,6 +145,8 @@ lockd(struct svc_rqst *rqstp)
if (nlmsvc_ops) {
nlmsvc_invalidate_all();
grace_period_expire = set_grace_period();
+ nlmsvc_grace_period = 1;
+ (void) nlmsvc_fo_reset_servs();
}
}
@@ -190,6 +193,7 @@ lockd(struct svc_rqst *rqstp)
nlmsvc_invalidate_all();
nlm_shutdown_hosts();
nlmsvc_pid = 0;
+ (void) nlmsvc_fo_reset_servs();
} else
printk(KERN_DEBUG
"lockd: new process, skipping host shutdown\n");
[-- Attachment #3: Type: text/plain, Size: 299 bytes --]
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
[-- Attachment #4: Type: text/plain, Size: 140 bytes --]
_______________________________________________
NFS maillist - NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs
next reply other threads:[~2006-06-29 18:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-29 18:21 Wendy Cheng [this message]
2006-06-29 18:21 ` [RFC PATCH 2/3] NLM lock failover - per ip grace period Wendy Cheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=44A41A3F.7050207@redhat.com \
--to=wcheng@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.