summaryrefslogtreecommitdiffstats
path: root/xlators/nfs
diff options
context:
space:
mode:
authorMohammed Rafi KC <rkavunga@redhat.com>2016-01-12 12:04:59 +0530
committerDan Lambright <dlambrig@redhat.com>2016-02-22 06:49:05 -0800
commit4baa960b95a33af30de1ca90d9b37b04e10fd0ff (patch)
treee725a8aa83ae235f79146539c1df9613c7796cb4 /xlators/nfs
parentad715122329d06d73a215c97ceb6221c31c09f7c (diff)
nfs: send lookup if inode_ctx is not set
During resolving of an entry or inode, if inode ctx was not set, we will send a lookup. This patch also make sure that inode_ctx will be created after every inode_link. Back port of> >Change-Id: I137a7e2510635ff4ea6d007b671961341f89c949 >BUG: 1297311 >Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com> >Reviewed-on: http://review.gluster.org/13224 >Reviewed-by: soumya k <skoduri@redhat.com> >Tested-by: NetBSD Build System <jenkins@build.gluster.org> >Reviewed-by: Dan Lambright <dlambrig@redhat.com> >Tested-by: Dan Lambright <dlambrig@redhat.com> Change-Id: I2034521e23ef24ac75f80aff736abf5811fc0de6 BUG: 1306131 Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com> Reviewed-on: http://review.gluster.org/13413 Smoke: Gluster Build System <jenkins@build.gluster.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Dan Lambright <dlambrig@redhat.com>
Diffstat (limited to 'xlators/nfs')
-rw-r--r--xlators/nfs/server/src/mount3.c19
-rw-r--r--xlators/nfs/server/src/nfs-common.c11
-rw-r--r--xlators/nfs/server/src/nfs-common.h4
-rw-r--r--xlators/nfs/server/src/nfs3-helpers.c9
4 files changed, 28 insertions, 15 deletions
diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c
index 1ca76b2e897..c10232e20e0 100644
--- a/xlators/nfs/server/src/mount3.c
+++ b/xlators/nfs/server/src/mount3.c
@@ -1062,8 +1062,9 @@ __mnt3_resolve_export_subdir_comp (mnt3_resolve_t *mres)
/* Wipe the contents of the previous component */
gf_uuid_copy (gfid, mres->resolveloc.inode->gfid);
nfs_loc_wipe (&mres->resolveloc);
- ret = nfs_entry_loc_fill (mres->exp->vol->itable, gfid, nextcomp,
- &mres->resolveloc, NFS_RESOLVE_CREATE);
+ ret = nfs_entry_loc_fill (mres->mstate->nfsx, mres->exp->vol->itable,
+ gfid, nextcomp, &mres->resolveloc,
+ NFS_RESOLVE_CREATE);
if ((ret < 0) && (ret != -2)) {
gf_msg (GF_MNT, GF_LOG_ERROR, EFAULT,
NFS_MSG_RESOLVE_INODE_FAIL, "Failed to resolve and "
@@ -1123,6 +1124,7 @@ mnt3_resolve_subdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int authcode = 0;
char *authorized_host = NULL;
char *authorized_path = NULL;
+ inode_t *linked_inode = NULL;
mres = frame->local;
ms = mres->mstate;
@@ -1139,8 +1141,12 @@ mnt3_resolve_subdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
goto err;
}
- inode_link (mres->resolveloc.inode, mres->resolveloc.parent,
- mres->resolveloc.name, buf);
+ linked_inode = inode_link (mres->resolveloc.inode,
+ mres->resolveloc.parent,
+ mres->resolveloc.name, buf);
+
+ if (linked_inode)
+ nfs_fix_generation (this, linked_inode);
nfs3_fh_build_child_fh (&mres->parentfh, buf, &fh);
if (strlen (mres->remainingdir) <= 0) {
@@ -1371,8 +1377,9 @@ __mnt3_resolve_subdir (mnt3_resolve_t *mres)
goto err;
rootgfid[15] = 1;
- ret = nfs_entry_loc_fill (mres->exp->vol->itable, rootgfid, firstcomp,
- &mres->resolveloc, NFS_RESOLVE_CREATE);
+ ret = nfs_entry_loc_fill (mres->mstate->nfsx, mres->exp->vol->itable,
+ rootgfid, firstcomp, &mres->resolveloc,
+ NFS_RESOLVE_CREATE);
if ((ret < 0) && (ret != -2)) {
gf_msg (GF_MNT, GF_LOG_ERROR, EFAULT,
NFS_MSG_RESOLVE_INODE_FAIL, "Failed to resolve and "
diff --git a/xlators/nfs/server/src/nfs-common.c b/xlators/nfs/server/src/nfs-common.c
index b6791566c2c..cfb0edd1294 100644
--- a/xlators/nfs/server/src/nfs-common.c
+++ b/xlators/nfs/server/src/nfs-common.c
@@ -331,8 +331,8 @@ err:
* On other errors, return -3. 0 on success.
*/
int
-nfs_entry_loc_fill (inode_table_t *itable, uuid_t pargfid, char *entry,
- loc_t *loc, int how)
+nfs_entry_loc_fill (xlator_t *this, inode_table_t *itable, uuid_t pargfid,
+ char *entry, loc_t *loc, int how)
{
inode_t *parent = NULL;
inode_t *entryinode = NULL;
@@ -347,21 +347,22 @@ nfs_entry_loc_fill (inode_table_t *itable, uuid_t pargfid, char *entry,
ret = -1;
/* Will need hard resolution now */
- if (!parent)
+ if (!parent || inode_ctx_get (parent, this, NULL))
goto err;
gf_uuid_copy (loc->pargfid, pargfid);
ret = -2;
entryinode = inode_grep (itable, parent, entry);
- if (!entryinode) {
+ if (!entryinode || inode_ctx_get (entryinode, this, NULL)) {
if (how == NFS_RESOLVE_CREATE) {
/* Even though we'll create the inode and the loc for
* a missing inode, we still need to return -2 so
* that the caller can use the filled loc to call
* lookup.
*/
- entryinode = inode_new (itable);
+ if (!entryinode)
+ entryinode = inode_new (itable);
/* Cannot change ret because that must
* continue to have -2.
*/
diff --git a/xlators/nfs/server/src/nfs-common.h b/xlators/nfs/server/src/nfs-common.h
index 401484c0f3c..01b49c1eb7a 100644
--- a/xlators/nfs/server/src/nfs-common.h
+++ b/xlators/nfs/server/src/nfs-common.h
@@ -64,8 +64,8 @@ extern int
nfs_ino_loc_fill (inode_table_t *itable, uuid_t gfid, loc_t *l);
extern int
-nfs_entry_loc_fill (inode_table_t *itable, uuid_t pargfid, char *entry,
- loc_t *loc, int how);
+nfs_entry_loc_fill (xlator_t *this, inode_table_t *itable, uuid_t pargfid,
+ char *entry, loc_t *loc, int how);
extern int
nfs_root_loc_fill (inode_table_t *itable, loc_t *loc);
diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c
index 985d08b01eb..ed673a12489 100644
--- a/xlators/nfs/server/src/nfs3-helpers.c
+++ b/xlators/nfs/server/src/nfs3-helpers.c
@@ -3660,6 +3660,7 @@ nfs3_fh_resolve_entry_lookup_cbk (call_frame_t *frame, void *cookie,
linked_inode = inode_link (inode, cs->resolvedloc.parent,
cs->resolvedloc.name, buf);
if (linked_inode) {
+ nfs_fix_generation (this, linked_inode);
inode_lookup (linked_inode);
inode_unref (cs->resolvedloc.inode);
cs->resolvedloc.inode = linked_inode;
@@ -3702,6 +3703,7 @@ nfs3_fh_resolve_inode_lookup_cbk (call_frame_t *frame, void *cookie,
linked_inode = inode_link (inode, cs->resolvedloc.parent,
cs->resolvedloc.name, buf);
if (linked_inode) {
+ nfs_fix_generation (this, linked_inode);
inode_lookup (linked_inode);
inode_unref (cs->resolvedloc.inode);
cs->resolvedloc.inode = linked_inode;
@@ -3771,7 +3773,7 @@ nfs3_fh_resolve_entry_hard (nfs3_call_state_t *cs)
", entry: %s", uuid_utoa (cs->resolvefh.gfid),
cs->resolventry);
- ret = nfs_entry_loc_fill (cs->vol->itable, cs->resolvefh.gfid,
+ ret = nfs_entry_loc_fill (cs->nfsx, cs->vol->itable, cs->resolvefh.gfid,
cs->resolventry, &cs->resolvedloc,
NFS_RESOLVE_CREATE);
@@ -3812,14 +3814,17 @@ nfs3_fh_resolve_inode (nfs3_call_state_t *cs)
{
inode_t *inode = NULL;
int ret = -EFAULT;
+ xlator_t *this = NULL;
if (!cs)
return ret;
+ this = cs->nfsx;
gf_msg_trace (GF_NFS3, 0, "FH needs inode resolution");
gf_uuid_copy (cs->resolvedloc.gfid, cs->resolvefh.gfid);
+
inode = inode_find (cs->vol->itable, cs->resolvefh.gfid);
- if (!inode)
+ if (!inode || inode_ctx_get (inode, this, NULL))
ret = nfs3_fh_resolve_inode_hard (cs);
else
ret = nfs3_fh_resolve_inode_done (cs, inode);