From: Xavier Roche Date: Sun, 8 Feb 2015 13:48:55 +0000 (+0100) Subject: Added ceph_flock() to libcephfs. X-Git-Tag: v9.0.0~187^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0d0b2aa66b8659086b49c52723219389c2d5a5c5;p=ceph.git Added ceph_flock() to libcephfs. --- diff --git a/src/client/Client.cc b/src/client/Client.cc index f01c963705ac..ca3186a40861 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5728,6 +5728,19 @@ int Client::lutime(const char *relpath, struct utimbuf *buf) 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 --git a/src/client/Client.h b/src/client/Client.h index 0d4bb2cf9f5f..d42525f11480 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -813,6 +813,7 @@ public: 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 --git a/src/include/cephfs/libcephfs.h b/src/include/cephfs/libcephfs.h index f27f879ab2b9..1d7de9decf4b 100644 --- a/src/include/cephfs/libcephfs.h +++ b/src/include/cephfs/libcephfs.h @@ -683,6 +683,21 @@ int ceph_lchown(struct ceph_mount_info *cmount, const char *path, int uid, int g */ 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 --git a/src/libcephfs.cc b/src/libcephfs.cc index e3281de27348..852e08d72d68 100644 --- a/src/libcephfs.cc +++ b/src/libcephfs.cc @@ -718,6 +718,14 @@ extern "C" int ceph_utime(struct ceph_mount_info *cmount, const char *path, 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) {