diff options
Diffstat (limited to 'xlators/storage/posix/src')
| -rw-r--r-- | xlators/storage/posix/src/posix-aio.c | 51 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-entry-ops.c | 101 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-handle.c | 22 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-handle.h | 8 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 60 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-inode-fd-ops.c | 65 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-inode-handle.h | 5 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-messages.h | 3 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-metadata.c | 8 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-metadata.h | 2 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.h | 11 | 
11 files changed, 233 insertions, 103 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);          } diff --git a/xlators/storage/posix/src/posix-entry-ops.c b/xlators/storage/posix/src/posix-entry-ops.c index 438fbe509e4..d42a7f76e10 100644 --- a/xlators/storage/posix/src/posix-entry-ops.c +++ b/xlators/storage/posix/src/posix-entry-ops.c @@ -277,7 +277,8 @@ unlock:  parent:          if (par_path) { -                op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +                op_ret = posix_pstat (this, loc->parent, loc->pargfid, +                                      par_path, &postparent, _gf_false);                  if (op_ret == -1) {                          op_errno = errno;                          gf_msg (this->name, GF_LOG_ERROR, errno, @@ -362,7 +363,8 @@ posix_mknod (call_frame_t *frame, xlator_t *this,          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &preparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -482,7 +484,7 @@ ignore:                  }          } -        op_ret = posix_pstat (this, NULL, real_path, &stbuf); +        op_ret = posix_pstat (this, loc->inode, NULL, real_path, &stbuf, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_MKNOD_FAILED, @@ -490,7 +492,8 @@ ignore:                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &postparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -585,7 +588,7 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,          gid = frame->root->gid; -        op_ret = posix_pstat (this, NULL, real_path, &stbuf); +        op_ret = posix_pstat (this, loc->inode, NULL, real_path, &stbuf, _gf_false);          SET_FS_ID (frame->root->uid, gid); @@ -603,7 +606,7 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,          }          if (!gf_uuid_is_null (uuid_req)) { -                op_ret = posix_istat (this, uuid_req, NULL, &stbuf); +                op_ret = posix_istat (this, loc->inode, uuid_req, NULL, &stbuf);                  if ((op_ret == 0) && IA_ISDIR (stbuf.ia_type)) {                          size = posix_handle_path (this, uuid_req, NULL, NULL,                                                    0); @@ -647,7 +650,8 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &preparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -796,7 +800,7 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,                  gfid_set = _gf_true;          } -        op_ret = posix_pstat (this, NULL, real_path, &stbuf); +        op_ret = posix_pstat (this, loc->inode, NULL, real_path, &stbuf, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -804,7 +808,8 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &postparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -932,7 +937,11 @@ posix_unlink_gfid_handle_and_entry (xlator_t *this, const char *real_path,          if (get_link_count) {                  LOCK (&loc->inode->lock);                  locked = _gf_true; -                ret = posix_pstat (this, loc->gfid, real_path, &prebuf); +                /* Since this stat is to get link count and not for time +                 * attributes, intentionally passing inode as NULL +                 */ +                ret = posix_pstat (this, NULL, loc->gfid, real_path, +                                   &prebuf, _gf_true);                  if (ret) {                          gf_msg (this->name, GF_LOG_ERROR, errno,                                  P_MSG_LSTAT_FAILED, "lstat on %s failed", @@ -1049,7 +1058,8 @@ posix_unlink (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &preparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1191,7 +1201,7 @@ posix_unlink (call_frame_t *frame, xlator_t *this,          }          if (fdstat_requested) { -                op_ret = posix_fdstat (this, fd, &postbuf); +                op_ret = posix_fdstat (this, loc->inode, fd, &postbuf);                  if (op_ret == -1) {                          op_errno = errno;                          gf_msg (this->name, GF_LOG_ERROR, errno, @@ -1202,7 +1212,8 @@ posix_unlink (call_frame_t *frame, xlator_t *this,                  op_ret = posix_set_iatt_in_dict (unwind_dict, &postbuf);          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &postparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1276,7 +1287,8 @@ posix_rmdir (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &preparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1333,7 +1345,8 @@ posix_rmdir (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &postparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1393,7 +1406,8 @@ posix_symlink (call_frame_t *frame, xlator_t *this,          SET_FS_ID (frame->root->uid, gid); -        op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &preparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1461,7 +1475,7 @@ ignore:                  gfid_set = _gf_true;          } -        op_ret = posix_pstat (this, NULL, real_path, &stbuf); +        op_ret = posix_pstat (this, loc->inode, NULL, real_path, &stbuf, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1469,7 +1483,8 @@ ignore:                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &postparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1563,7 +1578,8 @@ posix_rename (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, oldloc->pargfid, par_oldpath, &preoldparent); +        op_ret = posix_pstat (this, oldloc->parent, oldloc->pargfid, +                              par_oldpath, &preoldparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1572,7 +1588,8 @@ posix_rename (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, newloc->pargfid, par_newpath, &prenewparent); +        op_ret = posix_pstat (this, newloc->parent, newloc->pargfid, +                              par_newpath, &prenewparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1581,7 +1598,8 @@ posix_rename (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, NULL, real_newpath, &stbuf); +        op_ret = posix_pstat (this, newloc->inode, NULL, real_newpath, &stbuf, +                              _gf_false);          if ((op_ret == -1) && (errno == ENOENT)){                  was_present = 0;          } else { @@ -1650,8 +1668,8 @@ posix_rename (call_frame_t *frame, xlator_t *this,                          pthread_mutex_lock (&ctx_new->pgfid_lock);                          locked = _gf_true;                          get_link_count = _gf_true; -                        op_ret = posix_pstat (this, newloc->gfid, real_newpath, -                                              &stbuf); +                        op_ret = posix_pstat (this, newloc->inode, newloc->gfid, +                                              real_newpath, &stbuf, _gf_false);                          if ((op_ret == -1) && (errno != ENOENT)) {                                  op_errno = errno;                                  gf_msg (this->name, GF_LOG_ERROR, errno, @@ -1751,7 +1769,8 @@ unlock:                                     oldloc->inode->gfid, NULL);          } -        op_ret = posix_pstat (this, NULL, real_newpath, &stbuf); +        op_ret = posix_pstat (this, newloc->inode, NULL, real_newpath, &stbuf, +                              _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1759,7 +1778,8 @@ unlock:                  goto out;          } -        op_ret = posix_pstat (this, oldloc->pargfid, par_oldpath, &postoldparent); +        op_ret = posix_pstat (this, oldloc->parent, oldloc->pargfid, +                              par_oldpath, &postoldparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1768,7 +1788,8 @@ unlock:                  goto out;          } -        op_ret = posix_pstat (this, newloc->pargfid, par_newpath, &postnewparent); +        op_ret = posix_pstat (this, newloc->parent, newloc->pargfid, +                              par_newpath, &postnewparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1847,7 +1868,8 @@ posix_link (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, newloc->pargfid, par_newpath, &preparent); +        op_ret = posix_pstat (this, newloc->parent, newloc->pargfid, +                              par_newpath, &preparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1868,7 +1890,8 @@ posix_link (call_frame_t *frame, xlator_t *this,          entry_created = _gf_true; -        op_ret = posix_pstat (this, NULL, real_newpath, &stbuf); +        op_ret = posix_pstat (this, newloc->inode, NULL, real_newpath, &stbuf, +                              _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1876,7 +1899,8 @@ posix_link (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, newloc->pargfid, par_newpath, &postparent); +        op_ret = posix_pstat (this, newloc->parent, newloc->pargfid, +                              par_newpath, &postparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1996,7 +2020,8 @@ posix_create (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &preparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -2016,7 +2041,8 @@ posix_create (call_frame_t *frame, xlator_t *this,                  _flags = flags | O_CREAT;          } -        op_ret = posix_pstat (this, NULL, real_path, &stbuf); +        op_ret = posix_pstat (this, loc->inode, NULL, real_path, &stbuf, +                              _gf_false);          if ((op_ret == -1) && (errno == ENOENT)) {                  was_present = 0;          } @@ -2086,7 +2112,7 @@ fill_stat:                  gfid_set = _gf_true;          } -        op_ret = posix_fdstat (this, _fd, &stbuf); +        op_ret = posix_fdstat (this, loc->inode, _fd, &stbuf);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -2094,7 +2120,8 @@ fill_stat:                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &postparent, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -2170,7 +2197,8 @@ posix_put (call_frame_t *frame, xlator_t *this, loc_t *loc,          MAKE_ENTRY_HANDLE (real_path, par_path, this, loc, &stbuf); -        op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &preparent, _gf_false);          if (op_ret < 0) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -2199,7 +2227,8 @@ posix_put (call_frame_t *frame, xlator_t *this, loc_t *loc,                  goto out;          } -        op_ret = posix_pstat (this, loc->pargfid, par_path, &postparent); +        op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, +                              &postparent, _gf_false);          if (op_ret < 0) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -2233,7 +2262,7 @@ posix_put (call_frame_t *frame, xlator_t *this, loc_t *loc,                  goto out;          } -        op_ret = posix_pstat (this, loc->gfid, real_path, &stbuf); +        op_ret = posix_pstat (this, loc->inode, loc->gfid, real_path, &stbuf, _gf_false);          if (op_ret < 0) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, diff --git a/xlators/storage/posix/src/posix-handle.c b/xlators/storage/posix/src/posix-handle.c index a3a8ea464d3..0bb4c055a3c 100644 --- a/xlators/storage/posix/src/posix-handle.c +++ b/xlators/storage/posix/src/posix-handle.c @@ -23,6 +23,7 @@  #include "xlator.h"  #include "syscall.h"  #include "posix-messages.h" +#include "posix-metadata.h"  #include "compat-errno.h" @@ -36,7 +37,7 @@ posix_resolve (xlator_t *this, inode_table_t *itable, inode_t *parent,          inode_t     *inode = NULL;          int          ret   = -1; -        ret = posix_istat (this, parent->gfid, bname, iabuf); +        ret = posix_istat (this, NULL, parent->gfid, bname, iabuf);          if (ret < 0) {                  gf_log (this->name, GF_LOG_WARNING, "gfid: %s, bname: %s "                          "failed", uuid_utoa (parent->gfid), bname); @@ -53,6 +54,19 @@ posix_resolve (xlator_t *this, inode_table_t *itable, inode_t *parent,                  }          } +        /* posix_istat wouldn't have fetched posix_mdata_t i.e., +         * time attributes as inode is passed as NULL, hence get +         * here once you got the inode +         */ +        ret = posix_get_mdata_xattr (this, NULL, -1, inode, iabuf); +        if (ret) { +                gf_msg (this->name, GF_LOG_WARNING, errno, +                        P_MSG_GETMDATA_FAILED, +                        "posix get mdata failed on gfid:%s", +                        uuid_utoa (inode->gfid)); +                goto out; +        } +          /* Linking an inode here, can cause a race in posix_acl.             Parent inode gets linked here, but before             it reaches posix_acl_readdirp_cbk, create/lookup can @@ -939,8 +953,10 @@ posix_handle_unset (xlator_t *this, uuid_t gfid, const char *basename)                  return -1;          } -        ret = posix_istat (this, gfid, basename, &stat); - +        /* stat is being used only for gfid, so passing a NULL inode +         * doesn't fetch time attributes which is fine +         */ +        ret = posix_istat (this, NULL, gfid, basename, &stat);          if (ret == -1) {                  gf_msg (this->name, GF_LOG_WARNING, errno,                          P_MSG_HANDLE_DELETE, "%s", path); diff --git a/xlators/storage/posix/src/posix-handle.h b/xlators/storage/posix/src/posix-handle.h index 78da75d5358..b12e8b9610c 100644 --- a/xlators/storage/posix/src/posix-handle.h +++ b/xlators/storage/posix/src/posix-handle.h @@ -146,17 +146,19 @@                  MAKE_REAL_PATH (entp, this, loc->path);                 \                  __parp = strdupa (entp);                                \                  parp = dirname (__parp);                                \ -                op_ret = posix_pstat (this, NULL, entp, ent_p);         \ +                op_ret = posix_pstat (this, loc->inode, NULL, entp, ent_p, \ +                                     _gf_false);                        \                  break;                                                  \          }                                                               \          errno = 0;                                                      \ -        op_ret = posix_istat (this, loc->pargfid, loc->name, ent_p);    \ +        op_ret = posix_istat (this, loc->inode, loc->pargfid,           \ +                              loc->name, ent_p);                        \          if (errno != ELOOP) {                                           \                  MAKE_HANDLE_PATH (parp, this, loc->pargfid, NULL);      \                  MAKE_HANDLE_PATH (entp, this, loc->pargfid, loc->name); \                  if (!parp || !entp) {                                   \                          gf_msg (this->name, GF_LOG_ERROR, errno,        \ -                                P_MSG_ENTRY_HANDLE_CREATE,      \ +                                P_MSG_ENTRY_HANDLE_CREATE,              \                                  "Failed to create entry handle "        \                                  "for path %s", loc->path);              \                  }                                                       \ diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index e9d379fda07..6a34e38cbbc 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -39,6 +39,7 @@  #include "logging.h"  #include "posix.h"  #include "posix-messages.h" +#include "posix-metadata.h"  #include "posix-handle.h"  #include "xlator.h"  #include "defaults.h" @@ -600,7 +601,7 @@ out:  }  int -posix_fdstat (xlator_t *this, int fd, struct iatt *stbuf_p) +posix_fdstat (xlator_t *this, inode_t *inode, int fd, struct iatt *stbuf_p)  {          int                    ret     = 0;          struct stat            fstatbuf = {0, }; @@ -615,6 +616,16 @@ posix_fdstat (xlator_t *this, int fd, struct iatt *stbuf_p)          iatt_from_stat (&stbuf, &fstatbuf); +        if (inode && is_ctime_enabled()) { +                ret = posix_get_mdata_xattr (this, NULL, fd, inode, &stbuf); +                if (ret) { +                        gf_msg (this->name, GF_LOG_WARNING, errno, +                                P_MSG_GETMDATA_FAILED, +                                "posix get mdata failed on gfid: %s", +                                uuid_utoa(inode->gfid)); +                        goto out; +                } +        }          ret = posix_fill_gfid_fd (this, fd, &stbuf);          stbuf.ia_flags |= IATT_GFID; @@ -628,8 +639,12 @@ out:  } +/* The inode here is expected to update posix_mdata stored on disk. + * Don't use it as a general purpose inode and don't expect it to + * be always exists + */  int -posix_istat (xlator_t *this, uuid_t gfid, const char *basename, +posix_istat (xlator_t *this, inode_t *inode, uuid_t gfid, const char *basename,               struct iatt *buf_p)  {          char        *real_path = NULL; @@ -683,6 +698,17 @@ posix_istat (xlator_t *this, uuid_t gfid, const char *basename,          iatt_from_stat (&stbuf, &lstatbuf); +        if (inode && is_ctime_enabled()) { +                ret = posix_get_mdata_xattr (this, real_path, -1, inode, +                                             &stbuf); +                if (ret) { +                        gf_msg (this->name, GF_LOG_WARNING, errno, +                                P_MSG_GETMDATA_FAILED, +                                "posix get mdata failed on %s", real_path); +                        goto out; +                } +        } +          if (basename)                  posix_fill_gfid_path (this, real_path, &stbuf);          else @@ -700,8 +726,8 @@ out:  int -posix_pstat (xlator_t *this, uuid_t gfid, const char *path, -             struct iatt *buf_p) +posix_pstat (xlator_t *this, inode_t *inode, uuid_t gfid, const char *path, +             struct iatt *buf_p, gf_boolean_t inode_locked)  {          struct stat  lstatbuf = {0, };          struct iatt  stbuf = {0, }; @@ -740,6 +766,21 @@ posix_pstat (xlator_t *this, uuid_t gfid, const char *path,          iatt_from_stat (&stbuf, &lstatbuf); +        if (inode && is_ctime_enabled()) { +                if (!inode_locked) { +                        ret = posix_get_mdata_xattr (this, path, -1, inode, &stbuf); +                } else { +                        ret = __posix_get_mdata_xattr (this, path, -1, inode, &stbuf); +                } +                if (ret) { +                        gf_msg (this->name, GF_LOG_WARNING, errno, +                                P_MSG_GETMDATA_FAILED, +                                "posix get mdata failed on gfid: %s", +                                uuid_utoa(inode->gfid)); +                        goto out; +                } +        } +          posix_fill_ino_from_gfid (this, &stbuf);          if (buf_p) @@ -1033,7 +1074,11 @@ posix_get_file_contents (xlator_t *this, uuid_t pargfid,                  goto out;          } -        op_ret = posix_istat (this, pargfid, name, &stbuf); +        /* TODO: Not fetching posix_mdata_t. This is fine without +         * RIO as this routine is only interested in file contents. +         * Need to check how does this function fits into RIO? +         */ +        op_ret = posix_istat (this, NULL, pargfid, name, &stbuf);          if (op_ret == -1) {                  op_ret = -errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_XDATA_GETXATTR, @@ -1377,7 +1422,10 @@ janitor_walker (const char *fpath, const struct stat *sb,          xlator_t     *this = NULL;          this = THIS; -        posix_pstat (this, NULL, fpath, &stbuf); +        /* posix_mdata_t is not filled, no time or size attributes +         * are being used, so fine. +         */ +        posix_pstat (this, NULL, NULL, fpath, &stbuf, _gf_false);          switch (sb->st_mode & S_IFMT) {          case S_IFREG:          case S_IFBLK: diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c index 4aa70baf3bd..c6145e880f4 100644 --- a/xlators/storage/posix/src/posix-inode-fd-ops.c +++ b/xlators/storage/posix/src/posix-inode-fd-ops.c @@ -386,7 +386,8 @@ posix_setattr (call_frame_t *frame, xlator_t *this,                  }          } -        op_ret = posix_pstat (this, loc->gfid, real_path, &statpost); +        op_ret = posix_pstat (this, loc->inode, loc->gfid, real_path, +                              &statpost, _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -519,7 +520,7 @@ posix_fsetattr (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_fdstat (this, pfd->fd, &statpre); +        op_ret = posix_fdstat (this, fd->inode, pfd->fd, &statpre);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -574,7 +575,7 @@ posix_fsetattr (call_frame_t *frame, xlator_t *this,                  }          } -        op_ret = posix_fdstat (this, pfd->fd, &statpost); +        op_ret = posix_fdstat (this, fd->inode, pfd->fd, &statpost);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -648,7 +649,7 @@ posix_do_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd,                  pthread_mutex_lock (&ctx->write_atomic_lock);          } -        ret = posix_fdstat (this, pfd->fd, statpre); +        ret = posix_fdstat (this, fd->inode, pfd->fd, statpre);          if (ret == -1) {                  ret = -errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -677,7 +678,7 @@ posix_do_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd,                  goto out;          } -        ret = posix_fdstat (this, pfd->fd, statpost); +        ret = posix_fdstat (this, fd->inode, pfd->fd, statpost);          if (ret == -1) {                  ret = -errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -830,7 +831,7 @@ posix_do_zerofill (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,                  pthread_mutex_lock (&ctx->write_atomic_lock);          } -        ret = posix_fdstat (this, pfd->fd, statpre); +        ret = posix_fdstat (this, fd->inode, pfd->fd, statpre);          if (ret == -1) {                  ret = -errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -878,7 +879,7 @@ fsync:                  }          } -        ret = posix_fdstat (this, pfd->fd, statpost); +        ret = posix_fdstat (this, fd->inode, pfd->fd, statpost);          if (ret == -1) {                  ret = -errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -1044,7 +1045,7 @@ posix_seek (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,          }          if (xdata) { -                ret = posix_fdstat (this, pfd->fd, &preop); +                ret = posix_fdstat (this, fd->inode, pfd->fd, &preop);                  if (ret == -1) {                          ret = -errno;                          gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -1296,7 +1297,8 @@ posix_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,                  goto out;          } -        op_ret = posix_pstat (this, loc->gfid, real_path, &postbuf); +        op_ret = posix_pstat (this, loc->inode, loc->gfid, real_path, &postbuf, +                              _gf_false);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_LSTAT_FAILED, @@ -1455,7 +1457,7 @@ posix_readv (call_frame_t *frame, xlator_t *this,          _fd = pfd->fd;          if (xdata) { -                op_ret = posix_fdstat (this, _fd, &preop); +                op_ret = posix_fdstat (this, fd->inode, _fd, &preop);                  if (op_ret == -1) {                          op_errno = errno;                          gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -1501,7 +1503,7 @@ posix_readv (call_frame_t *frame, xlator_t *this,           *  we read from           */ -        op_ret = posix_fdstat (this, _fd, &stbuf); +        op_ret = posix_fdstat (this, fd->inode, _fd, &stbuf);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -1749,7 +1751,7 @@ posix_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,                  pthread_mutex_lock (&ctx->write_atomic_lock);          } -        op_ret = posix_fdstat (this, _fd, &preop); +        op_ret = posix_fdstat (this, fd->inode, _fd, &preop);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -1795,7 +1797,7 @@ posix_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,           * the file we wrote to           */ -        ret = posix_fdstat (this, _fd, &postop); +        ret = posix_fdstat (this, fd->inode, _fd, &postop);          if (ret == -1) {                  op_ret = -1;                  op_errno = errno; @@ -2069,7 +2071,7 @@ posix_fsync (call_frame_t *frame, xlator_t *this,          _fd = pfd->fd; -        op_ret = posix_fdstat (this, _fd, &preop); +        op_ret = posix_fdstat (this, fd->inode, _fd, &preop);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_WARNING, errno, P_MSG_FSTAT_FAILED, @@ -2097,7 +2099,7 @@ posix_fsync (call_frame_t *frame, xlator_t *this,                  }          } -        op_ret = posix_fdstat (this, _fd, &postop); +        op_ret = posix_fdstat (this, fd->inode, _fd, &postop);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_WARNING, errno, P_MSG_FSTAT_FAILED, @@ -2187,7 +2189,7 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,                  goto out;          } -        posix_pstat(this, loc->gfid, real_path, &stbuf); +        posix_pstat(this, loc->inode, loc->gfid, real_path, &stbuf, _gf_false);          op_ret = -1; @@ -2213,7 +2215,8 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,                          goto unlock;                  } -                ret = posix_pstat (this, NULL, real_path, &tmp_stbuf); +                ret = posix_pstat (this, loc->inode, loc->gfid, real_path, +                                   &tmp_stbuf, _gf_true);                  if (ret) {                          op_errno = EINVAL;                          goto unlock; @@ -2316,7 +2319,8 @@ unlock:   * Ignore errors for now   */          if (xdata && dict_get (xdata, DHT_IATT_IN_XDATA_KEY)) { -                ret = posix_pstat(this, loc->gfid, real_path, &stbuf); +                ret = posix_pstat(this, loc->inode, loc->gfid, real_path, +                                  &stbuf, _gf_false);                  if (ret)                          goto out; @@ -3702,7 +3706,7 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,          }          _fd = pfd->fd; -        ret = posix_fdstat (this, pfd->fd, &stbuf); +        ret = posix_fdstat (this, fd->inode, pfd->fd, &stbuf);          if (ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, op_errno, @@ -3742,7 +3746,7 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,          }          if (xdata && dict_get (xdata, DHT_IATT_IN_XDATA_KEY)) { -                ret = posix_fdstat (this, pfd->fd, &stbuf); +                ret = posix_fdstat (this, fd->inode, pfd->fd, &stbuf);                  if (ret == -1) {                          op_errno = errno;                          gf_msg (this->name, GF_LOG_ERROR, op_errno, @@ -3924,9 +3928,10 @@ posix_common_removexattr (call_frame_t *frame, loc_t *loc, fd_t *fd,          if (xdata && dict_get (xdata, DHT_IATT_IN_XDATA_KEY)) {                  if (loc) -                        ret = posix_pstat(this, loc->gfid, real_path, &stbuf); +                        ret = posix_pstat(this, inode, loc->gfid, +                                          real_path, &stbuf, _gf_false);                  else -                        ret = posix_fdstat (this, _fd, &stbuf); +                        ret = posix_fdstat (this, inode, _fd, &stbuf);                  if (ret)                          goto out;                  *xdata_rsp = dict_new(); @@ -4425,10 +4430,10 @@ do_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,                  goto out;          if (fd) { -                op_ret = posix_fdstat (this, _fd, &stbuf); +                op_ret = posix_fdstat (this, inode, _fd, &stbuf);          } else { -                op_ret = posix_pstat (this, inode->gfid, real_path, -                                      &stbuf); +                op_ret = posix_pstat (this, inode, inode->gfid, real_path, +                                      &stbuf, _gf_false);          }          if (op_ret < 0) {                  op_errno = errno; @@ -4544,7 +4549,7 @@ posix_ftruncate (call_frame_t *frame, xlator_t *this,          _fd = pfd->fd; -        op_ret = posix_fdstat (this, _fd, &preop); +        op_ret = posix_fdstat (this, fd->inode, _fd, &preop);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -4572,7 +4577,7 @@ posix_ftruncate (call_frame_t *frame, xlator_t *this,                  goto out;          } -        op_ret = posix_fdstat (this, _fd, &postop); +        op_ret = posix_fdstat (this, fd->inode, _fd, &postop);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -4627,7 +4632,7 @@ posix_fstat (call_frame_t *frame, xlator_t *this,          _fd = pfd->fd; -        op_ret = posix_fdstat (this, _fd, &buf); +        op_ret = posix_fdstat (this, fd->inode, _fd, &buf);          if (op_ret == -1) {                  op_errno = errno;                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, @@ -4992,7 +4997,7 @@ posix_readdirp_fill (xlator_t *this, fd_t *fd, gf_dirent_t *entries, dict_t *dic                  strcpy (&hpath[len+1], entry->d_name); -                ret = posix_pstat (this, gfid, hpath, &stbuf); +                ret = posix_pstat (this, inode, gfid, hpath, &stbuf, _gf_false);                  if (ret == -1) {                          if (inode) @@ -5205,7 +5210,7 @@ posix_rchecksum (call_frame_t *frame, xlator_t *this,          _fd = pfd->fd;          if (xdata) { -                op_ret = posix_fdstat (this, _fd, &preop); +                op_ret = posix_fdstat (this, fd->inode, _fd, &preop);                          if (op_ret == -1) {                                  op_errno = errno;                                  gf_msg (this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, diff --git a/xlators/storage/posix/src/posix-inode-handle.h b/xlators/storage/posix/src/posix-inode-handle.h index b6cb871e007..33d908fa3de 100644 --- a/xlators/storage/posix/src/posix-inode-handle.h +++ b/xlators/storage/posix/src/posix-inode-handle.h @@ -69,11 +69,12 @@          }                                                               \          if (LOC_IS_DIR (loc) && LOC_HAS_ABSPATH (loc)) {                \                  MAKE_REAL_PATH (rpath, this, (loc)->path);              \ -                op_ret = posix_pstat (this, (loc)->gfid, rpath, iatt_p); \ +                op_ret = posix_pstat (this, (loc)->inode, (loc)->gfid,  \ +                                      rpath, iatt_p, _gf_false);        \                  break;                                                  \          }                                                               \          errno = 0;                                                      \ -        op_ret = posix_istat (this, loc->gfid, NULL, iatt_p);           \ +        op_ret = posix_istat (this, loc->inode, loc->gfid, NULL, iatt_p); \          if (errno != ELOOP) {                                           \                  MAKE_HANDLE_PATH (rpath, this, (loc)->gfid, NULL);      \                  if (!rpath) {                                           \ diff --git a/xlators/storage/posix/src/posix-messages.h b/xlators/storage/posix/src/posix-messages.h index 6b5332b6d09..b83a7b18809 100644 --- a/xlators/storage/posix/src/posix-messages.h +++ b/xlators/storage/posix/src/posix-messages.h @@ -138,7 +138,8 @@ GLFS_MSGID(POSIX,          P_MSG_DISK_SPACE_CHECK_FAILED,          P_MSG_FALLOCATE_FAILED,          P_MSG_STOREMDATA_FAILED, -        P_MSG_FETCHMDATA_FAILED +        P_MSG_FETCHMDATA_FAILED, +        P_MSG_GETMDATA_FAILED  );  #endif /* !_GLUSTERD_MESSAGES_H_ */ diff --git a/xlators/storage/posix/src/posix-metadata.c b/xlators/storage/posix/src/posix-metadata.c index 4e75a4f1411..57f32f9359c 100644 --- a/xlators/storage/posix/src/posix-metadata.c +++ b/xlators/storage/posix/src/posix-metadata.c @@ -508,3 +508,11 @@ posix_update_utime_in_mdata (xlator_t *this, const char *real_path, int fd,                                       &flag);          return ret;  } + +gf_boolean_t +is_ctime_enabled () { +        /* TODO: This gets implemented once glusterd changes are in place to + *          * enable and disable ctime feature + *                   */ +        return _gf_false; +} diff --git a/xlators/storage/posix/src/posix-metadata.h b/xlators/storage/posix/src/posix-metadata.h index b654c83230c..a6bde785abe 100644 --- a/xlators/storage/posix/src/posix-metadata.h +++ b/xlators/storage/posix/src/posix-metadata.h @@ -45,5 +45,7 @@ posix_set_mdata_xattr (xlator_t *this, const char *real_path, int fd,  int  posix_update_utime_in_mdata (xlator_t *this, const char *real_path, int fd,                               inode_t *inode, struct iatt *stbuf, int valid); +gf_boolean_t +is_ctime_enabled();  #endif /* _POSIX_METADATA_H */ diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h index 60a7132ddcb..9712b675eb1 100644 --- a/xlators/storage/posix/src/posix.h +++ b/xlators/storage/posix/src/posix.h @@ -327,11 +327,12 @@ int __posix_inode_ctx_get_all (inode_t *inode, xlator_t *this,  int posix_gfid_set (xlator_t *this, const char *path, loc_t *loc,                      dict_t *xattr_req); -int posix_fdstat (xlator_t *this, int fd, struct iatt *stbuf_p); -int posix_istat (xlator_t *this, uuid_t gfid, const char *basename, -                 struct iatt *iatt); -int posix_pstat (xlator_t *this, uuid_t gfid, const char *real_path, -                 struct iatt *iatt); +int posix_fdstat (xlator_t *this, inode_t *inode, int fd, struct iatt *stbuf_p); +int posix_istat (xlator_t *this, inode_t *inode, uuid_t gfid, +                 const char *basename, struct iatt *iatt); +int posix_pstat (xlator_t *this, inode_t *inode, uuid_t gfid, +                 const char *real_path, struct iatt *iatt, +                 gf_boolean_t inode_locked);  dict_t *posix_xattr_fill (xlator_t *this, const char *path, loc_t *loc,                            fd_t *fd, int fdnum, dict_t *xattr, struct iatt *buf);  int posix_handle_pair (xlator_t *this, const char *real_path, char *key,  | 
