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
Reviewed by:	pfg
Differential Revision: https://reviews.freebsd.org/D30622
This commit is contained in:
Alan Somers
2021-05-19 19:10:15 -06:00
parent b43d600c83
commit 18b19f8c6e
2 changed files with 32 additions and 22 deletions
+2 -2
View File
@@ -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);
+30 -20
View File
@@ -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;