|
@@ -135,21 +135,10 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Look up one component of a pathname.
|
|
|
- * N.B. After this call _both_ fhp and resfh need an fh_put
|
|
|
- *
|
|
|
- * If the lookup would cross a mountpoint, and the mounted filesystem
|
|
|
- * is exported to the client with NFSEXP_NOHIDE, then the lookup is
|
|
|
- * accepted as it stands and the mounted directory is
|
|
|
- * returned. Otherwise the covered directory is returned.
|
|
|
- * NOTE: this mountpoint crossing is not supported properly by all
|
|
|
- * clients and is explicitly disallowed for NFSv3
|
|
|
- * NeilBrown <neilb@cse.unsw.edu.au>
|
|
|
- */
|
|
|
__be32
|
|
|
-nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
|
|
|
- int len, struct svc_fh *resfh)
|
|
|
+nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|
|
+ const char *name, int len,
|
|
|
+ struct svc_export **exp_ret, struct dentry **dentry_ret)
|
|
|
{
|
|
|
struct svc_export *exp;
|
|
|
struct dentry *dparent;
|
|
@@ -219,6 +208,38 @@ nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ *dentry_ret = dentry;
|
|
|
+ *exp_ret = exp;
|
|
|
+ return 0;
|
|
|
+
|
|
|
+out_nfserr:
|
|
|
+ exp_put(exp);
|
|
|
+ return nfserrno(host_err);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Look up one component of a pathname.
|
|
|
+ * N.B. After this call _both_ fhp and resfh need an fh_put
|
|
|
+ *
|
|
|
+ * If the lookup would cross a mountpoint, and the mounted filesystem
|
|
|
+ * is exported to the client with NFSEXP_NOHIDE, then the lookup is
|
|
|
+ * accepted as it stands and the mounted directory is
|
|
|
+ * returned. Otherwise the covered directory is returned.
|
|
|
+ * NOTE: this mountpoint crossing is not supported properly by all
|
|
|
+ * clients and is explicitly disallowed for NFSv3
|
|
|
+ * NeilBrown <neilb@cse.unsw.edu.au>
|
|
|
+ */
|
|
|
+__be32
|
|
|
+nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
|
|
|
+ int len, struct svc_fh *resfh)
|
|
|
+{
|
|
|
+ struct svc_export *exp;
|
|
|
+ struct dentry *dentry;
|
|
|
+ __be32 err;
|
|
|
+
|
|
|
+ err = nfsd_lookup_dentry(rqstp, fhp, name, len, &exp, &dentry);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
/*
|
|
|
* Note: we compose the file handle now, but as the
|
|
|
* dentry may be negative, it may need to be updated.
|
|
@@ -227,15 +248,11 @@ nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
|
|
|
if (!err && !dentry->d_inode)
|
|
|
err = nfserr_noent;
|
|
|
dput(dentry);
|
|
|
-out:
|
|
|
exp_put(exp);
|
|
|
return err;
|
|
|
-
|
|
|
-out_nfserr:
|
|
|
- err = nfserrno(host_err);
|
|
|
- goto out;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/*
|
|
|
* Set various file attributes.
|
|
|
* N.B. After this call fhp needs an fh_put
|