lockd: Show pid of lockd for remote locks
authorBenjamin Coddington <bcodding@redhat.com>
Thu, 1 Nov 2018 17:39:49 +0000 (13:39 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 14 Dec 2018 17:52:16 +0000 (12:52 -0500)
Commit 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific l_pid
for remote locks") specified that the l_pid returned for F_GETLK on a local
file that has a remote lock should be the pid of the lock manager process.
That commit, while updating other filesystems, failed to update lockd, such
that locks created by lockd had their fl_pid set to that of the remote
process holding the lock.  Fix that here to be the pid of lockd.

Also, fix the client case so that the returned lock pid is negative, which
indicates a remote lock on a remote file.

Fixes: 9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific...")
Cc: stable@vger.kernel.org
Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/lockd/clntproc.c
fs/lockd/xdr.c
fs/lockd/xdr4.c

index d20b92f271c2341bbd323de93d76da0c65d904d7..0a67dd4250e9794f986565c96920fcab7bb6f0bb 100644 (file)
@@ -442,7 +442,7 @@ nlmclnt_test(struct nlm_rqst *req, struct file_lock *fl)
                        fl->fl_start = req->a_res.lock.fl.fl_start;
                        fl->fl_end = req->a_res.lock.fl.fl_end;
                        fl->fl_type = req->a_res.lock.fl.fl_type;
-                       fl->fl_pid = 0;
+                       fl->fl_pid = -req->a_res.lock.fl.fl_pid;
                        break;
                default:
                        status = nlm_stat_to_errno(req->a_res.status);
index 7147e4aebecc218e0b480f724e121a77966979c3..9846f7e952826ab40c8230ba9ae2ef42d9c5ba22 100644 (file)
@@ -127,7 +127,7 @@ nlm_decode_lock(__be32 *p, struct nlm_lock *lock)
 
        locks_init_lock(fl);
        fl->fl_owner = current->files;
-       fl->fl_pid   = (pid_t)lock->svid;
+       fl->fl_pid   = current->tgid;
        fl->fl_flags = FL_POSIX;
        fl->fl_type  = F_RDLCK;         /* as good as anything else */
        start = ntohl(*p++);
@@ -269,7 +269,7 @@ nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
        memset(lock, 0, sizeof(*lock));
        locks_init_lock(&lock->fl);
        lock->svid = ~(u32) 0;
-       lock->fl.fl_pid = (pid_t)lock->svid;
+       lock->fl.fl_pid = current->tgid;
 
        if (!(p = nlm_decode_cookie(p, &argp->cookie))
         || !(p = xdr_decode_string_inplace(p, &lock->caller,
index 7ed9edf9aed4a69031229537a4e9b25bfb7feee5..70154f3766951d2f28e6fd022a5072c2e2e6c2c0 100644 (file)
@@ -119,7 +119,7 @@ nlm4_decode_lock(__be32 *p, struct nlm_lock *lock)
 
        locks_init_lock(fl);
        fl->fl_owner = current->files;
-       fl->fl_pid   = (pid_t)lock->svid;
+       fl->fl_pid   = current->tgid;
        fl->fl_flags = FL_POSIX;
        fl->fl_type  = F_RDLCK;         /* as good as anything else */
        p = xdr_decode_hyper(p, &start);
@@ -266,7 +266,7 @@ nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
        memset(lock, 0, sizeof(*lock));
        locks_init_lock(&lock->fl);
        lock->svid = ~(u32) 0;
-       lock->fl.fl_pid = (pid_t)lock->svid;
+       lock->fl.fl_pid = current->tgid;
 
        if (!(p = nlm4_decode_cookie(p, &argp->cookie))
         || !(p = xdr_decode_string_inplace(p, &lock->caller,