diff options
| author | vmallika <vmallika@redhat.com> | 2015-06-18 12:02:50 +0530 | 
|---|---|---|
| committer | Raghavendra G <rgowdapp@redhat.com> | 2015-06-22 03:46:14 -0700 | 
| commit | 142cbe0cfe1f0ff64d081f792e33337977ef5562 (patch) | |
| tree | 3e80ce879a394d72962cf6c1661e9b951b07adea /xlators/features/quota/src/quota.c | |
| parent | bc6d9d679a87dd980afa4a064d6b2f6c49f39cae (diff) | |
quota: allow writes when with ENOENT/ESTALE on active fd
We may get ENOENT/ESTALE in case of below scenario
        fd = open file.txt
        unlink file.txt
        write on fd
Here build_ancestry can fail as the file is removed.
For now ignore ENOENT/ESTALE on active fd with
writev and fallocate.
We need to re-visit this code once we understand
how other file-system behave in this scenario
Below patch fixes the issue in DHT:
http://review.gluster.org/#/c/11097
Change-Id: I7be683583b808c280e3ea2ddd036c1558a6d53e5
BUG: 1188242
Signed-off-by: vmallika <vmallika@redhat.com>
Reviewed-on: http://review.gluster.org/11307
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/features/quota/src/quota.c')
| -rw-r--r-- | xlators/features/quota/src/quota.c | 32 | 
1 files changed, 31 insertions, 1 deletions
diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c index c99ac12d128..eb3649f4522 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -1596,6 +1596,20 @@ quota_writev_helper (call_frame_t *frame, xlator_t *this, fd_t *fd,                          vector = new_vector;                          count = new_count; +                } else if (op_errno == ENOENT || op_errno == ESTALE) { +                        /* We may get ENOENT/ESTALE in case of below scenario +                         *     fd = open file.txt +                         *     unlink file.txt +                         *     write on fd +                         * Here build_ancestry can fail as the file is removed. +                         * For now ignore ENOENT/ESTALE with writes on active fd +                         * We need to re-visit this code once we understand +                         * how other file-system behave in this scenario +                         */ +                        gf_msg_debug (this->name, 0, "quota enforcer failed " +                                      "with ENOENT/ESTALE on %s, cannot check " +                                      "quota limits and allowing writes", +                                      uuid_utoa (fd->inode->gfid));                  } else {                          goto unwind;                  } @@ -4596,7 +4610,23 @@ quota_fallocate_helper (call_frame_t *frame, xlator_t *this, fd_t *fd,          if (local->op_ret == -1) {                  op_errno = local->op_errno; -                goto unwind; +                if (op_errno == ENOENT || op_errno == ESTALE) { +                        /* We may get ENOENT/ESTALE in case of below scenario +                         *     fd = open file.txt +                         *     unlink file.txt +                         *     fallocate on fd +                         * Here build_ancestry can fail as the file is removed. +                         * For now ignore ENOENT/ESTALE on active fd +                         * We need to re-visit this code once we understand +                         * how other file-system behave in this scenario +                         */ +                        gf_msg_debug (this->name, 0, "quota enforcer failed " +                                      "with ENOENT/ESTALE on %s, cannot check " +                                      "quota limits and allowing fallocate", +                                      uuid_utoa (fd->inode->gfid)); +                } else { +                        goto unwind; +                }          }          STACK_WIND (frame, quota_fallocate_cbk,  | 
