summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2016-06-07 16:27:34 +0530
committerJeff Darcy <jdarcy@redhat.com>2016-06-28 14:52:42 -0700
commit1e60f9746cf7cb8ce34e2b1572410c39b11d7664 (patch)
tree82c839e73e452222a2b9445c535d0241306bcf41 /xlators
parent60cc8ddaf6105b89e5ce3222c5c5a014deda6a15 (diff)
libglusterfs: Implement API that provides page-aligned iobufs
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: I385139bc6ee309fc501034b3af8f7814fab8cd65 BUG: 1343838 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/14672 CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Zhou Zhengping <johnzzpcrystal@gmail.com> Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r--xlators/storage/posix/src/posix.c44
1 files changed, 11 insertions, 33 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index deecb09a954..a362e633297 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -3043,8 +3043,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;
@@ -3075,42 +3073,23 @@ 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 = sys_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 = sys_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 = sys_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);
@@ -3153,7 +3132,6 @@ out:
iobref_unref (iobref);
if (iobuf)
iobuf_unref (iobuf);
- GF_FREE (alloc_buf);
return 0;
}