diff options
author | Raghavendra G <raghavendra@zresearch.com> | 2009-06-04 06:14:31 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-06-11 06:29:16 -0700 |
commit | b930b38a2ab16b3d25b4bf2441e584f7fc882a17 (patch) | |
tree | d15389d5f238bfde4e01da88d3e8ac3352da1b2f | |
parent | 3f4362cedee499beb6a872b3dbb3ac920aa51d21 (diff) |
read-ahead: return with error code EBADF for fops on fds without file set in their context.
- since a successful open/create will _always_ set a pointer to ra_file_t in
context of fd, this fix makes sense.
- an example of operations on bad fd can be afr sending read on the child
which was down during open.
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
-rw-r--r-- | xlators/performance/read-ahead/src/read-ahead.c | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/xlators/performance/read-ahead/src/read-ahead.c b/xlators/performance/read-ahead/src/read-ahead.c index 24a10eea0..b2703ad8d 100644 --- a/xlators/performance/read-ahead/src/read-ahead.c +++ b/xlators/performance/read-ahead/src/read-ahead.c @@ -432,6 +432,13 @@ ra_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, ret = fd_ctx_get (fd, this, &tmp_file); file = (ra_file_t *)(long)tmp_file; + if (file == NULL) { + op_errno = EBADF; + gf_log (this->name, GF_LOG_DEBUG, "readv received on fd with no" + " file set in its context"); + goto unwind; + } + if (file->offset != offset) { gf_log (this->name, GF_LOG_DEBUG, "unexpected offset (%"PRId64" != %"PRId64") resetting", @@ -516,19 +523,28 @@ ra_flush (call_frame_t *frame, xlator_t *this, fd_t *fd) ra_file_t *file = NULL; int ret = 0; uint64_t tmp_file = 0; + int32_t op_errno = 0; ret = fd_ctx_get (fd, this, &tmp_file); file = (ra_file_t *)(long)tmp_file; + if (file == NULL) { + op_errno = EBADF; + gf_log (this->name, GF_LOG_DEBUG, "flush received on fd with no" + " file set in its context"); + goto unwind; + } - if (file) { - flush_region (frame, file, 0, file->pages.prev->offset+1); - } + flush_region (frame, file, 0, file->pages.prev->offset+1); STACK_WIND (frame, ra_flush_cbk, FIRST_CHILD (this), FIRST_CHILD (this)->fops->flush, fd); return 0; + +unwind: + STACK_UNWIND (frame, -1, op_errno); + return 0; } @@ -538,9 +554,16 @@ ra_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync) ra_file_t *file = NULL; int ret = 0; uint64_t tmp_file = 0; + int32_t op_errno = 0; ret = fd_ctx_get (fd, this, &tmp_file); file = (ra_file_t *)(long)tmp_file; + if (file == NULL) { + op_errno = EBADF; + gf_log (this->name, GF_LOG_DEBUG, "fsync received on fd with no" + " file set in its context"); + goto unwind; + } if (file) { flush_region (frame, file, 0, file->pages.prev->offset+1); @@ -551,6 +574,10 @@ ra_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync) FIRST_CHILD (this)->fops->fsync, fd, datasync); return 0; + +unwind: + STACK_UNWIND (frame, -1, op_errno); + return 0; } @@ -568,9 +595,7 @@ ra_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this, ret = fd_ctx_get (fd, this, &tmp_file); file = (ra_file_t *)(long)tmp_file; - if (file) { - flush_region (frame, file, 0, file->pages.prev->offset+1); - } + flush_region (frame, file, 0, file->pages.prev->offset+1); frame->local = NULL; STACK_UNWIND (frame, op_ret, op_errno, stbuf); @@ -585,16 +610,21 @@ ra_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector, ra_file_t *file = NULL; int ret = 0; uint64_t tmp_file = 0; + int32_t op_errno = 0; ret = fd_ctx_get (fd, this, &tmp_file); file = (ra_file_t *)(long)tmp_file; + if (file == NULL) { + op_errno = EBADF; + gf_log (this->name, GF_LOG_DEBUG, "writev received on fd with" + "no file set in its context"); + goto unwind; + } - if (file) { - flush_region (frame, file, 0, file->pages.prev->offset+1); + flush_region (frame, file, 0, file->pages.prev->offset+1); - /* reset the read-ahead counters too */ - file->expected = file->page_count = 0; - } + /* reset the read-ahead counters too */ + file->expected = file->page_count = 0; frame->local = fd; @@ -604,6 +634,10 @@ ra_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector, fd, vector, count, offset, iobref); return 0; + +unwind: + STACK_UNWIND (frame, -1, op_errno, NULL); + return 0; } |