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