18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci* Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. 48c2ecf20Sopenharmony_ci* Written by David Howells (dhowells@redhat.com) 58c2ecf20Sopenharmony_ci*/ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/nfs_fs.h> 88c2ecf20Sopenharmony_ci#include "nfs4_fs.h" 98c2ecf20Sopenharmony_ci#include "internal.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#define NFSDBG_FACILITY NFSDBG_CLIENT 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciint nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool auth_probe) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci struct nfs_fsinfo fsinfo; 168c2ecf20Sopenharmony_ci int ret = -ENOMEM; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci fsinfo.fattr = nfs_alloc_fattr(); 198c2ecf20Sopenharmony_ci if (fsinfo.fattr == NULL) 208c2ecf20Sopenharmony_ci goto out; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci /* Start by getting the root filehandle from the server */ 238c2ecf20Sopenharmony_ci ret = nfs4_proc_get_rootfh(server, mntfh, &fsinfo, auth_probe); 248c2ecf20Sopenharmony_ci if (ret < 0) { 258c2ecf20Sopenharmony_ci dprintk("nfs4_get_rootfh: getroot error = %d\n", -ret); 268c2ecf20Sopenharmony_ci goto out; 278c2ecf20Sopenharmony_ci } 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (!(fsinfo.fattr->valid & NFS_ATTR_FATTR_TYPE) 308c2ecf20Sopenharmony_ci || !S_ISDIR(fsinfo.fattr->mode)) { 318c2ecf20Sopenharmony_ci printk(KERN_ERR "nfs4_get_rootfh:" 328c2ecf20Sopenharmony_ci " getroot encountered non-directory\n"); 338c2ecf20Sopenharmony_ci ret = -ENOTDIR; 348c2ecf20Sopenharmony_ci goto out; 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci memcpy(&server->fsid, &fsinfo.fattr->fsid, sizeof(server->fsid)); 388c2ecf20Sopenharmony_ciout: 398c2ecf20Sopenharmony_ci nfs_free_fattr(fsinfo.fattr); 408c2ecf20Sopenharmony_ci return ret; 418c2ecf20Sopenharmony_ci} 42