162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci* Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. 462306a36Sopenharmony_ci* Written by David Howells (dhowells@redhat.com) 562306a36Sopenharmony_ci*/ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/nfs_fs.h> 862306a36Sopenharmony_ci#include "nfs4_fs.h" 962306a36Sopenharmony_ci#include "internal.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define NFSDBG_FACILITY NFSDBG_CLIENT 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciint nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool auth_probe) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci struct nfs_fsinfo fsinfo; 1662306a36Sopenharmony_ci int ret = -ENOMEM; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci fsinfo.fattr = nfs_alloc_fattr(); 1962306a36Sopenharmony_ci if (fsinfo.fattr == NULL) 2062306a36Sopenharmony_ci goto out; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci /* Start by getting the root filehandle from the server */ 2362306a36Sopenharmony_ci ret = nfs4_proc_get_rootfh(server, mntfh, &fsinfo, auth_probe); 2462306a36Sopenharmony_ci if (ret < 0) { 2562306a36Sopenharmony_ci dprintk("nfs4_get_rootfh: getroot error = %d\n", -ret); 2662306a36Sopenharmony_ci goto out; 2762306a36Sopenharmony_ci } 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (!(fsinfo.fattr->valid & NFS_ATTR_FATTR_TYPE) 3062306a36Sopenharmony_ci || !S_ISDIR(fsinfo.fattr->mode)) { 3162306a36Sopenharmony_ci printk(KERN_ERR "nfs4_get_rootfh:" 3262306a36Sopenharmony_ci " getroot encountered non-directory\n"); 3362306a36Sopenharmony_ci ret = -ENOTDIR; 3462306a36Sopenharmony_ci goto out; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci memcpy(&server->fsid, &fsinfo.fattr->fsid, sizeof(server->fsid)); 3862306a36Sopenharmony_ciout: 3962306a36Sopenharmony_ci nfs_free_fattr(fsinfo.fattr); 4062306a36Sopenharmony_ci return ret; 4162306a36Sopenharmony_ci} 42