summaryrefslogtreecommitdiffstats
path: root/xlators/cluster
diff options
context:
space:
mode:
authorVikas Gorur <vikas@gluster.com>2009-07-09 05:33:54 +0000
committerAnand V. Avati <avati@dev.gluster.com>2009-07-15 23:14:43 -0700
commit161188e919968f1d782e857151f2f4dca1fdfc22 (patch)
treefc7df0be2f5c649dd28f985693e5437e8b7d8ad2 /xlators/cluster
parentc276dfe936dbb48cd5569099c5cc142122d160f8 (diff)
Return inode number always from the first up subvolume in AFR.
Also fixes a bug in the "KLUDGE" part. It was setting lookup_buf when it should have been setting local->cont.lookup.buf Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 116 (Replicate: Need inode number from first subvolume on fresh lookup) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=116
Diffstat (limited to 'xlators/cluster')
-rw-r--r--xlators/cluster/afr/src/afr.c25
-rw-r--r--xlators/cluster/afr/src/afr.h1
2 files changed, 16 insertions, 10 deletions
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c
index 31c81ffd41a..6fa15b1aea3 100644
--- a/xlators/cluster/afr/src/afr.c
+++ b/xlators/cluster/afr/src/afr.c
@@ -486,6 +486,16 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,
&open_fd_count);
local->open_fd_count += open_fd_count;
+
+ first_up_child = afr_first_up_child (priv);
+
+ if (child_index == first_up_child) {
+ local->cont.lookup.ino =
+ afr_itransform (buf->st_ino,
+ priv->child_count,
+ first_up_child);
+ }
+
/* in case of revalidate, we need to send stat of the
* child whose stat was sent during the first lookup.
* (so that time stamp does not vary with revalidate.
@@ -540,15 +550,6 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,
local->need_data_self_heal = 1;
}
- first_up_child = afr_first_up_child (priv);
-
- if (child_index == first_up_child) {
- local->cont.lookup.buf.st_ino =
- afr_itransform (buf->st_ino,
- priv->child_count,
- first_up_child);
- }
-
if (child_index == local->read_child_index) {
/*
@@ -587,11 +588,15 @@ unlock:
call_count = afr_frame_return (frame);
if (call_count == 0) {
+ if (local->cont.lookup.ino) {
+ local->cont.lookup.buf.st_ino = local->cont.lookup.ino;
+ }
+
if (local->op_ret == 0) {
/* KLUDGE: assuming DHT will not itransform in
revalidate */
if (local->cont.lookup.inode->ino)
- lookup_buf->st_ino =
+ local->cont.lookup.buf.st_ino =
local->cont.lookup.inode->ino;
}
diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h
index 2871bfc47dd..a4facf2074f 100644
--- a/xlators/cluster/afr/src/afr.h
+++ b/xlators/cluster/afr/src/afr.h
@@ -182,6 +182,7 @@ typedef struct _afr_local {
struct {
inode_t *inode;
struct stat buf;
+ ino_t ino;
dict_t *xattr;
} lookup;