diff options
Diffstat (limited to 'xlators/cluster/ec')
-rw-r--r-- | xlators/cluster/ec/src/ec-dir-write.c | 4 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-heal.c | 2 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-inode-read.c | 3 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-inode-write.c | 104 |
4 files changed, 60 insertions, 53 deletions
diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c index 91467ae26e7..e8d96272987 100644 --- a/xlators/cluster/ec/src/ec-dir-write.c +++ b/xlators/cluster/ec/src/ec-dir-write.c @@ -205,7 +205,9 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state) return EC_STATE_REPORT; } - fop->int32 &= ~O_ACCMODE; + /* We need to write to specific offsets on the bricks, so we + * need to remove O_APPEND from flags (if present) */ + fop->int32 &= ~(O_ACCMODE | O_APPEND); fop->int32 |= O_RDWR; /* Fall through */ diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index 0643f250a4c..d37a657de02 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -1056,7 +1056,7 @@ void ec_heal_reopen_fd(ec_heal_t * heal) } else { - flags = ctx_fd->flags & ~O_TRUNC; + flags = ctx_fd->flags & ~(O_TRUNC | O_APPEND); if ((flags & O_ACCMODE) == O_WRONLY) { flags &= ~O_ACCMODE; diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index 64b1b719eea..a962264fde9 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -726,6 +726,9 @@ int32_t ec_manager_open(ec_fop_data_t * fop, int32_t state) fop->int32 &= ~O_ACCMODE; fop->int32 |= O_RDWR; } + /* We need to write to specific offsets on the bricks, so we + * need to remove O_APPEND from flags (if present) */ + fop->int32 &= ~O_APPEND; /* Fall through */ diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c index 9c3f6fcd115..a48ea09926a 100644 --- a/xlators/cluster/ec/src/ec-inode-write.c +++ b/xlators/cluster/ec/src/ec-inode-write.c @@ -1703,64 +1703,16 @@ out: int32_t ec_writev_init(ec_fop_data_t * fop) { - ec_t * ec = fop->xl->private; - struct iobref * iobref = NULL; - struct iobuf * iobuf = NULL; - void * ptr = NULL; ec_fd_t * ctx; ctx = ec_fd_get(fop->fd, fop->xl); - if (ctx != NULL) - { - if ((ctx->flags & O_ACCMODE) == O_RDONLY) - { + if (ctx != NULL) { + if ((ctx->flags & O_ACCMODE) == O_RDONLY) { return EBADF; } } - fop->user_size = iov_length(fop->vector, fop->int32); - fop->head = ec_adjust_offset(ec, &fop->offset, 0); - fop->size = ec_adjust_size(ec, fop->user_size + fop->head, 0); - - iobref = iobref_new(); - if (iobref == NULL) - { - goto out; - } - iobuf = iobuf_get2(fop->xl->ctx->iobuf_pool, fop->size); - if (iobuf == NULL) - { - goto out; - } - if (iobref_add(iobref, iobuf) != 0) - { - goto out; - } - - ptr = iobuf->ptr + fop->head; - ec_iov_copy_to(ptr, fop->vector, fop->int32, 0, fop->user_size); - - fop->vector[0].iov_base = iobuf->ptr; - fop->vector[0].iov_len = fop->size; - - iobuf_unref(iobuf); - - iobref_unref(fop->buffers); - fop->buffers = iobref; - return 0; - -out: - if (iobuf != NULL) - { - iobuf_unref(iobuf); - } - if (iobref != NULL) - { - iobref_unref(iobref); - } - - return EIO; } int32_t ec_writev_merge_tail(call_frame_t * frame, void * cookie, @@ -1837,9 +1789,47 @@ int32_t ec_writev_merge_head(call_frame_t * frame, void * cookie, void ec_writev_start(ec_fop_data_t * fop) { - ec_t * ec = fop->xl->private; + ec_t *ec = fop->xl->private; + struct iobref *iobref = NULL; + struct iobuf *iobuf = NULL; + void *ptr = NULL; + ec_fd_t *ctx; size_t tail; + ctx = ec_fd_get(fop->fd, fop->xl); + if (ctx != NULL) { + if ((ctx->flags & O_APPEND) != 0) { + fop->offset = fop->pre_size; + } + } + + fop->user_size = iov_length(fop->vector, fop->int32); + fop->head = ec_adjust_offset(ec, &fop->offset, 0); + fop->size = ec_adjust_size(ec, fop->user_size + fop->head, 0); + + iobref = iobref_new(); + if (iobref == NULL) { + goto out; + } + iobuf = iobuf_get2(fop->xl->ctx->iobuf_pool, fop->size); + if (iobuf == NULL) { + goto out; + } + if (iobref_add(iobref, iobuf) != 0) { + goto out; + } + + ptr = iobuf->ptr + fop->head; + ec_iov_copy_to(ptr, fop->vector, fop->int32, 0, fop->user_size); + + fop->vector[0].iov_base = iobuf->ptr; + fop->vector[0].iov_len = fop->size; + + iobuf_unref(iobuf); + + iobref_unref(fop->buffers); + fop->buffers = iobref; + if (fop->head > 0) { ec_readv(fop->frame, fop->xl, -1, EC_MINIMUM_MIN, ec_writev_merge_head, @@ -1859,6 +1849,18 @@ void ec_writev_start(ec_fop_data_t * fop) memset(fop->vector[0].iov_base + fop->size - tail, 0, tail); } } + + return; + +out: + if (iobuf != NULL) { + iobuf_unref(iobuf); + } + if (iobref != NULL) { + iobref_unref(iobref); + } + + ec_fop_set_error(fop, EIO); } int32_t ec_combine_writev(ec_fop_data_t * fop, ec_cbk_data_t * dst, |