diff options
author | Ravishankar N <ravishankar@redhat.com> | 2019-01-29 11:51:16 +0530 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2019-02-04 14:52:59 +0000 |
commit | 3f05fb00a090686bbdb0b467cec1f3647903b851 (patch) | |
tree | 7ad709c09e438d514af29b3369254631a39174e6 /xlators/performance/readdir-ahead/src/readdir-ahead.c | |
parent | 05ba01297657deef881aa9cd2770bbe760abf090 (diff) |
readdir-ahead: do not zero-out iatt in fop cbk
...when ctime is zero. ia_type and ia_gfid always need to be non-zero
for things to work correctly.
Problem:
Commit c9bde3021202f1d5c5a2d19ac05a510fc1f788ac zeroed out the iatt
buffer in the cbks of modification fops before unwinding if the ctime in
the buffer was zero. This was causing the fops to fail: noticeable when
AFR's 'consistent-metadata' option was enabled. (AFR zeros out the ctime
when the option is set. See commit
4c4624c9bad2edf27128cb122c64f15d7d63bbc8).
Fixes:
-Do not zero out the ia_type and ia_gfid of the iatt buff under any
circumstance.
-Also, fixed _rda_inode_ctx_update_iatts() to always update these values from
the incoming buf when ctime is zero. Otherwise we end up with zero
ia_type and ia_gfid the first time the function is called *and* the
incoming buf has ctime set to zero.
fixes: bz#1665145
Reported-By:Michael Hanselmann <public@hansmi.ch>
Change-Id: Ib72228892d42c3513c19fc6dfb543f2aa3489eca
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
(cherry picked from commit 09db11b0c020bc79d493c6d7e7ea4f3beb000c68)
Diffstat (limited to 'xlators/performance/readdir-ahead/src/readdir-ahead.c')
-rw-r--r-- | xlators/performance/readdir-ahead/src/readdir-ahead.c | 24 |
1 files changed, 4 insertions, 20 deletions
diff --git a/xlators/performance/readdir-ahead/src/readdir-ahead.c b/xlators/performance/readdir-ahead/src/readdir-ahead.c index 98c1a3f7259..d175ef34bff 100644 --- a/xlators/performance/readdir-ahead/src/readdir-ahead.c +++ b/xlators/performance/readdir-ahead/src/readdir-ahead.c @@ -129,7 +129,10 @@ __rda_inode_ctx_update_iatts(inode_t *inode, xlator_t *this, * An example of this case can be response of write request * that is cached in write-behind. */ - tmp_stat = ctx_p->statbuf; + if (stbuf_in) + tmp_stat = *stbuf_in; + else + tmp_stat = ctx_p->statbuf; memset(&ctx_p->statbuf, 0, sizeof(ctx_p->statbuf)); gf_uuid_copy(ctx_p->statbuf.ia_gfid, tmp_stat.ia_gfid); ctx_p->statbuf.ia_type = tmp_stat.ia_type; @@ -680,8 +683,6 @@ rda_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); unwind: RDA_STACK_UNWIND(writev, frame, op_ret, op_errno, prebuf, &postbuf_out, xdata); @@ -715,9 +716,6 @@ rda_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); - unwind: RDA_STACK_UNWIND(fallocate, frame, op_ret, op_errno, prebuf, &postbuf_out, xdata); @@ -750,9 +748,6 @@ rda_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); - unwind: RDA_STACK_UNWIND(zerofill, frame, op_ret, op_errno, prebuf, &postbuf_out, xdata); @@ -785,8 +780,6 @@ rda_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this, rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); unwind: RDA_STACK_UNWIND(discard, frame, op_ret, op_errno, prebuf, &postbuf_out, xdata); @@ -819,9 +812,6 @@ rda_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); - unwind: RDA_STACK_UNWIND(ftruncate, frame, op_ret, op_errno, prebuf, &postbuf_out, xdata); @@ -853,8 +843,6 @@ rda_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, local = frame->local; rda_inode_ctx_update_iatts(local->inode, this, postbuf, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); unwind: RDA_STACK_UNWIND(ftruncate, frame, op_ret, op_errno, prebuf, &postbuf_out, @@ -941,8 +929,6 @@ rda_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, local = frame->local; rda_inode_ctx_update_iatts(local->inode, this, statpost, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); unwind: RDA_STACK_UNWIND(setattr, frame, op_ret, op_errno, statpre, &postbuf_out, @@ -975,8 +961,6 @@ rda_fsetattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, local = frame->local; rda_inode_ctx_update_iatts(local->inode, this, statpost, &postbuf_out, local->generation); - if (postbuf_out.ia_ctime == 0) - memset(&postbuf_out, 0, sizeof(postbuf_out)); unwind: RDA_STACK_UNWIND(fsetattr, frame, op_ret, op_errno, statpre, &postbuf_out, |