diff options
Diffstat (limited to 'fs/nfs/nfs4getroot.c')
-rw-r--r-- | fs/nfs/nfs4getroot.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/fs/nfs/nfs4getroot.c b/fs/nfs/nfs4getroot.c new file mode 100644 index 000000000000..6a83780e0ce6 --- /dev/null +++ b/fs/nfs/nfs4getroot.c | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. | ||
3 | * Written by David Howells (dhowells@redhat.com) | ||
4 | */ | ||
5 | |||
6 | #include <linux/nfs_fs.h> | ||
7 | #include "nfs4_fs.h" | ||
8 | |||
9 | #define NFSDBG_FACILITY NFSDBG_CLIENT | ||
10 | |||
11 | int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh) | ||
12 | { | ||
13 | struct nfs_fsinfo fsinfo; | ||
14 | int ret = -ENOMEM; | ||
15 | |||
16 | dprintk("--> nfs4_get_rootfh()\n"); | ||
17 | |||
18 | fsinfo.fattr = nfs_alloc_fattr(); | ||
19 | if (fsinfo.fattr == NULL) | ||
20 | goto out; | ||
21 | |||
22 | /* Start by getting the root filehandle from the server */ | ||
23 | ret = nfs4_proc_get_rootfh(server, mntfh, &fsinfo); | ||
24 | if (ret < 0) { | ||
25 | dprintk("nfs4_get_rootfh: getroot error = %d\n", -ret); | ||
26 | goto out; | ||
27 | } | ||
28 | |||
29 | if (!(fsinfo.fattr->valid & NFS_ATTR_FATTR_TYPE) | ||
30 | || !S_ISDIR(fsinfo.fattr->mode)) { | ||
31 | printk(KERN_ERR "nfs4_get_rootfh:" | ||
32 | " getroot encountered non-directory\n"); | ||
33 | ret = -ENOTDIR; | ||
34 | goto out; | ||
35 | } | ||
36 | |||
37 | if (fsinfo.fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) { | ||
38 | printk(KERN_ERR "nfs4_get_rootfh:" | ||
39 | " getroot obtained referral\n"); | ||
40 | ret = -EREMOTE; | ||
41 | goto out; | ||
42 | } | ||
43 | |||
44 | memcpy(&server->fsid, &fsinfo.fattr->fsid, sizeof(server->fsid)); | ||
45 | out: | ||
46 | nfs_free_fattr(fsinfo.fattr); | ||
47 | dprintk("<-- nfs4_get_rootfh() = %d\n", ret); | ||
48 | return ret; | ||
49 | } | ||