|
@@ -80,6 +80,7 @@ static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
|
|
static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
|
|
static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
|
|
static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *);
|
|
static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *);
|
|
static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
|
|
static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
|
|
|
|
+static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *);
|
|
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
|
|
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
|
|
static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
|
|
static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
|
|
struct nfs_fattr *fattr, struct iattr *sattr,
|
|
struct nfs_fattr *fattr, struct iattr *sattr,
|
|
@@ -2363,6 +2364,31 @@ int nfs4_proc_get_rootfh(struct nfs_server *server, struct nfs_fh *fhandle,
|
|
return nfs4_map_errors(status);
|
|
return nfs4_map_errors(status);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *mntfh,
|
|
|
|
+ struct nfs_fsinfo *info)
|
|
|
|
+{
|
|
|
|
+ int error;
|
|
|
|
+ struct nfs_fattr *fattr = info->fattr;
|
|
|
|
+
|
|
|
|
+ error = nfs4_server_capabilities(server, mntfh);
|
|
|
|
+ if (error < 0) {
|
|
|
|
+ dprintk("nfs4_get_root: getcaps error = %d\n", -error);
|
|
|
|
+ return error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ error = nfs4_proc_getattr(server, mntfh, fattr);
|
|
|
|
+ if (error < 0) {
|
|
|
|
+ dprintk("nfs4_get_root: getattr error = %d\n", -error);
|
|
|
|
+ return error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (fattr->valid & NFS_ATTR_FATTR_FSID &&
|
|
|
|
+ !nfs_fsid_equal(&server->fsid, &fattr->fsid))
|
|
|
|
+ memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid));
|
|
|
|
+
|
|
|
|
+ return error;
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Get locations and (maybe) other attributes of a referral.
|
|
* Get locations and (maybe) other attributes of a referral.
|
|
* Note that we'll actually follow the referral later when
|
|
* Note that we'll actually follow the referral later when
|
|
@@ -6539,7 +6565,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
|
|
.dir_inode_ops = &nfs4_dir_inode_operations,
|
|
.dir_inode_ops = &nfs4_dir_inode_operations,
|
|
.file_inode_ops = &nfs4_file_inode_operations,
|
|
.file_inode_ops = &nfs4_file_inode_operations,
|
|
.file_ops = &nfs4_file_operations,
|
|
.file_ops = &nfs4_file_operations,
|
|
- .getroot = nfs4_proc_get_rootfh,
|
|
|
|
|
|
+ .getroot = nfs4_proc_get_root,
|
|
.submount = nfs4_submount,
|
|
.submount = nfs4_submount,
|
|
.getattr = nfs4_proc_getattr,
|
|
.getattr = nfs4_proc_getattr,
|
|
.setattr = nfs4_proc_setattr,
|
|
.setattr = nfs4_proc_setattr,
|