From: gmallet Date: Mon, 8 Jun 2026 06:00:31 +0000 (+0200) Subject: libcephfs: add public api for ceph_ll_flock X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=63b5a5aebd5c39969a4df21dfbbac5242f95f936;p=ceph.git libcephfs: add public api for ceph_ll_flock Signed-off-by: gmallet --- diff --git a/src/include/cephfs/libcephfs.h b/src/include/cephfs/libcephfs.h index 12c202ae12e..2372e92eb2f 100644 --- a/src/include/cephfs/libcephfs.h +++ b/src/include/cephfs/libcephfs.h @@ -2221,6 +2221,8 @@ int ceph_ll_getlk(struct ceph_mount_info *cmount, Fh *fh, struct flock *fl, uint64_t owner); int ceph_ll_setlk(struct ceph_mount_info *cmount, Fh *fh, struct flock *fl, uint64_t owner, int sleep); +int ceph_ll_flock(struct ceph_mount_info *cmount, + Fh *fh, int operation, uint64_t owner); int ceph_ll_lazyio(struct ceph_mount_info *cmount, Fh *fh, int enable); diff --git a/src/libcephfs.cc b/src/libcephfs.cc index 0eeddd7167e..e24750dfed7 100644 --- a/src/libcephfs.cc +++ b/src/libcephfs.cc @@ -2395,6 +2395,12 @@ extern "C" int ceph_ll_setlk(struct ceph_mount_info *cmount, return (cmount->get_client()->ll_setlk(fh, fl, owner, sleep)); } +extern "C" int ceph_ll_flock(struct ceph_mount_info *cmount, + Fh *fh, int operation, uint64_t owner) +{ + return (cmount->get_client()->ll_flock(fh, operation, owner)); +} + extern "C" int ceph_ll_lazyio(class ceph_mount_info *cmount, Fh *fh, int enable) { diff --git a/src/test/libcephfs/flock.cc b/src/test/libcephfs/flock.cc index 3ced2d1bcec..52bce20f2ec 100644 --- a/src/test/libcephfs/flock.cc +++ b/src/test/libcephfs/flock.cc @@ -130,6 +130,62 @@ TEST(LibCephFS, BasicLocking) { CLEANUP_CEPH(); } +TEST(LibCephFS, BasicLLLocking) { + struct ceph_mount_info *cmount = NULL; + STARTUP_CEPH(); + + char c_file[1024]; + sprintf(c_file, "ll_flock_test_%d", getpid()); + Fh *fh = NULL; + Inode *root = NULL, *inode = NULL; + struct ceph_statx stx; + UserPerm *perms = ceph_mount_perms(cmount); + + ASSERT_EQ(0, ceph_ll_lookup_root(cmount, &root)); + ASSERT_EQ(0, ceph_ll_create(cmount, root, c_file, fileMode, + O_RDWR | O_CREAT, &inode, &fh, &stx, + 0, 0, perms)); + + // Lock exclusively twice + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_EX, 42)); + ASSERT_EQ(-EAGAIN, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 43)); + ASSERT_EQ(-EAGAIN, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 44)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 42)); + + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 43)); + ASSERT_EQ(-EAGAIN, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 44)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 43)); + + // Lock shared three times + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_SH, 42)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_SH, 43)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_SH, 44)); + // And then attempt to lock exclusively + ASSERT_EQ(-EAGAIN, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 45)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 42)); + ASSERT_EQ(-EAGAIN, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 45)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 44)); + ASSERT_EQ(-EAGAIN, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 45)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 43)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_EX | LOCK_NB, 45)); + ASSERT_EQ(-EAGAIN, ceph_ll_flock(cmount, fh, LOCK_SH | LOCK_NB, 42)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 45)); + + // Lock shared with upgrade to exclusive (POSIX) + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_SH, 42)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_EX, 42)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 42)); + + // Lock exclusive with downgrade to shared (POSIX) + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_EX, 42)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_SH, 42)); + ASSERT_EQ(0, ceph_ll_flock(cmount, fh, LOCK_UN, 42)); + + ASSERT_EQ(0, ceph_ll_close(cmount, fh)); + ASSERT_EQ(0, ceph_ll_unlink(cmount, root, c_file, perms)); + CLEANUP_CEPH(); +} + /* Locking in different threads */ // Used by ConcurrentLocking test