]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
libcephfs: add public api for ceph_ll_flock
authorgmallet <malletgaetan@protonmail.com>
Mon, 8 Jun 2026 06:00:31 +0000 (08:00 +0200)
committergmallet <malletgaetan@protonmail.com>
Mon, 8 Jun 2026 06:00:31 +0000 (08:00 +0200)
Signed-off-by: gmallet <malletgaetan@protonmail.com>
src/include/cephfs/libcephfs.h
src/libcephfs.cc
src/test/libcephfs/flock.cc

index 12c202ae12eabb5f3596bfd59f694e96e19b5bd8..2372e92eb2fa86e75d496ef9ed043f497b3016e7 100644 (file)
@@ -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);
 
index 0eeddd7167e02f442846cbac85df4fcec8d0449a..e24750dfed715b714649cd98f98468b93843c80c 100644 (file)
@@ -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)
 {
index 3ced2d1bcec5dab2ebf348c5c3c9858aedff206e..52bce20f2ec77e42e235ed208f442ebf33eada3d 100644 (file)
@@ -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