diff options
| author | Vijay Bellur <vijay@dev.gluster.com> | 2010-10-11 12:31:26 -0700 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-10-11 12:31:26 -0700 | 
| commit | 61308de7645f1df462bef50e9c22237899218c65 (patch) | |
| tree | 70adda68e7b570e7bb0d1866dd76bda1b870d279 /xlators/nfs/server/src/nfs3.c | |
| parent | d31e97336aac057510203f0942856b66baf4a91b (diff) | |
Revert "Revert "nfs3: Revalidate inode on receiving ESTALE on lookup""
This reverts commit 6dd3b7fa3bc7acf9281cc17f08010675e2297089.
Diffstat (limited to 'xlators/nfs/server/src/nfs3.c')
| -rw-r--r-- | xlators/nfs/server/src/nfs3.c | 45 | 
1 files changed, 44 insertions, 1 deletions
diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index a81676d17..1891500c5 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -1013,6 +1013,41 @@ nfs3_lookup_reply (rpcsvc_request_t *req, nfsstat3 stat, struct nfs3_fh *newfh,  int +nfs3_lookup_resume (void *carg); + + +int +nfs3_revalidate_lookup (nfs3_call_state_t *cs) +{ +        int     ret = -EFAULT; +        char    *oldresolventry = NULL; + +        if (!cs) +                return -1; + +        gf_log (GF_NFS3, GF_LOG_DEBUG, "inode needs revalidation"); +        inode_unlink (cs->resolvedloc.inode, cs->resolvedloc.parent, +                      cs->resolventry); +        inode_unref (cs->resolvedloc.inode); +        nfs_loc_wipe (&cs->resolvedloc); + +        /* Store pointer to currently allocated resolventry because it gets over +         * written in fh_resolve_and_resume. +         */ +        oldresolventry = cs->resolventry; +        cs->revalidate = GF_NFS3_REVALIDATE; +        ret = nfs3_fh_resolve_and_resume (cs, &cs->resolvefh, cs->resolventry, +                                          nfs3_lookup_resume); +        /* Allocated in the previous call to fh_resolve_and_resume using the +         * same call_state. +         */ +        GF_FREE (oldresolventry); + +        return ret; +} + + +int  nfs3svc_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                      int32_t op_ret, int32_t op_errno, inode_t *inode,                      struct iatt *buf, dict_t *xattr, struct iatt *postparent) @@ -1030,11 +1065,18 @@ nfs3svc_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          nfs3_fh_build_child_fh (&cs->parent, buf, &newfh);  xmit_res: +        /* Only revalidate if it wasnt already a revalidation lookup. */ +        if ((op_errno == ESTALE) && (!nfs3_is_revalidate_lookup (cs))) { +                op_ret = nfs3_revalidate_lookup (cs); +                if (op_ret < 0) +                        goto out; +        } +          nfs3_log_newfh_res (nfs_rpcsvc_request_xid (cs->req), "LOOKUP", status,                              op_errno, &newfh);          nfs3_lookup_reply (cs->req, status, &newfh, buf, postparent);          nfs3_call_state_wipe (cs); - +out:          return 0;  } @@ -1211,6 +1253,7 @@ nfs3_lookup (rpcsvc_request_t *req, struct nfs3_fh *fh, int fhlen, char *name)          nfs3_map_fh_to_volume (nfs3, fh, req, vol, stat, nfs3err);          nfs3_handle_call_state_init (nfs3, cs, req, vol, stat, nfs3err); +        cs->revalidate = GF_NFS3_NONREVALIDATE;          if (!nfs3_is_parentdir_entry (name))                  ret = nfs3_fh_resolve_and_resume (cs, fh, name,                                                    nfs3_lookup_resume);  | 
