summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix-aio.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/storage/posix/src/posix-aio.c')
-rw-r--r--xlators/storage/posix/src/posix-aio.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/xlators/storage/posix/src/posix-aio.c b/xlators/storage/posix/src/posix-aio.c
index 47460bc77b4..f8d568becac 100644
--- a/xlators/storage/posix/src/posix-aio.c
+++ b/xlators/storage/posix/src/posix-aio.c
@@ -59,14 +59,15 @@ __posix_fd_set_odirect (fd_t *fd, struct posix_fd *pfd, int opflags,
struct posix_aio_cb {
- struct iocb iocb;
- call_frame_t *frame;
- struct iobuf *iobuf;
- struct iobref *iobref;
- struct iatt prebuf;
- int fd;
- int op;
- off_t offset;
+ struct iocb iocb;
+ call_frame_t *frame;
+ struct iobuf *iobuf;
+ struct iobref *iobref;
+ struct iatt prebuf;
+ int _fd;
+ fd_t *fd;
+ int op;
+ off_t offset;
};
@@ -85,13 +86,15 @@ posix_aio_readv_complete (struct posix_aio_cb *paiocb, int res, int res2)
int ret = 0;
off_t offset = 0;
struct posix_private * priv = NULL;
+ fd_t *fd = NULL;
frame = paiocb->frame;
this = frame->this;
priv = this->private;
iobuf = paiocb->iobuf;
- _fd = paiocb->fd;
+ fd = paiocb->fd;
+ _fd = paiocb->_fd;
offset = paiocb->offset;
if (res < 0) {
@@ -105,7 +108,7 @@ posix_aio_readv_complete (struct posix_aio_cb *paiocb, int res, int res2)
goto out;
}
- ret = posix_fdstat (this, _fd, &postbuf);
+ ret = posix_fdstat (this, fd->inode, _fd, &postbuf);
if (ret != 0) {
op_ret = -1;
op_errno = errno;
@@ -148,6 +151,9 @@ out:
if (iobref)
iobref_unref (iobref);
+ if (paiocb->fd)
+ fd_unref (paiocb->fd);
+
GF_FREE (paiocb);
return 0;
@@ -205,7 +211,8 @@ posix_aio_readv (call_frame_t *frame, xlator_t *this, fd_t *fd,
paiocb->frame = frame;
paiocb->iobuf = iobuf;
paiocb->offset = offset;
- paiocb->fd = _fd;
+ paiocb->fd = fd_ref(fd);
+ paiocb->_fd = _fd;
paiocb->op = GF_FOP_READ;
paiocb->iocb.data = paiocb;
@@ -240,8 +247,11 @@ err:
if (iobuf)
iobuf_unref (iobuf);
- if (paiocb)
+ if (paiocb) {
+ if (paiocb->fd)
+ fd_unref(paiocb->fd);
GF_FREE (paiocb);
+ }
return 0;
}
@@ -259,13 +269,15 @@ posix_aio_writev_complete (struct posix_aio_cb *paiocb, int res, int res2)
int op_errno = 0;
int ret = 0;
struct posix_private * priv = NULL;
+ fd_t *fd = NULL;
frame = paiocb->frame;
this = frame->this;
priv = this->private;
prebuf = paiocb->prebuf;
- _fd = paiocb->fd;
+ fd = paiocb->fd;
+ _fd = paiocb->_fd;
if (res < 0) {
op_ret = -1;
@@ -278,7 +290,7 @@ posix_aio_writev_complete (struct posix_aio_cb *paiocb, int res, int res2)
goto out;
}
- ret = posix_fdstat (this, _fd, &postbuf);
+ ret = posix_fdstat (this, fd->inode, _fd, &postbuf);
if (ret != 0) {
op_ret = -1;
op_errno = errno;
@@ -304,6 +316,8 @@ out:
if (paiocb) {
if (paiocb->iobref)
iobref_unref (paiocb->iobref);
+ if (paiocb->fd)
+ fd_unref(paiocb->fd);
GF_FREE (paiocb);
}
@@ -318,7 +332,7 @@ posix_aio_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
{
int32_t op_errno = EINVAL;
int _fd = -1;
- struct posix_fd * pfd = NULL;
+ struct posix_fd *pfd = NULL;
int ret = -1;
struct posix_aio_cb *paiocb = NULL;
struct posix_private *priv = NULL;
@@ -349,7 +363,8 @@ posix_aio_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
paiocb->frame = frame;
paiocb->offset = offset;
- paiocb->fd = _fd;
+ paiocb->fd = fd_ref(fd);
+ paiocb->_fd = _fd;
paiocb->op = GF_FOP_WRITE;
paiocb->iocb.data = paiocb;
@@ -363,7 +378,7 @@ posix_aio_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
iocb = &paiocb->iocb;
- ret = posix_fdstat (this, _fd, &paiocb->prebuf);
+ ret = posix_fdstat (this, fd->inode, _fd, &paiocb->prebuf);
if (ret != 0) {
op_errno = errno;
gf_msg (this->name, GF_LOG_ERROR, op_errno, P_MSG_FSTAT_FAILED,
@@ -397,6 +412,8 @@ err:
if (paiocb) {
if (paiocb->iobref)
iobref_unref (paiocb->iobref);
+ if (paiocb->fd)
+ fd_unref(paiocb->fd);
GF_FREE (paiocb);
}