All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] fuse: async processing of F_SETLK with FL_SLEEP flag
@ 2021-12-23 11:31 Vasily Averin
  0 siblings, 0 replies; only message in thread
From: Vasily Averin @ 2021-12-23 11:31 UTC (permalink / raw)
  To: Miklos Szeredi; +Cc: kernel, linux-fsdevel, linux-kernel

kernel export thread (nfsd/lockd/ksmbd) use F_SETLK cmd with set FL_SLEEP
flag to request asynchronous processing of blocking locks.
Fuse does not support async processing and should drop FL_SLEEP flag
to avoid execution of blocking FUSE_SETLKW request.
Dropped FL_SLEEP flag should be restored back, because it can be used
in caller, at least in nfsd4_lock() does it actually.

https://bugzilla.kernel.org/show_bug.cgi?id=215383
Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
---
 fs/fuse/file.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 06e0d7fa86f3..54a9a5d660a6 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -2540,8 +2540,17 @@ static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl)
 	} else {
 		if (fc->no_lock)
 			err = posix_lock_file(file, fl, NULL);
-		else
+		else {
+			bool async = (fl->fl_flags & FL_SLEEP) && IS_SETLK(cmd);
+
+			if (async)
+				fl->fl_flags &= ~FL_SLEEP;
+
 			err = fuse_setlk(file, fl, 0);
+
+			if (async)
+				fl->fl_flags |= FL_SLEEP;
+		}
 	}
 	return err;
 }
-- 
2.25.1


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2021-12-23 11:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-23 11:31 [PATCH] fuse: async processing of F_SETLK with FL_SLEEP flag Vasily Averin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.