| Bryan Schumaker | a38a9ea | 2012-07-16 16:39:16 -0400 | [diff] [blame] | 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 | } |