diff options
author | Raghavendra G <raghavendra@zresearch.com> | 2009-06-10 07:01:45 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-06-11 07:29:01 -0700 |
commit | 5dcbc0563f10cf68db2af10665953425ed262906 (patch) | |
tree | 82243b39a421da97eba3d9b652d12272e4739456 /libglusterfsclient | |
parent | 8ebb4499d0bf568ea58562708f8baaedfe9fa58a (diff) |
libglusterfsclient: implement glusterfs_fcntl.
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
Diffstat (limited to 'libglusterfsclient')
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 91 | ||||
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.h | 26 |
2 files changed, 117 insertions, 0 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 11ee08d038c..89c57182e8d 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -6888,6 +6888,97 @@ glusterfs_sendfile (int out_fd, glusterfs_file_t in_fd, off_t *offset, return ret; } + +static int32_t +libgf_client_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, struct flock *lock) +{ + libgf_client_local_t *local = frame->local; + + local->reply_stub = fop_lk_cbk_stub (frame, NULL, op_ret, op_errno, + lock); + + LIBGF_REPLY_NOTIFY (local); + + return 0; +} + + +int +libgf_client_lk (libglusterfs_client_ctx_t *ctx, fd_t *fd, int cmd, + struct flock *lock) +{ + call_stub_t *stub = NULL; + int32_t op_ret; + libgf_client_local_t *local = NULL; + + LIBGF_CLIENT_FOP(ctx, stub, lk, local, fd, cmd, lock); + + op_ret = stub->args.lk_cbk.op_ret; + errno = stub->args.lk_cbk.op_errno; + if (op_ret == 0) { + *lock = stub->args.lk_cbk.lock; + } + + call_stub_destroy (stub); + return op_ret; +} + + +int +glusterfs_fcntl (glusterfs_file_t fd, int cmd, ...) +{ + int ret = -1; + struct flock *lock = NULL; + va_list ap; + libglusterfs_client_ctx_t *ctx = NULL; + libglusterfs_client_fd_ctx_t *fd_ctx = NULL; + + GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out); + + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { + errno = EBADF; + goto out; + } + + ctx = fd_ctx->ctx; + + switch (cmd) { + case F_SETLK: + case F_SETLKW: + case F_GETLK: +#if F_SETLK != F_SETLK64 + case F_SETLK64: +#endif +#if F_SETLKW != F_SETLKW64 + case F_SETLKW64: +#endif +#if F_GETLK != F_GETLK64 + case F_GETLK64: +#endif + va_start (ap, cmd); + lock = va_arg (ap, struct flock *); + va_end (ap); + + if (!lock) { + errno = EINVAL; + goto out; + } + + ret = libgf_client_lk (ctx, fd, cmd, lock); + break; + + default: + errno = EINVAL; + break; + } + +out: + return ret; +} + + static struct xlator_fops libgf_client_fops = { }; diff --git a/libglusterfsclient/src/libglusterfsclient.h b/libglusterfsclient/src/libglusterfsclient.h index 7ce7288f897..795857c9c37 100755 --- a/libglusterfsclient/src/libglusterfsclient.h +++ b/libglusterfsclient/src/libglusterfsclient.h @@ -1277,6 +1277,32 @@ ssize_t glusterfs_sendfile (int out_fd, glusterfs_file_t in_fd, off_t *offset, size_t count); +/* manipulate file descriptor + * This api can have 3 forms similar to fcntl(2). + * + * int + * glusterfs_fcntl (glusterfs_file_t fd, int cmd) + * + * int + * glusterfs_fcntl (glusterfs_file_t fd, int cmd, long arg) + * + * int + * glusterfs_fcntl (glusterfs_file_t fd, int cmd, struct flock *lock) + * + * @fd : file handle returned by glusterfs_open or glusterfs_create. + * @cmd : Though the aim is to implement all possible commands supported by + * fcntl(2), currently following commands are supported. + * F_SETLK, F_SETLKW, F_GETLK - used to acquire, release, and test for + * the existence of record locks (also + * known as file-segment or file-region + * locks). More detailed explanation is + * found in 'man 2 fcntl' + */ + +int +glusterfs_fcntl (glusterfs_file_t fd, int cmd, ...); + + /* FIXME: review the need for these apis */ /* added for log related initialization in booster fork implementation */ void |