diff options
author | Raghavendra G <raghavendra@zresearch.com> | 2009-06-10 07:00:59 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-06-11 07:29:00 -0700 |
commit | ac53b60bc29831cecfa7d5919278afc6c7053392 (patch) | |
tree | cf2f801d87819d39a7577da9bc4cd80ab6cdd134 /libglusterfsclient | |
parent | 157469a43272d06f63f0d4eaa15bd994c9cc0ba0 (diff) |
libglusterfsclient: update offset in glusterfs_read_async_cbk only if offset stored in fd_ctx is used.
- this helps in implementing sendfile(2). manpage says that
"If offset is not NULL, then sendfile() does not modify the current
file offset of in_fd"
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
Diffstat (limited to 'libglusterfsclient')
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient-internals.h | 1 | ||||
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 13 |
2 files changed, 10 insertions, 4 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient-internals.h b/libglusterfsclient/src/libglusterfsclient-internals.h index d55cfb1f5..9b14dcb91 100755 --- a/libglusterfsclient/src/libglusterfsclient-internals.h +++ b/libglusterfsclient/src/libglusterfsclient-internals.h @@ -131,6 +131,7 @@ typedef struct libglusterfs_client_async_local { struct { fd_t *fd; glusterfs_readv_cbk_t cbk; + char update_offset; }readv_cbk; struct { diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index bfde21c61..0e7f81b53 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -3709,11 +3709,15 @@ libglusterfs_readv_async_cbk (call_frame_t *frame, if (op_ret > 0) { libglusterfs_client_fd_ctx_t *fd_ctx = NULL; fd_ctx = libgf_get_fd_ctx (__fd); - pthread_mutex_lock (&fd_ctx->lock); - { - fd_ctx->offset += op_ret; + + /* update offset only if we have used offset stored in fd_ctx */ + if (local->fop.readv_cbk.update_offset) { + pthread_mutex_lock (&fd_ctx->lock); + { + fd_ctx->offset += op_ret; + } + pthread_mutex_unlock (&fd_ctx->lock); } - pthread_mutex_unlock (&fd_ctx->lock); } readv_cbk (op_ret, op_errno, buf, local->cbk_data); @@ -3780,6 +3784,7 @@ glusterfs_read_async (glusterfs_file_t fd, pthread_mutex_lock (&fd_ctx->lock); { offset = fd_ctx->offset; + local->fop.readv_cbk.update_offset = 1; } pthread_mutex_unlock (&fd_ctx->lock); } |