diff options
author | Jeff Darcy <jdarcy@redhat.com> | 2012-10-10 09:12:50 -0400 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2012-10-19 07:16:33 -0700 |
commit | 09d981409f1379265ee02db9cd5f62672fba4747 (patch) | |
tree | 8ab4a5d568f37a6f5bcd63153475019bb737d8e9 /xlators/nfs/server/src/nfs.c | |
parent | bb41c8ab88f1a3d8c54b635674d0a72133623496 (diff) |
nfs: do lookup on getattr after brick-status change
By doing a lookup, we get a chance to do all of the self-heal checks that
would occur if we were using native protocol, and return proper status if
the self-heal fails. Best of all, we don't need to misrepresent times.
Change-Id: I76477d1e5fce4d83e4029e02fcdd71e81e23110d
BUG: 830134
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-on: http://review.gluster.org/4058
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/nfs/server/src/nfs.c')
-rw-r--r-- | xlators/nfs/server/src/nfs.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/xlators/nfs/server/src/nfs.c b/xlators/nfs/server/src/nfs.c index 0a5a9d1e34a..033d95213df 100644 --- a/xlators/nfs/server/src/nfs.c +++ b/xlators/nfs/server/src/nfs.c @@ -759,6 +759,7 @@ nfs_init_state (xlator_t *this) this->private = (void *)nfs; INIT_LIST_HEAD (&nfs->versions); + nfs->generation = 1965; ret = 0; @@ -843,24 +844,26 @@ int notify (xlator_t *this, int32_t event, void *data, ...) { xlator_t *subvol = NULL; + struct nfs_state *priv = NULL; subvol = (xlator_t *)data; gf_log (GF_NFS, GF_LOG_TRACE, "Notification received: %d", event); - switch (event) - { - case GF_EVENT_CHILD_UP: - { - nfs_startup_subvolume (this, subvol); - break; - } - case GF_EVENT_PARENT_UP: - { - default_notify (this, GF_EVENT_PARENT_UP, data); - break; - } + switch (event) { + case GF_EVENT_CHILD_UP: + nfs_startup_subvolume (this, subvol); + break; + + case GF_EVENT_CHILD_MODIFIED: + priv = this->private; + ++(priv->generation); + break; + + case GF_EVENT_PARENT_UP: + default_notify (this, GF_EVENT_PARENT_UP, data); + break; } return 0; @@ -882,14 +885,14 @@ fini (xlator_t *this) int32_t nfs_forget (xlator_t *this, inode_t *inode) { - uint64_t ctx = 0; - struct list_head *head = NULL; + uint64_t ctx = 0; + struct nfs_inode_ctx *ictx = NULL; if (inode_ctx_del (inode, this, &ctx)) return -1; - head = (struct list_head *)ctx; - GF_FREE (head); + ictx = (struct nfs_inode_ctx *)ctx; + GF_FREE (ictx); return 0; } |