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 #include "internal.h" 9 10 #define NFSDBG_FACILITY NFSDBG_CLIENT 11 12 int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool auth_probe) 13 { 14 struct nfs_fsinfo fsinfo; 15 int ret = -ENOMEM; 16 17 fsinfo.fattr = nfs_alloc_fattr(); 18 if (fsinfo.fattr == NULL) 19 goto out; 20 21 /* Start by getting the root filehandle from the server */ 22 ret = nfs4_proc_get_rootfh(server, mntfh, &fsinfo, auth_probe); 23 if (ret < 0) { 24 dprintk("nfs4_get_rootfh: getroot error = %d\n", -ret); 25 goto out; 26 } 27 28 if (!(fsinfo.fattr->valid & NFS_ATTR_FATTR_TYPE) 29 || !S_ISDIR(fsinfo.fattr->mode)) { 30 printk(KERN_ERR "nfs4_get_rootfh:" 31 " getroot encountered non-directory\n"); 32 ret = -ENOTDIR; 33 goto out; 34 } 35 36 memcpy(&server->fsid, &fsinfo.fattr->fsid, sizeof(server->fsid)); 37 out: 38 nfs_free_fattr(fsinfo.fattr); 39 return ret; 40 } 41