1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 */ 6 7 #include <linux/nfs_fs.h> 8 #include "nfs4_fs.h" 9 #include "internal.h" 10 11 #define NFSDBG_FACILITY NFSDBG_CLIENT 12 13 int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool auth_probe) 14 { 15 struct nfs_fsinfo fsinfo; 16 int ret = -ENOMEM; 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, auth_probe); 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 memcpy(&server->fsid, &fsinfo.fattr->fsid, sizeof(server->fsid)); 38 out: 39 nfs_free_fattr(fsinfo.fattr); 40 return ret; 41 } 42