diff options
| author | Anand Avati <avati@redhat.com> | 2013-08-10 16:10:26 -0700 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2013-08-19 23:03:27 -0700 | 
| commit | a232deaa82c561013d66322afdc1de1f526ecbd4 (patch) | |
| tree | fb64e0b2d6d387f3e8a4e4163d0f1e0da7749a06 /xlators | |
| parent | 41fa8da33435b8ba05a7eddbccddd96cde1aa762 (diff) | |
md-cache: invalidate attributes on xattr update
xattr update will result in at least ctime change. So invalidate
attributes in xattr callback.
Change-Id: Ie6e8f2fd9a11c56c27e78bd58c2ff1e1d6edce6e
BUG: 953694
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/5641
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/performance/md-cache/src/md-cache.c | 164 | 
1 files changed, 164 insertions, 0 deletions
diff --git a/xlators/performance/md-cache/src/md-cache.c b/xlators/performance/md-cache/src/md-cache.c index f10d5fc43e7..ba8b1b87925 100644 --- a/xlators/performance/md-cache/src/md-cache.c +++ b/xlators/performance/md-cache/src/md-cache.c @@ -132,6 +132,7 @@ struct mdc_local {          loc_t   loc2;          fd_t   *fd;          char   *linkname; +	char   *key;          dict_t *xattr;  }; @@ -229,6 +230,8 @@ mdc_local_wipe (xlator_t *this, mdc_local_t *local)          GF_FREE (local->linkname); +        GF_FREE (local->key); +          if (local->xattr)                  dict_unref (local->xattr); @@ -585,6 +588,31 @@ out:  int +mdc_inode_xatt_unset (xlator_t *this, inode_t *inode, char *name) +{ +        int              ret = -1; +        struct md_cache *mdc = NULL; + +        mdc = mdc_inode_prep (this, inode); +        if (!mdc) +                goto out; + +        if (!name) +                goto out; + +        LOCK (&mdc->lock); +        { +		dict_del (mdc->xattr, name); +        } +        UNLOCK (&mdc->lock); + +        ret = 0; +out: +        return ret; +} + + +int  mdc_inode_xatt_get (xlator_t *this, inode_t *inode, dict_t **dict)  {          int              ret = -1; @@ -616,6 +644,46 @@ out:  } +int +mdc_inode_iatt_invalidate (xlator_t *this, inode_t *inode) +{ +        int              ret = -1; +        struct md_cache *mdc = NULL; + +        if (mdc_inode_ctx_get (this, inode, &mdc) != 0) +                goto out; + +        LOCK (&mdc->lock); +        { +		mdc->ia_time = 0; +        } +        UNLOCK (&mdc->lock); + +out: +        return ret; +} + + +int +mdc_inode_xatt_invalidate (xlator_t *this, inode_t *inode) +{ +        int              ret = -1; +        struct md_cache *mdc = NULL; + +        if (mdc_inode_ctx_get (this, inode, &mdc) != 0) +                goto out; + +        LOCK (&mdc->lock); +        { +		mdc->xa_time = 0; +        } +        UNLOCK (&mdc->lock); + +out: +        return ret; +} + +  void  mdc_load_reqs (xlator_t *this, dict_t *dict)  { @@ -1579,6 +1647,8 @@ mdc_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          mdc_inode_xatt_update (this, local->loc.inode, local->xattr); +	mdc_inode_iatt_invalidate (this, local->loc.inode); +  out:          MDC_STACK_UNWIND (setxattr, frame, op_ret, op_errno, xdata); @@ -1620,6 +1690,7 @@ mdc_fsetxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          mdc_inode_xatt_update (this, local->fd->inode, local->xattr); +	mdc_inode_iatt_invalidate (this, local->fd->inode);  out:          MDC_STACK_UNWIND (fsetxattr, frame, op_ret, op_errno, xdata); @@ -1767,6 +1838,97 @@ uncached:          return 0;  } +int +mdc_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +		     int32_t op_ret, int32_t op_errno, dict_t *xdata) +{ +        mdc_local_t  *local = NULL; + +        local = frame->local; + +        if (op_ret != 0) +                goto out; + +        if (!local) +                goto out; + +	if (local->key) +		mdc_inode_xatt_unset (this, local->loc.inode, local->key); +	else +		mdc_inode_xatt_invalidate (this, local->loc.inode); + +	mdc_inode_iatt_invalidate (this, local->loc.inode); +out: +        MDC_STACK_UNWIND (removexattr, frame, op_ret, op_errno, xdata); + +        return 0; +} + + +int +mdc_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc, +		 const char *name, dict_t *xdata) +{ +        mdc_local_t  *local = NULL; + +        local = mdc_local_get (frame); + +	loc_copy (&local->loc, loc); + +	local->key = gf_strdup (name); + +        STACK_WIND (frame, mdc_removexattr_cbk, +                    FIRST_CHILD(this), FIRST_CHILD(this)->fops->removexattr, +                    loc, name, xdata); +        return 0; +} + + +int +mdc_fremovexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +		      int32_t op_ret, int32_t op_errno, dict_t *xdata) +{ +        mdc_local_t  *local = NULL; + +        local = frame->local; + +        if (op_ret != 0) +                goto out; + +        if (!local) +                goto out; + +	if (local->key) +		mdc_inode_xatt_unset (this, local->fd->inode, local->key); +	else +		mdc_inode_xatt_invalidate (this, local->fd->inode); + +	mdc_inode_iatt_invalidate (this, local->fd->inode); +out: +        MDC_STACK_UNWIND (fremovexattr, frame, op_ret, op_errno, xdata); + +        return 0; +} + + +int +mdc_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd, +		  const char *name, dict_t *xdata) +{ +        mdc_local_t  *local = NULL; + +        local = mdc_local_get (frame); + +	local->fd = fd_ref (fd); + +	local->key = gf_strdup (name); + +        STACK_WIND (frame, mdc_fremovexattr_cbk, +                    FIRST_CHILD(this), FIRST_CHILD(this)->fops->fremovexattr, +                    fd, name, xdata); +        return 0; +} +  int  mdc_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, @@ -2053,6 +2215,8 @@ struct xlator_fops fops = {          .fsetxattr   = mdc_fsetxattr,          .getxattr    = mdc_getxattr,          .fgetxattr   = mdc_fgetxattr, +	.removexattr = mdc_removexattr, +	.fremovexattr= mdc_fremovexattr,  	.readdirp    = mdc_readdirp,  	.readdir     = mdc_readdir,  	.fallocate   = mdc_fallocate,  | 
