From b23c9fcc8a16b8c4a4b1814ff5035a18f03da0f4 Mon Sep 17 00:00:00 2001 From: Vikas Gorur Date: Thu, 9 Jul 2009 10:02:27 +0000 Subject: 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 --- xlators/cluster/afr/src/afr.c | 25 +++++++++++++++---------- xlators/cluster/afr/src/afr.h | 1 + 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 81665612272..a94f92600b0 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; -- cgit