platform:alarmtimer
     )ˆÄÅ„i—ÝsÃ¿Ç ?÷     )/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_NFS_XDR_H
#define _LINUX_NFS_XDR_H

#include <linux/nfsacl.h>
#include <linux/sunrpc/gss_api.h>

/*
 * To change the maximum rsize and wsize supported by the NFS client, adjust
 * NFS_MAX_FILE_IO_SIZE.  64KB is a typical maximum, but some servers can
 * support a megabyte or more.  The default is left at 4096 bytes, which is
 * reasonable for NFS over UDP.
 */
#define NFS_MAX_FILE_IO_SIZE	(1048576U)
#define NFS_DEF_FILE_IO_SIZE	(4096U)
#define NFS_MIN_FILE_IO_SIZE	(1024U)

#define NFS_BITMASK_SZ		3

struct nfs4_string {
	unsigned int len;
	char *data;
};

struct nfs_fsid {
	uint64_t		major;
	uint64_t		minor;
};

/*
 * Helper for checking equality between 2 fsids.
 */
static inline int nfs_fsid_equal(const struct nfs_fsid *a, const struct nfs_fsid *b)
{
	return a->major == b->major && a->minor == b->minor;
}

struct nfs4_threshold {
	__u32	bm;
	__u32	l_type;
	__u64	rd_sz;
	__u64	wr_sz;
	__u64	rd_io_sz;
	__u64	wr_io_sz;
};

struct nfs_fattr {
	__u64			valid;		/* which fields are valid */
	umode_t			mode;
	__u32			nlink;
	kuid_t			uid;
	kgid_t			gid;
	dev_t			rdev;
	__u64			size;
	union {
		struct {
			__u32	blocksize;
			__u32	blocks;
		} nfs2;
		struct {
			__u64	used;
		} nfs3;
	} du;
	struct nfs_fsid		fsid;
	__u64			fileid;
	__u64			mounted_on_fileid;
	struct timespec64	atime;
	struct timespec64	mtime;
	struct timespec64	ctime;
	struct timespec64	btime;
	__u64			change_attr;	/* NFSv4 change attribute */
	__u64			pre_change_attr;/* pre-op NFSv4 change attribute */
	__u64			pre_size;	/* pre_op_attr.size	  */
	struct timespec64	pre_mtime;	/* pre_op_attr.mtime	  */
	struct timespec64	pre_ctime;	/* pre_op_attr.ctime	  */
	unsigned long		time_start;
	unsigned long		gencount;
	struct nfs4_string	*owner_name;
	struct nfs4_string	*group_name;
	struct nfs4_threshold	*mdsthreshold;	/* pNFS threshold hints */
	struct nfs4_label	*label;
};

#define NFS_ATTR_FATTR_TYPE		BIT_ULL(0)
#define NFS_ATTR_FATTR_MODE		BIT_ULL(1)
#define NFS_ATTR_FATTR_NLINK		BIT_ULL(2)
#define NFS_ATTR_FATTR_OWNER		BIT_ULL(3)
#define NFS_ATTR_FATTR_GROUP		BIT_ULL(4)
#define NFS_ATTR_FATTR_RDEV		BIT_ULL(5)
#define NFS_ATTR_FATTR_SIZE		BIT_ULL(6)
#define NFS_ATTR_FATTR_PRESIZE		BIT_ULL(7)
#define NFS_ATTR_FATTR_BLOCKS_USED	BIT_ULL(8)
#define NFS_ATTR_FATTR_SPACE_USED	BIT_ULL(9)
#define NFS_ATTR_FATTR_FSID		BIT_ULL(10)
#define NFS_ATTR_FATTR_FILEID		BIT_ULL(11)
#define NFS_ATTR_FATTR_ATIME		BIT_ULL(12)
#define NFS_ATTR_FATTR_MTIME		BIT_ULL(13)
#define NFS_ATTR_FATTR_CTIME		BIT_ULL(14)
#define NFS_ATTR_FATTR_PREMTIME		BIT_ULL(15)
#define NFS_ATTR_FATTR_PRECTIME		BIT_ULL(16)
#define NFS_ATTR_FATTR_CHANGE		BIT_ULL(17)
#define NFS_ATTR_FATTR_PRECHANGE	BIT_ULL(18)
#define NFS_ATTR_FATTR_V4_LOCATIONS	BIT_ULL(19)
#define NFS_ATTR_FATTR_V4_REFERRAL	BIT_ULL(20)
#define NFS_ATTR_FATTR_MOUNTPOINT	BIT_ULL(21)
#define NFS_ATTR_FATTR_MOUNTED_ON_FILEID BIT_ULL(22)
#define NFS_ATTR_FATTR_OWNER_NAME	BIT_ULL(23)
#define NFS_ATTR_FATTR_GROUP_NAME	BIT_ULL(24)
#define NFS_ATTR_FATTR_V4_SECURITY_LABEL BIT_ULL(25)
#define NFS_ATTR_FATTR_BTIME		BIT_ULL(26)

#define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \
		| NFS_ATTR_FATTR_MODE \
		| NFS_ATTR_FATTR_NLINK \
		| NFS_ATTR_FATTR_OWNER \
		| NFS_ATTR_FATTR_GROUP \
		| NFS_ATTR_FATTR_RDEV \
		| NFS_ATTR_FATTR_SIZE \
		| NFS_ATTR_FATTR_FSID \
		| NFS_ATTR_FATTR_FILEID \
		| NFS_ATTR_FATTR_ATIME \
		| NFS_ATTR_FATTR_MTIME \
		| NFS_ATTR_FATTR_CTIME \
		| NFS_ATTR_FATTR_CHANGE)
#define NFS_ATTR_FATTR_V2 (NFS_ATTR_FATTR \
		| NFS_ATTR_FATTR_BLOCKS_USED)
#define NFS_ATTR_FATTR_V3 (NFS_ATTR_FATTR \
		| NFS_ATTR_FATTR_SPACE_USED)
#define NFS_ATTR_FATTR_V4 (NFS_ATTR_FATTR \
		| NFS_ATTR_FATTR_SPACE_USED \
		| NFS_ATTR_FATTR_BTIME \
		| NFS_ATTR_FATTR_V4_SECURITY_LABEL)

/*
 * Maximal number of supported layout drivers.
 */
#define NFS_MAX_LAYOUT_TYPES 8

/*
 * Info on the file system
 */
struct nfs_fsinfo {
	struct nfs_fattr	*fattr; /* Post-op attributes */
	__u32			rtmax;	/* max.  read transfer size */
	__u32			rtpref;	/* pref. read transfer size 