From 63b5a5aebd5c39969a4df21dfbbac5242f95f936 Mon Sep 17 00:00:00 2001 From: gmallet Date: Mon, 8 Jun 2026 08:00:31 +0200 Subject: [PATCH 1/2] libcephfs: add public api for ceph_ll_flock Signed-off-by: gmallet --- src/include/cephfs/libcephfs.h | 2 ++ src/libcephfs.cc | 6 ++++ src/test/libcephfs/flock.cc | 56 ++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) 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 From 57d34f8e19bfe6cc83ef34be3d386586ccba0061 Mon Sep 17 00:00:00 2001 From: Gregory Farnum Date: Thu, 11 Jun 2026 11:50:16 -0700 Subject: [PATCH 2/2] libcephfs: increment extra version to indicate new flock functions Signed-off-by: Greg Farnum Signed-off-by: Gregory Farnum --- src/include/cephfs/libcephfs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/cephfs/libcephfs.h b/src/include/cephfs/libcephfs.h index 2372e92eb2f..15bc0140043 100644 --- a/src/include/cephfs/libcephfs.h +++ b/src/include/cephfs/libcephfs.h @@ -42,7 +42,7 @@ extern "C" { #define LIBCEPHFS_VER_MAJOR 11 #define LIBCEPHFS_VER_MINOR 0 -#define LIBCEPHFS_VER_EXTRA 0 +#define LIBCEPHFS_VER_EXTRA 1 #define LIBCEPHFS_VERSION(maj, min, extra) ((maj << 16) + (min << 8) + extra) #define LIBCEPHFS_VERSION_CODE LIBCEPHFS_VERSION(LIBCEPHFS_VER_MAJOR, LIBCEPHFS_VER_MINOR, LIBCEPHFS_VER_EXTRA)