From 4a007de8e1bcef9ce059cdca4dcc510846702e1d Mon Sep 17 00:00:00 2001 From: Shreyas Siravara Date: Thu, 7 Sep 2017 16:41:15 -0700 Subject: md-cache: Invalidate inode metadata on flush Summary: - When you write a file and then stat it immediately, md-cache returns stale stat information. - This diff implements flush() in md-cache so that we can correctly invalidate inodes after a write. - This is a port of D4762171 to 3.8 Reviewers: kvigor, dph Reviewed By: kvigor Change-Id: I368b7870d61b14a7e390917d195cbccc67029eb7 Reviewed-on: https://review.gluster.org/18233 Reviewed-by: Shreyas Siravara CentOS-regression: Gluster Build System Smoke: Gluster Build System --- xlators/performance/md-cache/src/md-cache.c | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/xlators/performance/md-cache/src/md-cache.c b/xlators/performance/md-cache/src/md-cache.c index 75a2b26ef65..1dcf2354634 100644 --- a/xlators/performance/md-cache/src/md-cache.c +++ b/xlators/performance/md-cache/src/md-cache.c @@ -1893,6 +1893,40 @@ mdc_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int datasync, } +int +mdc_flush_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 (local && local->fd) { + mdc_inode_iatt_invalidate (this, local->fd->inode); + } + + MDC_STACK_UNWIND (flush, frame, op_ret, op_errno, xdata); + + return 0; +} + + +int +mdc_flush (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) +{ + mdc_local_t *local = NULL; + + local = mdc_local_get (frame); + + local->fd = fd_ref (fd); + + STACK_WIND (frame, mdc_flush_cbk, FIRST_CHILD (this), + FIRST_CHILD (this)->fops->flush, fd, xdata); + + return 0; +} + + int mdc_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata) @@ -2584,6 +2618,7 @@ struct xlator_fops fops = { .setattr = mdc_setattr, .fsetattr = mdc_fsetattr, .fsync = mdc_fsync, + .flush = mdc_flush, .setxattr = mdc_setxattr, .fsetxattr = mdc_fsetxattr, .getxattr = mdc_getxattr, -- cgit