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:
@@ -466,14 +466,14 @@ fuse_vnop_advlock(struct vop_advlock_args *ap)
|
|||||||
fdisp_make_vp(&fdi, op, vp, td, cred);
|
fdisp_make_vp(&fdi, op, vp, td, cred);
|
||||||
fli = fdi.indata;
|
fli = fdi.indata;
|
||||||
fli->fh = fufh->fh_id;
|
fli->fh = fufh->fh_id;
|
||||||
fli->owner = fl->l_pid;
|
fli->owner = td->td_proc->p_pid;
|
||||||
fli->lk.start = fl->l_start;
|
fli->lk.start = fl->l_start;
|
||||||
if (fl->l_len != 0)
|
if (fl->l_len != 0)
|
||||||
fli->lk.end = fl->l_start + fl->l_len - 1;
|
fli->lk.end = fl->l_start + fl->l_len - 1;
|
||||||
else
|
else
|
||||||
fli->lk.end = INT64_MAX;
|
fli->lk.end = INT64_MAX;
|
||||||
fli->lk.type = fl->l_type;
|
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);
|
err = fdisp_wait_answ(&fdi);
|
||||||
fdisp_destroy(&fdi);
|
fdisp_destroy(&fdi);
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ TEST_F(GetlkFallback, local)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = getpid();
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -247,7 +247,7 @@ TEST_F(Getlk, no_locks)
|
|||||||
uint64_t ino = 42;
|
uint64_t ino = 42;
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid = 1234;
|
pid_t pid = getpid();
|
||||||
|
|
||||||
expect_lookup(RELPATH, ino);
|
expect_lookup(RELPATH, ino);
|
||||||
expect_open(ino, 0, 1);
|
expect_open(ino, 0, 1);
|
||||||
@@ -256,11 +256,16 @@ TEST_F(Getlk, no_locks)
|
|||||||
return (in.header.opcode == FUSE_GETLK &&
|
return (in.header.opcode == FUSE_GETLK &&
|
||||||
in.header.nodeid == ino &&
|
in.header.nodeid == ino &&
|
||||||
in.body.getlk.fh == FH &&
|
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.owner == (uint32_t)pid &&
|
||||||
|
in.body.getlk.lk.pid == (uint64_t)pid &&
|
||||||
in.body.getlk.lk.start == 10 &&
|
in.body.getlk.lk.start == 10 &&
|
||||||
in.body.getlk.lk.end == 1009 &&
|
in.body.getlk.lk.end == 1009 &&
|
||||||
in.body.getlk.lk.type == F_RDLCK &&
|
in.body.getlk.lk.type == F_RDLCK);
|
||||||
in.body.getlk.lk.pid == (uint64_t)pid);
|
|
||||||
}, Eq(true)),
|
}, Eq(true)),
|
||||||
_)
|
_)
|
||||||
).WillOnce(Invoke(ReturnImmediate([=](auto in, auto& out) {
|
).WillOnce(Invoke(ReturnImmediate([=](auto in, auto& out) {
|
||||||
@@ -273,7 +278,7 @@ TEST_F(Getlk, no_locks)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = pid;
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -290,7 +295,7 @@ TEST_F(Getlk, lock_exists)
|
|||||||
uint64_t ino = 42;
|
uint64_t ino = 42;
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid = 1234;
|
pid_t pid = getpid();
|
||||||
pid_t pid2 = 1235;
|
pid_t pid2 = 1235;
|
||||||
|
|
||||||
expect_lookup(RELPATH, ino);
|
expect_lookup(RELPATH, ino);
|
||||||
@@ -300,11 +305,16 @@ TEST_F(Getlk, lock_exists)
|
|||||||
return (in.header.opcode == FUSE_GETLK &&
|
return (in.header.opcode == FUSE_GETLK &&
|
||||||
in.header.nodeid == ino &&
|
in.header.nodeid == ino &&
|
||||||
in.body.getlk.fh == FH &&
|
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.owner == (uint32_t)pid &&
|
||||||
|
in.body.getlk.lk.pid == (uint64_t)pid &&
|
||||||
in.body.getlk.lk.start == 10 &&
|
in.body.getlk.lk.start == 10 &&
|
||||||
in.body.getlk.lk.end == 1009 &&
|
in.body.getlk.lk.end == 1009 &&
|
||||||
in.body.getlk.lk.type == F_RDLCK &&
|
in.body.getlk.lk.type == F_RDLCK);
|
||||||
in.body.getlk.lk.pid == (uint64_t)pid);
|
|
||||||
}, Eq(true)),
|
}, Eq(true)),
|
||||||
_)
|
_)
|
||||||
).WillOnce(Invoke(ReturnImmediate([=](auto in __unused, auto& out) {
|
).WillOnce(Invoke(ReturnImmediate([=](auto in __unused, auto& out) {
|
||||||
@@ -319,7 +329,7 @@ TEST_F(Getlk, lock_exists)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = pid;
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -368,7 +378,7 @@ TEST_F(Setlk, clear)
|
|||||||
uint64_t ino = 42;
|
uint64_t ino = 42;
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid = 1234;
|
pid_t pid = getpid();
|
||||||
|
|
||||||
expect_lookup(RELPATH, ino);
|
expect_lookup(RELPATH, ino);
|
||||||
expect_open(ino, 0, 1);
|
expect_open(ino, 0, 1);
|
||||||
@@ -378,7 +388,7 @@ TEST_F(Setlk, clear)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = pid;
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_UNLCK;
|
fl.l_type = F_UNLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -394,7 +404,7 @@ TEST_F(Setlk, set)
|
|||||||
uint64_t ino = 42;
|
uint64_t ino = 42;
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid = 1234;
|
pid_t pid = getpid();
|
||||||
|
|
||||||
expect_lookup(RELPATH, ino);
|
expect_lookup(RELPATH, ino);
|
||||||
expect_open(ino, 0, 1);
|
expect_open(ino, 0, 1);
|
||||||
@@ -404,7 +414,7 @@ TEST_F(Setlk, set)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = pid;
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -420,7 +430,7 @@ TEST_F(Setlk, set_eof)
|
|||||||
uint64_t ino = 42;
|
uint64_t ino = 42;
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid = 1234;
|
pid_t pid = getpid();
|
||||||
|
|
||||||
expect_lookup(RELPATH, ino);
|
expect_lookup(RELPATH, ino);
|
||||||
expect_open(ino, 0, 1);
|
expect_open(ino, 0, 1);
|
||||||
@@ -430,7 +440,7 @@ TEST_F(Setlk, set_eof)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 0;
|
fl.l_len = 0;
|
||||||
fl.l_pid = pid;
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -446,7 +456,7 @@ TEST_F(Setlk, eagain)
|
|||||||
uint64_t ino = 42;
|
uint64_t ino = 42;
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid = 1234;
|
pid_t pid = getpid();
|
||||||
|
|
||||||
expect_lookup(RELPATH, ino);
|
expect_lookup(RELPATH, ino);
|
||||||
expect_open(ino, 0, 1);
|
expect_open(ino, 0, 1);
|
||||||
@@ -456,7 +466,7 @@ TEST_F(Setlk, eagain)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = pid;
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -484,7 +494,7 @@ TEST_F(SetlkwFallback, local)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = getpid();
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
@@ -504,7 +514,7 @@ TEST_F(Setlkw, set)
|
|||||||
uint64_t ino = 42;
|
uint64_t ino = 42;
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid = 1234;
|
pid_t pid = getpid();
|
||||||
|
|
||||||
expect_lookup(RELPATH, ino);
|
expect_lookup(RELPATH, ino);
|
||||||
expect_open(ino, 0, 1);
|
expect_open(ino, 0, 1);
|
||||||
@@ -514,7 +524,7 @@ TEST_F(Setlkw, set)
|
|||||||
ASSERT_LE(0, fd) << strerror(errno);
|
ASSERT_LE(0, fd) << strerror(errno);
|
||||||
fl.l_start = 10;
|
fl.l_start = 10;
|
||||||
fl.l_len = 1000;
|
fl.l_len = 1000;
|
||||||
fl.l_pid = pid;
|
fl.l_pid = 0;
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
fl.l_whence = SEEK_SET;
|
fl.l_whence = SEEK_SET;
|
||||||
fl.l_sysid = 0;
|
fl.l_sysid = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user