gfs2: use pid for plock owner for nfs clients
PATCH 1/1 gfs2: use pid for plock owner for nfs clients
The fl_owner is that of lockd when posix locks arrive from nfs clients, so it can't be used to distinguish between lock holders. Use fl_pid as owner instead; it's the pid of the process on the nfs client.
Signed-off-by David Teigland <[email protected]>
--- fs/gfs2/locking/dlm/plock.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-)
fs/gfs2/locking/dlm/plock.c +14 -4
@@ -89,15 +89,19 @@ int gdlm_plock(void *lockspace, struct lm_lockname *name, op->info.number = name->ln_number; op->info.start = fl->fl_start; op->info.end = fl->fl_end; - op->info.owner = (__u64 )(long ) fl->fl_owner;if (fl->fl_lmops && fl->fl_lmops->fl_grant) { +/* fl_owner is lockd which doesn't distinguish +processes on the nfs client */ + op->info.owner = (__u64 ) fl->fl_pid; xop->callback = fl->fl_lmops->fl_grant;locks_init_lock (&xop->flc);locks_copy_lock (&xop->flc, fl); xop->fl = fl; xop->file = file; - }else + }else { + op->info.owner = (__u64 )(long ) fl->fl_owner; xop->callback =NULL ; + }send_op (op);
@@ -203,7 +207,10 @@ int gdlm_punlock(void *lockspace, struct lm_lockname *name, op->info.number = name->ln_number; op->info.start = fl->fl_start; op->info.end = fl->fl_end; - op->info.owner = (__u64 )(long ) fl->fl_owner; +if (fl->fl_lmops && fl->fl_lmops->fl_grant) + op->info.owner = (__u64 ) fl->fl_pid; +else + op->info.owner = (__u64 )(long ) fl->fl_owner;send_op (op);wait_event (recv_wq, (op->done !=0 ));
@@ -242,7 +249,10 @@ int gdlm_plock_get(void *lockspace, struct lm_lockname *name, op->info.number = name->ln_number; op->info.start = fl->fl_start; op->info.end = fl->fl_end; - op->info.owner = (__u64 )(long ) fl->fl_owner; +if (fl->fl_lmops && fl->fl_lmops->fl_grant) + op->info.owner = (__u64 ) fl->fl_pid; +else + op->info.owner = (__u64 )(long ) fl->fl_owner;send_op (op);wait_event (recv_wq, (op->done !=0 ));
Signature · 1 line
1.5.2.1
Hi,
Now in the -nmw git tree. Thanks,
Steve.
Quoted 60 lines · David Teigland
The
fl_owneris that of lockd when posix locks arrive from nfs clients, so it can't be used to distinguish between lock holders. Usefl_pidas owner instead; it's the pid of the process on the nfs client.Signed-off-by David Teigland <[email protected]>--- fs/gfs2/locking/dlm/plock.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-)fs/gfs2/locking/dlm/plock.c +14
-4@@ -89,15 +89,19 @@ int gdlm_plock(void *lockspace, struct lm_lockname *name, op->info.number = name->ln_number; op->info.start = fl->fl_start; op->info.end = fl->fl_end; - op->info.owner = (__u64 )(long ) fl->fl_owner;if (fl->fl_lmops && fl->fl_lmops->fl_grant) { +/* fl_owner is lockd which doesn't distinguish +processes on the nfs client */ + op->info.owner = (__u64 ) fl->fl_pid; xop->callback = fl->fl_lmops->fl_grant;locks_init_lock (&xop->flc);locks_copy_lock (&xop->flc, fl); xop->fl = fl; xop->file = file; - }else + }else { + op->info.owner = (__u64 )(long ) fl->fl_owner; xop->callback =NULL ; + }send_op (op);@@ -203,7 +207,10 @@ int gdlm_punlock(void *lockspace, struct lm_lockname *name, op->info.number = name->ln_number; op->info.start = fl->fl_start; op->info.end = fl->fl_end; - op->info.owner = (__u64 )(long ) fl->fl_owner; +if (fl->fl_lmops && fl->fl_lmops->fl_grant) + op->info.owner = (__u64 ) fl->fl_pid; +else + op->info.owner = (__u64 )(long ) fl->fl_owner;send_op (op);wait_event (recv_wq, (op->done !=0 ));@@ -242,7 +249,10 @@ int gdlm_plock_get(void *lockspace, struct lm_lockname *name, op->info.number = name->ln_number; op->info.start = fl->fl_start; op->info.end = fl->fl_end; - op->info.owner = (__u64 )(long ) fl->fl_owner; +if (fl->fl_lmops && fl->fl_lmops->fl_grant) + op->info.owner = (__u64 ) fl->fl_pid; +else + op->info.owner = (__u64 )(long ) fl->fl_owner;send_op (op);wait_event (recv_wq, (op->done !=0 ));