From 09d981409f1379265ee02db9cd5f62672fba4747 Mon Sep 17 00:00:00 2001 From: Jeff Darcy Date: Wed, 10 Oct 2012 09:12:50 -0400 Subject: 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 Reviewed-on: http://review.gluster.org/4058 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/nfs/server/src/nlm4.c | 59 ++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 21 deletions(-) (limited to 'xlators/nfs/server/src/nlm4.c') diff --git a/xlators/nfs/server/src/nlm4.c b/xlators/nfs/server/src/nlm4.c index 05de66d5633..2e02a5836c8 100644 --- a/xlators/nfs/server/src/nlm4.c +++ b/xlators/nfs/server/src/nlm4.c @@ -1789,25 +1789,38 @@ nlm4_add_share_to_inode (nlm_share_t *share) struct list_head *head = NULL; xlator_t *this = NULL; inode_t *inode = NULL; + struct nfs_inode_ctx *ictx = NULL; + struct nfs_state *priv = NULL; this = THIS; + priv = this->private; inode = share->inode; ret = inode_ctx_get (inode, this, &ctx); - head = (struct list_head *)ctx; - if (ret || !head) { - head = GF_CALLOC (1, sizeof (struct list_head), - gf_common_mt_list_head); - if (!head ) { + ictx = GF_CALLOC (1, sizeof (struct nfs_inode_ctx), + gf_nfs_mt_inode_ctx); + if (!ictx ) { + gf_log (this->name, GF_LOG_ERROR, + "could not allocate nfs inode ctx"); ret = -1; goto out; } + ictx->generation = priv->generation; + head = &ictx->shares; INIT_LIST_HEAD (head); - ret = inode_ctx_put (inode, this, (uint64_t)head); - if (ret) + + ret = inode_ctx_put (inode, this, (uint64_t)ictx); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "could not store share list"); goto out; + } + } + else { + ictx = (struct nfs_inode_ctx *)ctx; + head = &ictx->shares; } list_add (&share->inode_list, head); @@ -1829,6 +1842,7 @@ nlm4_approve_share_reservation (nfs3_call_state_t *cs) inode_t *inode = NULL; nlm_share_t *share = NULL; struct list_head *head = NULL; + struct nfs_inode_ctx *ictx = NULL; if (!cs) goto out; @@ -1840,8 +1854,9 @@ nlm4_approve_share_reservation (nfs3_call_state_t *cs) ret = 0; goto out; } + ictx = (struct nfs_inode_ctx *)ctx; - head = (struct list_head *)ctx; + head = &ictx->shares; if (!head || list_empty (head)) goto out; @@ -2014,18 +2029,19 @@ nlm4svc_share (rpcsvc_request_t *req) int nlm4_remove_share_reservation (nfs3_call_state_t *cs) { - int ret = -1; - uint64_t ctx = 0; - fsh_mode req_mode = 0; - fsh_access req_access = 0; - nlm_share_t *share = NULL; - nlm_share_t *tmp = NULL; - nlm_client_t *client = NULL; - char *caller = NULL; - inode_t *inode = NULL; - xlator_t *this = NULL; - struct list_head *head = NULL; - nlm4_shareargs *args = NULL; + int ret = -1; + uint64_t ctx = 0; + fsh_mode req_mode = 0; + fsh_access req_access = 0; + nlm_share_t *share = NULL; + nlm_share_t *tmp = NULL; + nlm_client_t *client = NULL; + char *caller = NULL; + inode_t *inode = NULL; + xlator_t *this = NULL; + struct list_head *head = NULL; + nlm4_shareargs *args = NULL; + struct nfs_inode_ctx *ictx = NULL; LOCK (&nlm_client_list_lk); @@ -2055,8 +2071,9 @@ nlm4_remove_share_reservation (nfs3_call_state_t *cs) inode->gfid, caller); goto out; } + ictx = (struct nfs_inode_ctx *)ctx; - head = (struct list_head *)ctx; + head = &ictx->shares; if (list_empty (head)) { ret = -1; goto out; -- cgit