|
@@ -1583,6 +1583,52 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+static int _nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
|
|
|
+ struct qstr *name, struct nfs_fh *fhandle,
|
|
|
+ struct nfs_fattr *fattr)
|
|
|
+{
|
|
|
+ int status;
|
|
|
+ struct nfs4_lookup_arg args = {
|
|
|
+ .bitmask = server->attr_bitmask,
|
|
|
+ .dir_fh = dirfh,
|
|
|
+ .name = name,
|
|
|
+ };
|
|
|
+ struct nfs4_lookup_res res = {
|
|
|
+ .server = server,
|
|
|
+ .fattr = fattr,
|
|
|
+ .fh = fhandle,
|
|
|
+ };
|
|
|
+ struct rpc_message msg = {
|
|
|
+ .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
|
|
|
+ .rpc_argp = &args,
|
|
|
+ .rpc_resp = &res,
|
|
|
+ };
|
|
|
+
|
|
|
+ nfs_fattr_init(fattr);
|
|
|
+
|
|
|
+ dprintk("NFS call lookupfh %s\n", name->name);
|
|
|
+ status = rpc_call_sync(server->client, &msg, 0);
|
|
|
+ dprintk("NFS reply lookupfh: %d\n", status);
|
|
|
+ if (status == -NFS4ERR_MOVED)
|
|
|
+ status = -EREMOTE;
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
+static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
|
|
|
+ struct qstr *name, struct nfs_fh *fhandle,
|
|
|
+ struct nfs_fattr *fattr)
|
|
|
+{
|
|
|
+ struct nfs4_exception exception = { };
|
|
|
+ int err;
|
|
|
+ do {
|
|
|
+ err = nfs4_handle_exception(server,
|
|
|
+ _nfs4_proc_lookupfh(server, dirfh, name,
|
|
|
+ fhandle, fattr),
|
|
|
+ &exception);
|
|
|
+ } while (exception.retry);
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
static int _nfs4_proc_lookup(struct inode *dir, struct qstr *name,
|
|
|
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
|
|
{
|
|
@@ -3723,6 +3769,7 @@ struct nfs_rpc_ops nfs_v4_clientops = {
|
|
|
.getroot = nfs4_proc_get_root,
|
|
|
.getattr = nfs4_proc_getattr,
|
|
|
.setattr = nfs4_proc_setattr,
|
|
|
+ .lookupfh = nfs4_proc_lookupfh,
|
|
|
.lookup = nfs4_proc_lookup,
|
|
|
.access = nfs4_proc_access,
|
|
|
.readlink = nfs4_proc_readlink,
|