cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lockd.c (1843B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * This file contains all the stubs needed when communicating with lockd.
      4 * This level of indirection is necessary so we can run nfsd+lockd without
      5 * requiring the nfs client to be compiled in/loaded, and vice versa.
      6 *
      7 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
      8 */
      9
     10#include <linux/file.h>
     11#include <linux/lockd/bind.h>
     12#include "nfsd.h"
     13#include "vfs.h"
     14
     15#define NFSDDBG_FACILITY		NFSDDBG_LOCKD
     16
     17#ifdef CONFIG_LOCKD_V4
     18#define nlm_stale_fh	nlm4_stale_fh
     19#define nlm_failed	nlm4_failed
     20#else
     21#define nlm_stale_fh	nlm_lck_denied_nolocks
     22#define nlm_failed	nlm_lck_denied_nolocks
     23#endif
     24/*
     25 * Note: we hold the dentry use count while the file is open.
     26 */
     27static __be32
     28nlm_fopen(struct svc_rqst *rqstp, struct nfs_fh *f, struct file **filp,
     29		int mode)
     30{
     31	__be32		nfserr;
     32	int		access;
     33	struct svc_fh	fh;
     34
     35	/* must initialize before using! but maxsize doesn't matter */
     36	fh_init(&fh,0);
     37	fh.fh_handle.fh_size = f->size;
     38	memcpy(&fh.fh_handle.fh_raw, f->data, f->size);
     39	fh.fh_export = NULL;
     40
     41	access = (mode == O_WRONLY) ? NFSD_MAY_WRITE : NFSD_MAY_READ;
     42	access |= NFSD_MAY_LOCK;
     43	nfserr = nfsd_open(rqstp, &fh, S_IFREG, access, filp);
     44	fh_put(&fh);
     45 	/* We return nlm error codes as nlm doesn't know
     46	 * about nfsd, but nfsd does know about nlm..
     47	 */
     48	switch (nfserr) {
     49	case nfs_ok:
     50		return 0;
     51	case nfserr_dropit:
     52		return nlm_drop_reply;
     53	case nfserr_stale:
     54		return nlm_stale_fh;
     55	default:
     56		return nlm_failed;
     57	}
     58}
     59
     60static void
     61nlm_fclose(struct file *filp)
     62{
     63	fput(filp);
     64}
     65
     66static const struct nlmsvc_binding nfsd_nlm_ops = {
     67	.fopen		= nlm_fopen,		/* open file for locking */
     68	.fclose		= nlm_fclose,		/* close file */
     69};
     70
     71void
     72nfsd_lockd_init(void)
     73{
     74	dprintk("nfsd: initializing lockd\n");
     75	nlmsvc_ops = &nfsd_nlm_ops;
     76}
     77
     78void
     79nfsd_lockd_shutdown(void)
     80{
     81	nlmsvc_ops = NULL;
     82}