FreeBSD Bugzilla – Attachment 225109 Details for
Bug 256005
[FUSEFS] Fuse does not correctly set the owner field during FUSE_SETLK and FUSE_SETLKW
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Fix the lock owner field during FUSE_SETLK
0001-fusefs-correctly-set-lock-owner-during-FUSE_SETLK.patch (text/plain), 6.20 KB, created by
Alan Somers
on 2021-05-20 01:14:13 UTC
(
hide
)
Description:
Fix the lock owner field during FUSE_SETLK
Filename:
MIME Type:
Creator:
Alan Somers
Created:
2021-05-20 01:14:13 UTC
Size:
6.20 KB
patch
obsolete
>From ed58725e95d93306aa851afe3533bd70623de72c Mon Sep 17 00:00:00 2001 >From: Alan Somers <asomers@FreeBSD.org> >Date: Wed, 19 May 2021 19:10:15 -0600 >Subject: [PATCH] fusefs: correctly set lock owner during FUSE_SETLK > >During FUSE_SETLK, the owner field should uniquely identify the calling >process. The fusefs module now sets it to the process's pid. >Previously, it expected the calling process to set it directly, which >was wrong. > >libfuse also apparently expects the owner field to be set during >FUSE_GETLK, though I'm not sure why. > >PR: 256005 >Reported by: Agata <chogata@moosefs.pro> >MFC after: 2 weeks >--- > sys/fs/fuse/fuse_vnops.c | 4 +-- > tests/sys/fs/fusefs/locks.cc | 50 +++++++++++++++++++++--------------- > 2 files changed, 32 insertions(+), 22 deletions(-) > >diff --git a/sys/fs/fuse/fuse_vnops.c b/sys/fs/fuse/fuse_vnops.c >index a51c1b15e7f0..da9c60775870 100644 >--- a/sys/fs/fuse/fuse_vnops.c >+++ b/sys/fs/fuse/fuse_vnops.c >@@ -466,14 +466,14 @@ fuse_vnop_advlock(struct vop_advlock_args *ap) > fdisp_make_vp(&fdi, op, vp, td, cred); > fli = fdi.indata; > fli->fh = fufh->fh_id; >- fli->owner = fl->l_pid; >+ fli->owner = td->td_proc->p_pid; > fli->lk.start = fl->l_start; > if (fl->l_len != 0) > fli->lk.end = fl->l_start + fl->l_len - 1; > else > fli->lk.end = INT64_MAX; > fli->lk.type = fl->l_type; >- fli->lk.pid = fl->l_pid; >+ fli->lk.pid = td->td_proc->p_pid; > > err = fdisp_wait_answ(&fdi); > fdisp_destroy(&fdi); >diff --git a/tests/sys/fs/fusefs/locks.cc b/tests/sys/fs/fusefs/locks.cc >index 49f495412259..cace779e981a 100644 >--- a/tests/sys/fs/fusefs/locks.cc >+++ b/tests/sys/fs/fusefs/locks.cc >@@ -228,7 +228,7 @@ TEST_F(GetlkFallback, local) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = getpid(); >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -247,7 +247,7 @@ TEST_F(Getlk, no_locks) > uint64_t ino = 42; > struct flock fl; > int fd; >- pid_t pid = 1234; >+ pid_t pid = getpid(); > > expect_lookup(RELPATH, ino); > expect_open(ino, 0, 1); >@@ -256,11 +256,16 @@ TEST_F(Getlk, no_locks) > return (in.header.opcode == FUSE_GETLK && > in.header.nodeid == ino && > in.body.getlk.fh == FH && >+ /* >+ * Though it seems useless, libfuse expects the >+ * owner and pid fields to be set during >+ * FUSE_GETLK. >+ */ > in.body.getlk.owner == (uint32_t)pid && >+ in.body.getlk.lk.pid == (uint64_t)pid && > in.body.getlk.lk.start == 10 && > in.body.getlk.lk.end == 1009 && >- in.body.getlk.lk.type == F_RDLCK && >- in.body.getlk.lk.pid == (uint64_t)pid); >+ in.body.getlk.lk.type == F_RDLCK); > }, Eq(true)), > _) > ).WillOnce(Invoke(ReturnImmediate([=](auto in, auto& out) { >@@ -273,7 +278,7 @@ TEST_F(Getlk, no_locks) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = pid; >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -290,7 +295,7 @@ TEST_F(Getlk, lock_exists) > uint64_t ino = 42; > struct flock fl; > int fd; >- pid_t pid = 1234; >+ pid_t pid = getpid(); > pid_t pid2 = 1235; > > expect_lookup(RELPATH, ino); >@@ -300,11 +305,16 @@ TEST_F(Getlk, lock_exists) > return (in.header.opcode == FUSE_GETLK && > in.header.nodeid == ino && > in.body.getlk.fh == FH && >+ /* >+ * Though it seems useless, libfuse expects the >+ * owner and pid fields to be set during >+ * FUSE_GETLK. >+ */ > in.body.getlk.owner == (uint32_t)pid && >+ in.body.getlk.lk.pid == (uint64_t)pid && > in.body.getlk.lk.start == 10 && > in.body.getlk.lk.end == 1009 && >- in.body.getlk.lk.type == F_RDLCK && >- in.body.getlk.lk.pid == (uint64_t)pid); >+ in.body.getlk.lk.type == F_RDLCK); > }, Eq(true)), > _) > ).WillOnce(Invoke(ReturnImmediate([=](auto in __unused, auto& out) { >@@ -319,7 +329,7 @@ TEST_F(Getlk, lock_exists) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = pid; >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -368,7 +378,7 @@ TEST_F(Setlk, clear) > uint64_t ino = 42; > struct flock fl; > int fd; >- pid_t pid = 1234; >+ pid_t pid = getpid(); > > expect_lookup(RELPATH, ino); > expect_open(ino, 0, 1); >@@ -378,7 +388,7 @@ TEST_F(Setlk, clear) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = pid; >+ fl.l_pid = 0; > fl.l_type = F_UNLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -394,7 +404,7 @@ TEST_F(Setlk, set) > uint64_t ino = 42; > struct flock fl; > int fd; >- pid_t pid = 1234; >+ pid_t pid = getpid(); > > expect_lookup(RELPATH, ino); > expect_open(ino, 0, 1); >@@ -404,7 +414,7 @@ TEST_F(Setlk, set) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = pid; >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -420,7 +430,7 @@ TEST_F(Setlk, set_eof) > uint64_t ino = 42; > struct flock fl; > int fd; >- pid_t pid = 1234; >+ pid_t pid = getpid(); > > expect_lookup(RELPATH, ino); > expect_open(ino, 0, 1); >@@ -430,7 +440,7 @@ TEST_F(Setlk, set_eof) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 0; >- fl.l_pid = pid; >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -446,7 +456,7 @@ TEST_F(Setlk, eagain) > uint64_t ino = 42; > struct flock fl; > int fd; >- pid_t pid = 1234; >+ pid_t pid = getpid(); > > expect_lookup(RELPATH, ino); > expect_open(ino, 0, 1); >@@ -456,7 +466,7 @@ TEST_F(Setlk, eagain) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = pid; >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -484,7 +494,7 @@ TEST_F(SetlkwFallback, local) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = getpid(); >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >@@ -504,7 +514,7 @@ TEST_F(Setlkw, set) > uint64_t ino = 42; > struct flock fl; > int fd; >- pid_t pid = 1234; >+ pid_t pid = getpid(); > > expect_lookup(RELPATH, ino); > expect_open(ino, 0, 1); >@@ -514,7 +524,7 @@ TEST_F(Setlkw, set) > ASSERT_LE(0, fd) << strerror(errno); > fl.l_start = 10; > fl.l_len = 1000; >- fl.l_pid = pid; >+ fl.l_pid = 0; > fl.l_type = F_RDLCK; > fl.l_whence = SEEK_SET; > fl.l_sysid = 0; >-- >2.31.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 256005
: 225109