Merge tag 'locks-v4.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 14 Aug 2018 04:56:50 +0000 (21:56 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 14 Aug 2018 04:56:50 +0000 (21:56 -0700)
Pull file locking updates from Jeff Layton:
 "Just a couple of patches from Konstantin to fix /proc/locks when the
  process that set the lock has exited, and a new tracepoint for the
  flock() codepath. Also threw in mailmap entries for my addresses and a
  comment cleanup"

* tag 'locks-v4.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux:
  locks: remove misleading obsolete comment
  mailmap: remap some of my email addresses to kernel.org address
  locks: add tracepoint in flock codepath
  fs/lock: show locks taken by processes from another pidns
  fs/lock: skip lock owner pid translation in case we are in init_pid_ns

1  2 
fs/locks.c

diff --combined fs/locks.c
index db7b6917d9c52d52d981efca3eb36f17149a0712,11a4d698aba8f8e7c694ce51a8356495287ae26b..bc047a7edc476e96d6e6a729de2884c292f4dc72
@@@ -202,10 -202,6 +202,6 @@@ static DEFINE_HASHTABLE(blocked_hash, B
   * we often hold the flc_lock as well. In certain cases, when reading the fields
   * protected by this lock, we can skip acquiring it iff we already hold the
   * flc_lock.
-  *
-  * In particular, adding an entry to the fl_block list requires that you hold
-  * both the flc_lock and the blocked_lock_lock (acquired in that order).
-  * Deleting an entry from the list however only requires the file_lock_lock.
   */
  static DEFINE_SPINLOCK(blocked_lock_lock);
  
@@@ -990,6 -986,7 +986,7 @@@ out
        if (new_fl)
                locks_free_lock(new_fl);
        locks_dispose_list(&dispose);
+       trace_flock_lock_inode(inode, request, error);
        return error;
  }
  
@@@ -1562,7 -1559,7 +1559,7 @@@ EXPORT_SYMBOL(__break_lease)
   * exclusive leases.  The justification is that if someone has an
   * exclusive lease, then they could be modifying it.
   */
 -void lease_get_mtime(struct inode *inode, struct timespec *time)
 +void lease_get_mtime(struct inode *inode, struct timespec64 *time)
  {
        bool has_lease = false;
        struct file_lock_context *ctx;
@@@ -2072,6 -2069,13 +2069,13 @@@ static pid_t locks_translate_pid(struc
                return -1;
        if (IS_REMOTELCK(fl))
                return fl->fl_pid;
+       /*
+        * If the flock owner process is dead and its pid has been already
+        * freed, the translation below won't work, but we still want to show
+        * flock owner pid number in init pidns.
+        */
+       if (ns == &init_pid_ns)
+               return (pid_t)fl->fl_pid;
  
        rcu_read_lock();
        pid = find_pid_ns(fl->fl_pid, &init_pid_ns);
@@@ -2626,12 -2630,10 +2630,10 @@@ static void lock_get_status(struct seq_
  
        fl_pid = locks_translate_pid(fl, proc_pidns);
        /*
-        * If there isn't a fl_pid don't display who is waiting on
-        * the lock if we are called from locks_show, or if we are
-        * called from __show_fd_info - skip lock entirely
+        * If lock owner is dead (and pid is freed) or not visible in current
+        * pidns, zero is shown as a pid value. Check lock info from
+        * init_pid_ns to get saved lock pid value.
         */
-       if (fl_pid == 0)
-               return;
  
        if (fl->fl_file != NULL)
                inode = locks_inode(fl->fl_file);