18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/* YFS protocol bits
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
58c2ecf20Sopenharmony_ci * Written by David Howells (dhowells@redhat.com)
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#define YFS_FS_SERVICE	2500
98c2ecf20Sopenharmony_ci#define YFS_CM_SERVICE	2501
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define YFSCBMAX	1024
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_cienum YFS_CM_Operations {
148c2ecf20Sopenharmony_ci	YFSCBProbe		= 206,	/* probe client */
158c2ecf20Sopenharmony_ci	YFSCBGetLock		= 207,	/* get contents of CM lock table */
168c2ecf20Sopenharmony_ci	YFSCBXStatsVersion	= 209,	/* get version of extended statistics */
178c2ecf20Sopenharmony_ci	YFSCBGetXStats		= 210,	/* get contents of extended statistics data */
188c2ecf20Sopenharmony_ci	YFSCBInitCallBackState3	= 213,	/* initialise callback state, version 3 */
198c2ecf20Sopenharmony_ci	YFSCBProbeUuid		= 214,	/* check the client hasn't rebooted */
208c2ecf20Sopenharmony_ci	YFSCBGetServerPrefs	= 215,
218c2ecf20Sopenharmony_ci	YFSCBGetCellServDV	= 216,
228c2ecf20Sopenharmony_ci	YFSCBGetLocalCell	= 217,
238c2ecf20Sopenharmony_ci	YFSCBGetCacheConfig	= 218,
248c2ecf20Sopenharmony_ci	YFSCBGetCellByNum	= 65537,
258c2ecf20Sopenharmony_ci	YFSCBTellMeAboutYourself = 65538, /* get client capabilities */
268c2ecf20Sopenharmony_ci	YFSCBCallBack		= 64204,
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cienum YFS_FS_Operations {
308c2ecf20Sopenharmony_ci	YFSFETCHACL		= 64131, /* YFS Fetch file AFS3 ACL */
318c2ecf20Sopenharmony_ci	YFSFETCHSTATUS		= 64132, /* YFS Fetch file status */
328c2ecf20Sopenharmony_ci	YFSSTOREACL		= 64134, /* YFS Store file AFS3 ACL */
338c2ecf20Sopenharmony_ci	YFSSTORESTATUS		= 64135, /* YFS Store file status */
348c2ecf20Sopenharmony_ci	YFSREMOVEFILE		= 64136, /* YFS Remove a file */
358c2ecf20Sopenharmony_ci	YFSCREATEFILE		= 64137, /* YFS Create a file */
368c2ecf20Sopenharmony_ci	YFSRENAME		= 64138, /* YFS Rename or move a file or directory */
378c2ecf20Sopenharmony_ci	YFSSYMLINK		= 64139, /* YFS Create a symbolic link */
388c2ecf20Sopenharmony_ci	YFSLINK			= 64140, /* YFS Create a hard link */
398c2ecf20Sopenharmony_ci	YFSMAKEDIR		= 64141, /* YFS Create a directory */
408c2ecf20Sopenharmony_ci	YFSREMOVEDIR		= 64142, /* YFS Remove a directory */
418c2ecf20Sopenharmony_ci	YFSGETVOLUMESTATUS	= 64149, /* YFS Get volume status information */
428c2ecf20Sopenharmony_ci	YFSSETVOLUMESTATUS	= 64150, /* YFS Set volume status information */
438c2ecf20Sopenharmony_ci	YFSSETLOCK		= 64156, /* YFS Request a file lock */
448c2ecf20Sopenharmony_ci	YFSEXTENDLOCK		= 64157, /* YFS Extend a file lock */
458c2ecf20Sopenharmony_ci	YFSRELEASELOCK		= 64158, /* YFS Release a file lock */
468c2ecf20Sopenharmony_ci	YFSLOOKUP		= 64161, /* YFS lookup file in directory */
478c2ecf20Sopenharmony_ci	YFSFLUSHCPS		= 64165,
488c2ecf20Sopenharmony_ci	YFSFETCHOPAQUEACL	= 64168, /* YFS Fetch file YFS ACL */
498c2ecf20Sopenharmony_ci	YFSWHOAMI		= 64170,
508c2ecf20Sopenharmony_ci	YFSREMOVEACL		= 64171,
518c2ecf20Sopenharmony_ci	YFSREMOVEFILE2		= 64173,
528c2ecf20Sopenharmony_ci	YFSSTOREOPAQUEACL2	= 64174,
538c2ecf20Sopenharmony_ci	YFSINLINEBULKSTATUS	= 64536, /* YFS Fetch multiple file statuses with errors */
548c2ecf20Sopenharmony_ci	YFSFETCHDATA64		= 64537, /* YFS Fetch file data */
558c2ecf20Sopenharmony_ci	YFSSTOREDATA64		= 64538, /* YFS Store file data */
568c2ecf20Sopenharmony_ci	YFSUPDATESYMLINK	= 64540,
578c2ecf20Sopenharmony_ci};
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cistruct yfs_xdr_u64 {
608c2ecf20Sopenharmony_ci	__be32			msw;
618c2ecf20Sopenharmony_ci	__be32			lsw;
628c2ecf20Sopenharmony_ci} __packed;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistatic inline u64 xdr_to_u64(const struct yfs_xdr_u64 x)
658c2ecf20Sopenharmony_ci{
668c2ecf20Sopenharmony_ci	return ((u64)ntohl(x.msw) << 32) | ntohl(x.lsw);
678c2ecf20Sopenharmony_ci}
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_cistatic inline struct yfs_xdr_u64 u64_to_xdr(const u64 x)
708c2ecf20Sopenharmony_ci{
718c2ecf20Sopenharmony_ci	return (struct yfs_xdr_u64){ .msw = htonl(x >> 32), .lsw = htonl(x) };
728c2ecf20Sopenharmony_ci}
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cistruct yfs_xdr_vnode {
758c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	lo;
768c2ecf20Sopenharmony_ci	__be32			hi;
778c2ecf20Sopenharmony_ci	__be32			unique;
788c2ecf20Sopenharmony_ci} __packed;
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cistruct yfs_xdr_YFSFid {
818c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	volume;
828c2ecf20Sopenharmony_ci	struct yfs_xdr_vnode	vnode;
838c2ecf20Sopenharmony_ci} __packed;
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_cistruct yfs_xdr_YFSFetchStatus {
878c2ecf20Sopenharmony_ci	__be32			type;
888c2ecf20Sopenharmony_ci	__be32			nlink;
898c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	size;
908c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	data_version;
918c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	author;
928c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	owner;
938c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	group;
948c2ecf20Sopenharmony_ci	__be32			mode;
958c2ecf20Sopenharmony_ci	__be32			caller_access;
968c2ecf20Sopenharmony_ci	__be32			anon_access;
978c2ecf20Sopenharmony_ci	struct yfs_xdr_vnode	parent;
988c2ecf20Sopenharmony_ci	__be32			data_access_protocol;
998c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	mtime_client;
1008c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	mtime_server;
1018c2ecf20Sopenharmony_ci	__be32			lock_count;
1028c2ecf20Sopenharmony_ci	__be32			abort_code;
1038c2ecf20Sopenharmony_ci} __packed;
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistruct yfs_xdr_YFSCallBack {
1068c2ecf20Sopenharmony_ci	__be32			version;
1078c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	expiration_time;
1088c2ecf20Sopenharmony_ci	__be32			type;
1098c2ecf20Sopenharmony_ci} __packed;
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_cistruct yfs_xdr_YFSStoreStatus {
1128c2ecf20Sopenharmony_ci	__be32			mask;
1138c2ecf20Sopenharmony_ci	__be32			mode;
1148c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	mtime_client;
1158c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	owner;
1168c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	group;
1178c2ecf20Sopenharmony_ci} __packed;
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_cistruct yfs_xdr_RPCFlags {
1208c2ecf20Sopenharmony_ci	__be32			rpc_flags;
1218c2ecf20Sopenharmony_ci} __packed;
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_cistruct yfs_xdr_YFSVolSync {
1248c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	vol_creation_date;
1258c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	vol_update_date;
1268c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	max_quota;
1278c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	blocks_in_use;
1288c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	blocks_avail;
1298c2ecf20Sopenharmony_ci} __packed;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_cienum yfs_volume_type {
1328c2ecf20Sopenharmony_ci	yfs_volume_type_ro = 0,
1338c2ecf20Sopenharmony_ci	yfs_volume_type_rw = 1,
1348c2ecf20Sopenharmony_ci};
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_ci#define yfs_FVSOnline		0x1
1378c2ecf20Sopenharmony_ci#define yfs_FVSInservice	0x2
1388c2ecf20Sopenharmony_ci#define yfs_FVSBlessed		0x4
1398c2ecf20Sopenharmony_ci#define yfs_FVSNeedsSalvage	0x8
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_cistruct yfs_xdr_YFSFetchVolumeStatus {
1428c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	vid;
1438c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	parent_id;
1448c2ecf20Sopenharmony_ci	__be32			flags;
1458c2ecf20Sopenharmony_ci	__be32			type;
1468c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	max_quota;
1478c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	blocks_in_use;
1488c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	part_blocks_avail;
1498c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	part_max_blocks;
1508c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	vol_copy_date;
1518c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	vol_backup_date;
1528c2ecf20Sopenharmony_ci} __packed;
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_cistruct yfs_xdr_YFSStoreVolumeStatus {
1558c2ecf20Sopenharmony_ci	__be32			mask;
1568c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	min_quota;
1578c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	max_quota;
1588c2ecf20Sopenharmony_ci	struct yfs_xdr_u64	file_quota;
1598c2ecf20Sopenharmony_ci} __packed;
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_cienum yfs_lock_type {
1628c2ecf20Sopenharmony_ci	yfs_LockNone		= -1,
1638c2ecf20Sopenharmony_ci	yfs_LockRead		= 0,
1648c2ecf20Sopenharmony_ci	yfs_LockWrite		= 1,
1658c2ecf20Sopenharmony_ci	yfs_LockExtend		= 2,
1668c2ecf20Sopenharmony_ci	yfs_LockRelease		= 3,
1678c2ecf20Sopenharmony_ci	yfs_LockMandatoryRead	= 0x100,
1688c2ecf20Sopenharmony_ci	yfs_LockMandatoryWrite	= 0x101,
1698c2ecf20Sopenharmony_ci	yfs_LockMandatoryExtend	= 0x102,
1708c2ecf20Sopenharmony_ci};
171