/* SPDX-License-Identifier: GPL-2.0 */
/*
 * DOS share management for lockd.
 *
 * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
 */

#ifndef _LOCKD_SHARE_H
#define _LOCKD_SHARE_H

#include <linux/bits.h>

/* Synthetic svid for lockowner lookup during share operations */
#define LOCKD_SHARE_SVID	(~(u32)0)

/* One bit per (access, deny) pair; index = (access << 2) | deny */
#define LOCKD_FSH_BIT(a, d)	BIT(((a) << 2) | (d))

/*
 * DOS share for a specific file
 */
struct lockd_share {
	struct lockd_share *	s_next;		/* linked list */
	struct nlm_host *	s_host;		/* client host */
	struct nlm_file *	s_file;		/* shared file */
	struct xdr_netobj	s_owner;	/* owner handle */
	u32			s_access;	/* access mode */
	u32			s_mode;		/* deny mode */
	u16			s_access_deny_bmap;	/* held (access, deny) pairs */
};

__be32	nlmsvc_share_file(struct nlm_host *host, struct nlm_file *file,
			  struct xdr_netobj *oh, u32 access, u32 mode);
__be32	nlmsvc_unshare_file(struct nlm_host *host, struct nlm_file *file,
			    struct xdr_netobj *oh, u32 access, u32 mode);
void	nlmsvc_traverse_shares(struct nlm_host *, struct nlm_file *,
					       nlm_host_match_fn_t);

#endif /* _LOCKD_SHARE_H */