diff -rudb ceph-0.91.orig/src/client/Client.cc ceph-0.91/src/client/Client.cc --- ceph-0.91.orig/src/client/Client.cc 2015-01-14 00:42:08.000000000 +0100 +++ ceph-0.91/src/client/Client.cc 2015-02-06 15:18:50.231912657 +0100 @@ -5665,6 +5665,19 @@ return _setattr(in, &attr, CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME); } +int Client::flock(int fd, int operation, uint64_t owner) +{ + Mutex::Locker lock(client_lock); + tout(cct) << "flock" << std::endl; + tout(cct) << fd << std::endl; + tout(cct) << operation << std::endl; + Fh *f = get_filehandle(fd); + if (!f) + return -EBADF; + + return _flock(f, operation, owner, NULL); +} + int Client::opendir(const char *relpath, dir_result_t **dirpp) { Mutex::Locker lock(client_lock); diff -rudb ceph-0.91.orig/src/client/Client.h ceph-0.91/src/client/Client.h --- ceph-0.91.orig/src/client/Client.h 2015-01-14 00:42:08.000000000 +0100 +++ ceph-0.91/src/client/Client.h 2015-02-06 14:47:28.894246885 +0100 @@ -813,6 +813,7 @@ int lchown(const char *path, int uid, int gid); int utime(const char *path, struct utimbuf *buf); int lutime(const char *path, struct utimbuf *buf); + int flock(int fd, int operation, uint64_t owner); int truncate(const char *path, loff_t size); // file ops diff -rudb ceph-0.91.orig/src/include/cephfs/libcephfs.h ceph-0.91/src/include/cephfs/libcephfs.h --- ceph-0.91.orig/src/include/cephfs/libcephfs.h 2015-01-14 00:42:04.000000000 +0100 +++ ceph-0.91/src/include/cephfs/libcephfs.h 2015-02-06 14:48:35.013737212 +0100 @@ -684,6 +684,21 @@ int ceph_utime(struct ceph_mount_info *cmount, const char *path, struct utimbuf *buf); /** + * Apply or remove an advisory lock. + * + * @param cmount the ceph mount handle to use for performing the utime. + * @param fd the open file descriptor to change advisory lock. + * @param operation the advisory lock operation to be performed on the file + * descriptor among LOCK_SH (shared lock), LOCK_EX (exclusive lock), + * or LOCK_UN (remove lock). The LOCK_NB value can be ORed to perform a + * non-blocking operation. + * @param owner the user-supplied owner identifier + * @returns 0 on success or negative error code on failure. + */ +int ceph_flock(struct ceph_mount_info *cmount, int fd, int operation, + uint64_t owner); + +/** * Truncate the file to the given size. If this operation causes the * file to expand, the empty bytes will be filled in with zeros. * diff -rudb ceph-0.91.orig/src/libcephfs.cc ceph-0.91/src/libcephfs.cc --- ceph-0.91.orig/src/libcephfs.cc 2015-01-14 00:42:04.000000000 +0100 +++ ceph-0.91/src/libcephfs.cc 2015-02-06 14:47:50.626079362 +0100 @@ -718,6 +718,14 @@ return cmount->get_client()->utime(path, buf); } +extern "C" int ceph_flock(struct ceph_mount_info *cmount, int fd, int operation, + uint64_t owner) +{ + if (!cmount->is_mounted()) + return -ENOTCONN; + return cmount->get_client()->flock(fd, operation, owner); +} + extern "C" int ceph_truncate(struct ceph_mount_info *cmount, const char *path, int64_t size) {