[Devel] [PATCH RHEL7 COMMIT] ms/fuse: drop obsoleted and incorrect restriction in fuse_setlk

Vasily Averin vvs at virtuozzo.com
Thu Dec 30 16:58:23 MSK 2021


The commit is pushed to "branch-rh7-3.10.0-1160.42.2.vz7.184.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1160.42.2.vz7.184.7
------>
commit 5aeda4e77bf28bdda91a37b1118ed71540ca2906
Author: Vasily Averin <vvs at virtuozzo.com>
Date:   Thu Dec 30 16:58:23 2021 +0300

    ms/fuse: drop obsoleted and incorrect restriction in fuse_setlk
    
    kernel export threads like nfsd, lockd and ksmbd can deadlock if
    exported file system does not support asynchronous processing of
    blocking locks.
    
    Some time ago this problem was work arounded in fuse by commit
    48e90761b570 ("fuse: lockd support"), however it was not fully
    correct because of all locking requests was disables including
    non-blocking (i.e. w/o FL_SLEEP in fl_flags) locks.
    
    Now this check is incomplete: nfs v4 does not use lockd and handles
    locking request via nfsd directly, recently added ksmbd uses
    vfs_lock_file() too. However both these servers does not have
    fl->fl_lmops->lm_grant defined.
    
    Original problem was noticed again, and now it will be fixed on the
    server side: all affected kernel threads will not use FL_SLEEP if
    exported file system does not support asynchronous processing of
    blocking locks.
    
    (patch was submitted upstream but was not merged yet)
    https://jira.sw.ru/browse/PSBM-136851
    Signed-off-by: Vasily Averin <vvs at virtuozzo.com>
---
 fs/fuse/file.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 07a062f..dd98166 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -2773,11 +2773,6 @@ static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
 	pid_t pid_nr = pid_nr_ns(pid, fc->pid_ns);
 	int err;
 
-	if (fl->fl_lmops && fl->fl_lmops->lm_grant) {
-		/* NLM needs asynchronous locks, which we don't support yet */
-		return -ENOLCK;
-	}
-
 	/* Unlock on close is handled by the flush method */
 	if ((fl->fl_flags & FL_CLOSE_POSIX) == FL_CLOSE_POSIX)
 		return 0;


More information about the Devel mailing list