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 } 50