diff options
Diffstat (limited to 'xlators/storage/posix/src/posix-aio.c')
-rw-r--r-- | xlators/storage/posix/src/posix-aio.c | 51 |
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); } |