diff options
author | Jeff Layton <jlayton@redhat.com> | 2014-02-03 12:13:09 -0500 |
---|---|---|
committer | Jeff Layton <jlayton@redhat.com> | 2014-03-31 08:24:42 -0400 |
commit | 3fd80cddc6af5ba53244514a61450d4b30a9fb9d (patch) | |
tree | cbca546dae6bcace6b933ef42130c7d3aa7ab2ca /fs/locks.c | |
parent | c918d42a27a9be0d78be490997d16d79cd5b9193 (diff) | |
download | linux-stable-3fd80cddc6af5ba53244514a61450d4b30a9fb9d.tar.gz linux-stable-3fd80cddc6af5ba53244514a61450d4b30a9fb9d.tar.bz2 linux-stable-3fd80cddc6af5ba53244514a61450d4b30a9fb9d.zip |
locks: report l_pid as -1 for FL_FILE_PVT locks
FL_FILE_PVT locks are no longer tied to a particular pid, and are
instead inheritable by child processes. Report a l_pid of '-1' for
these sorts of locks since the pid is somewhat meaningless for them.
This precedent comes from FreeBSD. There, POSIX and flock() locks can
conflict with one another. If fcntl(F_GETLK, ...) returns a lock set
with flock() then the l_pid member cannot be a process ID because the
lock is not held by a process as such.
Acked-by: J. Bruce Fields <bfields@fieldses.org>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Diffstat (limited to 'fs/locks.c')
-rw-r--r-- | fs/locks.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/locks.c b/fs/locks.c index 0e1f0df8de12..57f1d5fc876a 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1864,7 +1864,7 @@ EXPORT_SYMBOL_GPL(vfs_test_lock); static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl) { - flock->l_pid = fl->fl_pid; + flock->l_pid = IS_FILE_PVT(fl) ? -1 : fl->fl_pid; #if BITS_PER_LONG == 32 /* * Make sure we can represent the posix lock via @@ -1886,7 +1886,7 @@ static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl) #if BITS_PER_LONG == 32 static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl) { - flock->l_pid = fl->fl_pid; + flock->l_pid = IS_FILE_PVT(fl) ? -1 : fl->fl_pid; flock->l_start = fl->fl_start; flock->l_len = fl->fl_end == OFFSET_MAX ? 0 : fl->fl_end - fl->fl_start + 1; |