summaryrefslogtreecommitdiffstats
path: root/xlators/storage
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2016-06-07 16:27:34 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-06-29 21:37:08 -0700
commitaf1ab7266edf91216e27484c505c78401f092e13 (patch)
tree3fe0f59fb515fe3ae946c9d02d7a3dd762dda32c /xlators/storage
parent4d62806d3031cea33bab1641e0c14a1a8cb11c46 (diff)
libglusterfs: Implement API that provides page-aligned iobufs
Backport of: http://review.gluster.org/14672 One of the consumers of a page aligned buffer would be posix's readv fop on O_DIRECT fds. Today the way it works is by getting a page-aligned buffer through calloc, pread()ing into this buffer and then copying its contents into a newly created iobuf's ptr. This results in an extra memcpy() which can be avoided if we could implement an api that would return an iobuf whose ptr is page-aligned. That way the iobuf->ptr can be directly passed to sys_pread() as a parameter by posix translator. Change-Id: Ie44c300dc773fef8e1669d609987d47dbd340ac2 BUG: 1351024 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/14826 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Zhou Zhengping <johnzzpcrystal@gmail.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/storage')
-rw-r--r--xlators/storage/posix/src/posix.c43
1 files changed, 11 insertions, 32 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 7290905807b..836e90614f1 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -2985,8 +2985,6 @@ posix_readv (call_frame_t *frame, xlator_t *this,
int32_t op_ret = -1;
int32_t op_errno = 0;
int _fd = -1;
- char *buf = NULL;
- char *alloc_buf = NULL;
struct posix_private * priv = NULL;
struct iobuf * iobuf = NULL;
struct iobref * iobref = NULL;
@@ -3018,42 +3016,24 @@ posix_readv (call_frame_t *frame, xlator_t *this,
goto out;
}
- iobuf = iobuf_get2 (this->ctx->iobuf_pool, size);
+ iobuf = iobuf_get_page_aligned (this->ctx->iobuf_pool, size,
+ ALIGN_SIZE);
if (!iobuf) {
op_errno = ENOMEM;
goto out;
}
_fd = pfd->fd;
- if (pfd->flags & O_DIRECT) {
- alloc_buf = _page_aligned_alloc (size, &buf);
- if (!alloc_buf) {
- op_ret = -1;
- op_errno = errno;
- goto out;
- }
- op_ret = pread (_fd, buf, size, offset);
- if (op_ret == -1) {
- op_errno = errno;
- gf_msg (this->name, GF_LOG_ERROR, errno,
- P_MSG_READ_FAILED, "read failed on gfid=%s, "
- "fd=%p, offset=%"PRIu64" size=%"GF_PRI_SIZET", "
- "buf=%p", uuid_utoa (fd->inode->gfid), fd,
- offset, size, buf);
- goto out;
- }
- memcpy(iobuf->ptr, buf, size);
- } else {
- op_ret = pread (_fd, iobuf->ptr, size, offset);
- if (op_ret == -1) {
- op_errno = errno;
- gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_READ_FAILED,
- "read failed on gfid=%s, fd=%p, offset=%"PRIu64" "
- "size=%"GF_PRI_SIZET"", uuid_utoa (fd->inode->gfid), fd,
- offset, size);
- goto out;
- }
+ op_ret = pread (_fd, iobuf->ptr, size, offset);
+ if (op_ret == -1) {
+ op_errno = errno;
+ gf_msg (this->name, GF_LOG_ERROR, errno,
+ P_MSG_READ_FAILED, "read failed on gfid=%s, "
+ "fd=%p, offset=%"PRIu64" size=%"GF_PRI_SIZET", "
+ "buf=%p", uuid_utoa (fd->inode->gfid), fd,
+ offset, size, iobuf->ptr);
+ goto out;
}
LOCK (&priv->lock);
@@ -3096,7 +3076,6 @@ out:
iobref_unref (iobref);
if (iobuf)
iobuf_unref (iobuf);
- GF_FREE (alloc_buf);
return 0;
}