|  | /* AFS fileserver XDR types | 
|  | * | 
|  | * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved. | 
|  | * Written by David Howells (dhowells@redhat.com) | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU General Public Licence | 
|  | * as published by the Free Software Foundation; either version | 
|  | * 2 of the Licence, or (at your option) any later version. | 
|  | */ | 
|  |  | 
|  | #ifndef XDR_FS_H | 
|  | #define XDR_FS_H | 
|  |  | 
|  | struct afs_xdr_AFSFetchStatus { | 
|  | __be32	if_version; | 
|  | #define AFS_FSTATUS_VERSION	1 | 
|  | __be32	type; | 
|  | __be32	nlink; | 
|  | __be32	size_lo; | 
|  | __be32	data_version_lo; | 
|  | __be32	author; | 
|  | __be32	owner; | 
|  | __be32	caller_access; | 
|  | __be32	anon_access; | 
|  | __be32	mode; | 
|  | __be32	parent_vnode; | 
|  | __be32	parent_unique; | 
|  | __be32	seg_size; | 
|  | __be32	mtime_client; | 
|  | __be32	mtime_server; | 
|  | __be32	group; | 
|  | __be32	sync_counter; | 
|  | __be32	data_version_hi; | 
|  | __be32	lock_count; | 
|  | __be32	size_hi; | 
|  | __be32	abort_code; | 
|  | } __packed; | 
|  |  | 
|  | #define AFS_DIR_HASHTBL_SIZE	128 | 
|  | #define AFS_DIR_DIRENT_SIZE	32 | 
|  | #define AFS_DIR_SLOTS_PER_BLOCK	64 | 
|  | #define AFS_DIR_BLOCK_SIZE	2048 | 
|  | #define AFS_DIR_BLOCKS_PER_PAGE	(PAGE_SIZE / AFS_DIR_BLOCK_SIZE) | 
|  | #define AFS_DIR_MAX_SLOTS	65536 | 
|  | #define AFS_DIR_BLOCKS_WITH_CTR	128 | 
|  | #define AFS_DIR_MAX_BLOCKS	1023 | 
|  | #define AFS_DIR_RESV_BLOCKS	1 | 
|  | #define AFS_DIR_RESV_BLOCKS0	13 | 
|  |  | 
|  | /* | 
|  | * Directory entry structure. | 
|  | */ | 
|  | union afs_xdr_dirent { | 
|  | struct { | 
|  | u8		valid; | 
|  | u8		unused[1]; | 
|  | __be16		hash_next; | 
|  | __be32		vnode; | 
|  | __be32		unique; | 
|  | u8		name[16]; | 
|  | u8		overflow[4];	/* if any char of the name (inc | 
|  | * NUL) reaches here, consume | 
|  | * the next dirent too */ | 
|  | } u; | 
|  | u8			extended_name[32]; | 
|  | } __packed; | 
|  |  | 
|  | /* | 
|  | * Directory block header (one at the beginning of every 2048-byte block). | 
|  | */ | 
|  | struct afs_xdr_dir_hdr { | 
|  | __be16		npages; | 
|  | __be16		magic; | 
|  | #define AFS_DIR_MAGIC htons(1234) | 
|  | u8		reserved; | 
|  | u8		bitmap[8]; | 
|  | u8		pad[19]; | 
|  | } __packed; | 
|  |  | 
|  | /* | 
|  | * Directory block layout | 
|  | */ | 
|  | union afs_xdr_dir_block { | 
|  | struct afs_xdr_dir_hdr		hdr; | 
|  |  | 
|  | struct { | 
|  | struct afs_xdr_dir_hdr	hdr; | 
|  | u8			alloc_ctrs[AFS_DIR_MAX_BLOCKS]; | 
|  | __be16			hashtable[AFS_DIR_HASHTBL_SIZE]; | 
|  | } meta; | 
|  |  | 
|  | union afs_xdr_dirent	dirents[AFS_DIR_SLOTS_PER_BLOCK]; | 
|  | } __packed; | 
|  |  | 
|  | /* | 
|  | * Directory layout on a linux VM page. | 
|  | */ | 
|  | struct afs_xdr_dir_page { | 
|  | union afs_xdr_dir_block	blocks[AFS_DIR_BLOCKS_PER_PAGE]; | 
|  | }; | 
|  |  | 
|  | #endif /* XDR_FS_H */ |