Revert "lockd: introduce safe async lock op"
authorChuck Lever <chuck.lever@oracle.com>
Fri, 19 Apr 2024 11:18:36 +0000 (13:18 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 27 Apr 2024 15:05:23 +0000 (17:05 +0200)
This reverts commit 2267b2e84593bd3d61a1188e68fba06307fa9dab.

ltp test fcntl17 fails on v5.15.154. This was bisected to commit
2267b2e84593 ("lockd: introduce safe async lock op").

Reported-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Cc: stable@vger.kernel.org
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/filesystems/nfs/exporting.rst
fs/lockd/svclock.c
fs/nfsd/nfs4state.c
include/linux/exportfs.h

index 6a1cbd7de38dfa2605cca54b6ff6406e7ab91bb9..6f59a364f84cdd3319e0fe1de7018dd6bd79163a 100644 (file)
@@ -241,10 +241,3 @@ following flags are defined:
     all of an inode's dirty data on last close. Exports that behave this
     way should set EXPORT_OP_FLUSH_ON_CLOSE so that NFSD knows to skip
     waiting for writeback when closing such files.
-
-  EXPORT_OP_ASYNC_LOCK - Indicates a capable filesystem to do async lock
-    requests from lockd. Only set EXPORT_OP_ASYNC_LOCK if the filesystem has
-    it's own ->lock() functionality as core posix_lock_file() implementation
-    has no async lock request handling yet. For more information about how to
-    indicate an async lock request from a ->lock() file_operations struct, see
-    fs/locks.c and comment for the function vfs_lock_file().
index 55c0a03311884c7cbb59347399b206b71ada2173..4e30f3c50970127ea0a5197ed03b310f2409e3eb 100644 (file)
@@ -470,7 +470,9 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
            struct nlm_host *host, struct nlm_lock *lock, int wait,
            struct nlm_cookie *cookie, int reclaim)
 {
+#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
        struct inode            *inode = nlmsvc_file_inode(file);
+#endif
        struct nlm_block        *block = NULL;
        int                     error;
        int                     mode;
@@ -484,7 +486,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
                                (long long)lock->fl.fl_end,
                                wait);
 
-       if (!exportfs_lock_op_is_async(inode->i_sb->s_export_op)) {
+       if (nlmsvc_file_file(file)->f_op->lock) {
                async_block = wait;
                wait = 0;
        }
index 40b5b226e504dd9d75e8299e61ea5267ac21b0d2..d07176eee93539481a0154c8e55fd24a52221d3e 100644 (file)
@@ -7420,7 +7420,6 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        struct nfsd4_blocked_lock *nbl = NULL;
        struct file_lock *file_lock = NULL;
        struct file_lock *conflock = NULL;
-       struct super_block *sb;
        __be32 status = 0;
        int lkflg;
        int err;
@@ -7442,7 +7441,6 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                dprintk("NFSD: nfsd4_lock: permission denied!\n");
                return status;
        }
-       sb = cstate->current_fh.fh_dentry->d_sb;
 
        if (lock->lk_is_new) {
                if (nfsd4_has_session(cstate))
@@ -7494,8 +7492,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        fp = lock_stp->st_stid.sc_file;
        switch (lock->lk_type) {
                case NFS4_READW_LT:
-                       if (nfsd4_has_session(cstate) ||
-                           exportfs_lock_op_is_async(sb->s_export_op))
+                       if (nfsd4_has_session(cstate))
                                fl_flags |= FL_SLEEP;
                        fallthrough;
                case NFS4_READ_LT:
@@ -7507,8 +7504,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                        fl_type = F_RDLCK;
                        break;
                case NFS4_WRITEW_LT:
-                       if (nfsd4_has_session(cstate) ||
-                           exportfs_lock_op_is_async(sb->s_export_op))
+                       if (nfsd4_has_session(cstate))
                                fl_flags |= FL_SLEEP;
                        fallthrough;
                case NFS4_WRITE_LT:
@@ -7536,7 +7532,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
         * for file locks), so don't attempt blocking lock notifications
         * on those filesystems:
         */
-       if (!exportfs_lock_op_is_async(sb->s_export_op))
+       if (nf->nf_file->f_op->lock)
                fl_flags &= ~FL_SLEEP;
 
        nbl = find_or_allocate_block(lock_sop, &fp->fi_fhandle, nn);
index 6525f4b7eb97fc44116ee1df698dc5ffcc6ad915..218fc5c54e901c727ac55da4b46668616e47e373 100644 (file)
@@ -222,23 +222,9 @@ struct export_operations {
                                                  atomic attribute updates
                                                */
 #define EXPORT_OP_FLUSH_ON_CLOSE       (0x20) /* fs flushes file data on close */
-#define EXPORT_OP_ASYNC_LOCK           (0x40) /* fs can do async lock request */
        unsigned long   flags;
 };
 
-/**
- * exportfs_lock_op_is_async() - export op supports async lock operation
- * @export_ops:        the nfs export operations to check
- *
- * Returns true if the nfs export_operations structure has
- * EXPORT_OP_ASYNC_LOCK in their flags set
- */
-static inline bool
-exportfs_lock_op_is_async(const struct export_operations *export_ops)
-{
-       return export_ops->flags & EXPORT_OP_ASYNC_LOCK;
-}
-
 extern int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid,
                                    int *max_len, struct inode *parent);
 extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid,