brintos

brintos / linux-shallow public Read only

0
0
Text · 2.7 KiB · 8ca8681 Raw
117 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/* AFS fileserver XDR types3 *4 * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.5 * Written by David Howells (dhowells@redhat.com)6 */7 8#ifndef XDR_FS_H9#define XDR_FS_H10 11struct afs_xdr_AFSFetchStatus {12	__be32	if_version;13#define AFS_FSTATUS_VERSION	114	__be32	type;15	__be32	nlink;16	__be32	size_lo;17	__be32	data_version_lo;18	__be32	author;19	__be32	owner;20	__be32	caller_access;21	__be32	anon_access;22	__be32	mode;23	__be32	parent_vnode;24	__be32	parent_unique;25	__be32	seg_size;26	__be32	mtime_client;27	__be32	mtime_server;28	__be32	group;29	__be32	sync_counter;30	__be32	data_version_hi;31	__be32	lock_count;32	__be32	size_hi;33	__be32	abort_code;34} __packed;35 36#define AFS_DIR_HASHTBL_SIZE	12837#define AFS_DIR_DIRENT_SIZE	3238#define AFS_DIR_SLOTS_PER_BLOCK	6439#define AFS_DIR_BLOCK_SIZE	204840#define AFS_DIR_BLOCKS_PER_PAGE	(PAGE_SIZE / AFS_DIR_BLOCK_SIZE)41#define AFS_DIR_MAX_SLOTS	6553642#define AFS_DIR_BLOCKS_WITH_CTR	12843#define AFS_DIR_MAX_BLOCKS	102344#define AFS_DIR_RESV_BLOCKS	145#define AFS_DIR_RESV_BLOCKS0	1346 47/*48 * Directory entry structure.49 */50union afs_xdr_dirent {51	struct {52		u8		valid;53		u8		unused[1];54		__be16		hash_next;55		__be32		vnode;56		__be32		unique;57		u8		name[];58		/* When determining the number of dirent slots needed to59		 * represent a directory entry, name should be assumed to be 1660		 * bytes, due to a now-standardised (mis)calculation, but it is61		 * in fact 20 bytes in size.  afs_dir_calc_slots() should be62		 * used for this.63		 *64		 * For names longer than (16 or) 20 bytes, extra slots should65		 * be annexed to this one using the extended_name format.66		 */67	} u;68	u8			extended_name[32];69} __packed;70 71/*72 * Directory block header (one at the beginning of every 2048-byte block).73 */74struct afs_xdr_dir_hdr {75	__be16		npages;76	__be16		magic;77#define AFS_DIR_MAGIC htons(1234)78	u8		reserved;79	u8		bitmap[8];80	u8		pad[19];81} __packed;82 83/*84 * Directory block layout85 */86union afs_xdr_dir_block {87	struct afs_xdr_dir_hdr		hdr;88 89	struct {90		struct afs_xdr_dir_hdr	hdr;91		u8			alloc_ctrs[AFS_DIR_MAX_BLOCKS];92		__be16			hashtable[AFS_DIR_HASHTBL_SIZE];93	} meta;94 95	union afs_xdr_dirent	dirents[AFS_DIR_SLOTS_PER_BLOCK];96} __packed;97 98/*99 * Directory layout on a linux VM page.100 */101struct afs_xdr_dir_page {102	union afs_xdr_dir_block	blocks[AFS_DIR_BLOCKS_PER_PAGE];103};104 105/*106 * Calculate the number of dirent slots required for any given name length.107 * The calculation is made assuming the part of the name in the first slot is108 * 16 bytes, rather than 20, but this miscalculation is now standardised.109 */110static inline unsigned int afs_dir_calc_slots(size_t name_len)111{112	name_len++; /* NUL-terminated */113	return 1 + ((name_len + 15) / AFS_DIR_DIRENT_SIZE);114}115 116#endif /* XDR_FS_H */117