summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix.c
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2015-07-22 09:02:39 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-08-02 21:04:41 -0700
commit998a63357cb186953d0eedf5a06bc4ac5594674d (patch)
tree6fc11265de9aecff6f65364897cabe16e52a0454 /xlators/storage/posix/src/posix.c
parent3d6dd0dc25240cea6c319303dc7c876a84f292c9 (diff)
quota: fix parents caching during build ancestry
This is a backport of http://review.gluster.org/#/c/11574/ In build ancestry, we get the list of parents for a file, these parents are cached in inode ctx. This caching is not happening because posix is not setting d_stat information in the leaf node entry This patch fixes the issue Inode-ctx is not updated with new parent when rename performed on same directory. This patch fixes the issue There is a possibility of caching stale entries, consider below example: 1) build_ancestry invoked on a file 2) rename is invoked on the same file 3) buils_ancestry prepared entries of old parent 4) rename completed and in cbk old parent is replaced with new parent in inode ctx 5) now build_ancestry cbk adds old parent to inode ctx In this patch we also remove stale entries in writev and fallocate > Change-Id: Ib1854a41b47b14eb775326588352015c83d034de > BUG: 1240949 > Signed-off-by: vmallika <vmallika@redhat.com> > Reviewed-on: http://review.gluster.org/11574 > Tested-by: Gluster Build System <jenkins@build.gluster.com> > Reviewed-by: Raghavendra G <rgowdapp@redhat.com> Change-Id: I26a196e7eeed343593bea3a0b7b51d7be12500a3 BUG: 1248325 Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/11799 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/storage/posix/src/posix.c')
-rw-r--r--xlators/storage/posix/src/posix.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index e7ae1e65862..d16794f9ba5 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -3536,7 +3536,7 @@ out:
int32_t
posix_links_in_same_directory (char *dirpath, int count, inode_t *leaf_inode,
- inode_t *parent, uint64_t ino,
+ inode_t *parent, struct stat *stbuf,
gf_dirent_t *head, char **path,
int type, dict_t *xdata, int32_t *op_errno)
{
@@ -3572,7 +3572,7 @@ posix_links_in_same_directory (char *dirpath, int count, inode_t *leaf_inode,
if ((result == NULL) || *op_errno)
break;
- if (entry->d_ino != ino)
+ if (entry->d_ino != stbuf->st_ino)
continue;
linked_inode = inode_link (leaf_inode, parent,
@@ -3596,6 +3596,8 @@ posix_links_in_same_directory (char *dirpath, int count, inode_t *leaf_inode,
gf_entry->dict
= posix_xattr_fill (this, temppath, &loc, NULL,
-1, xdata, NULL);
+ iatt_from_stat (&(gf_entry->d_stat), stbuf);
+
list_add_tail (&gf_entry->list, &head->list);
loc_wipe (&loc);
}
@@ -3777,8 +3779,7 @@ posix_get_ancestry_non_directory (xlator_t *this, inode_t *leaf_inode,
dirpath[strlen (dirpath) - 1] = '\0';
posix_links_in_same_directory (dirpath, nlink_samepgfid,
- leaf_inode,
- parent, stbuf.st_ino, head,
+ leaf_inode, parent, &stbuf, head,
path, type, xdata, op_errno);
if (parent != NULL) {