Merge tag 'nfs-for-4.19-2' of git://git.linux-nfs.org/projects/anna/linux-nfs
[sfrench/cifs-2.6.git] / fs / locks.c
index db7b6917d9c52d52d981efca3eb36f17149a0712..2ecb4db8c840ec7d2174422ceebf9a88dc4706a3 100644 (file)
 #define IS_OFDLCK(fl)  (fl->fl_flags & FL_OFDLCK)
 #define IS_REMOTELCK(fl)       (fl->fl_pid <= 0)
 
-static inline bool is_remote_lock(struct file *filp)
-{
-       return likely(!(filp->f_path.dentry->d_sb->s_flags & SB_NOREMOTELOCK));
-}
-
 static bool lease_breaking(struct file_lock *fl)
 {
        return fl->fl_flags & (FL_UNLOCK_PENDING | FL_DOWNGRADE_PENDING);
@@ -202,10 +197,6 @@ static DEFINE_HASHTABLE(blocked_hash, BLOCKED_HASH_BITS);
  * 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);
 
@@ -546,7 +537,7 @@ lease_setup(struct file_lock *fl, void **priv)
        if (!fasync_insert_entry(fa->fa_fd, filp, &fl->fl_fasync, fa))
                *priv = NULL;
 
-       __f_setown(filp, task_pid(current), PIDTYPE_PID, 0);
+       __f_setown(filp, task_pid(current), PIDTYPE_TGID, 0);
 }
 
 static const struct lock_manager_operations lease_manager_ops = {
@@ -990,6 +981,7 @@ out:
        if (new_fl)
                locks_free_lock(new_fl);
        locks_dispose_list(&dispose);
+       trace_flock_lock_inode(inode, request, error);
        return error;
 }
 
@@ -1654,8 +1646,7 @@ check_conflicting_open(const struct dentry *dentry, const long arg, int flags)
        if (flags & FL_LAYOUT)
                return 0;
 
-       if ((arg == F_RDLCK) &&
-           (atomic_read(&d_real_inode(dentry)->i_writecount) > 0))
+       if ((arg == F_RDLCK) && (atomic_read(&inode->i_writecount) > 0))
                return -EAGAIN;
 
        if ((arg == F_WRLCK) && ((d_count(dentry) > 1) ||
@@ -1876,7 +1867,7 @@ EXPORT_SYMBOL(generic_setlease);
 int
 vfs_setlease(struct file *filp, long arg, struct file_lock **lease, void **priv)
 {
-       if (filp->f_op->setlease && is_remote_lock(filp))
+       if (filp->f_op->setlease)
                return filp->f_op->setlease(filp, arg, lease, priv);
        else
                return generic_setlease(filp, arg, lease, priv);
@@ -2023,7 +2014,7 @@ SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
        if (error)
                goto out_free;
 
-       if (f.file->f_op->flock && is_remote_lock(f.file))
+       if (f.file->f_op->flock)
                error = f.file->f_op->flock(f.file,
                                          (can_sleep) ? F_SETLKW : F_SETLK,
                                          lock);
@@ -2049,7 +2040,7 @@ SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
  */
 int vfs_test_lock(struct file *filp, struct file_lock *fl)
 {
-       if (filp->f_op->lock && is_remote_lock(filp))
+       if (filp->f_op->lock)
                return filp->f_op->lock(filp, F_GETLK, fl);
        posix_test_lock(filp, fl);
        return 0;
@@ -2072,6 +2063,13 @@ static pid_t locks_translate_pid(struct file_lock *fl, struct pid_namespace *ns)
                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);
@@ -2192,7 +2190,7 @@ out:
  */
 int vfs_lock_file(struct file *filp, unsigned int cmd, struct file_lock *fl, struct file_lock *conf)
 {
-       if (filp->f_op->lock && is_remote_lock(filp))
+       if (filp->f_op->lock)
                return filp->f_op->lock(filp, cmd, fl);
        else
                return posix_lock_file(filp, fl, conf);
@@ -2514,7 +2512,7 @@ locks_remove_flock(struct file *filp, struct file_lock_context *flctx)
        if (list_empty(&flctx->flc_flock))
                return;
 
-       if (filp->f_op->flock && is_remote_lock(filp))
+       if (filp->f_op->flock)
                filp->f_op->flock(filp, F_SETLKW, &fl);
        else
                flock_lock_inode(inode, &fl);
@@ -2601,7 +2599,7 @@ EXPORT_SYMBOL(posix_unblock_lock);
  */
 int vfs_cancel_lock(struct file *filp, struct file_lock *fl)
 {
-       if (filp->f_op->lock && is_remote_lock(filp))
+       if (filp->f_op->lock)
                return filp->f_op->lock(filp, F_CANCELLK, fl);
        return 0;
 }
@@ -2626,12 +2624,10 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl,
 
        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);