1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* AFS fileserver XDR types
3  *
4  * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7 
8 #ifndef XDR_FS_H
9 #define XDR_FS_H
10 
11 struct afs_xdr_AFSFetchStatus {
12 	__be32	if_version;
13 #define AFS_FSTATUS_VERSION	1
14 	__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	128
37 #define AFS_DIR_DIRENT_SIZE	32
38 #define AFS_DIR_SLOTS_PER_BLOCK	64
39 #define AFS_DIR_BLOCK_SIZE	2048
40 #define AFS_DIR_BLOCKS_PER_PAGE	(PAGE_SIZE / AFS_DIR_BLOCK_SIZE)
41 #define AFS_DIR_MAX_SLOTS	65536
42 #define AFS_DIR_BLOCKS_WITH_CTR	128
43 #define AFS_DIR_MAX_BLOCKS	1023
44 #define AFS_DIR_RESV_BLOCKS	1
45 #define AFS_DIR_RESV_BLOCKS0	13
46 
47 /*
48  * Directory entry structure.
49  */
50 union 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[16];
58 		u8		overflow[4];	/* if any char of the name (inc
59 						 * NUL) reaches here, consume
60 						 * the next dirent too */
61 	} u;
62 	u8			extended_name[32];
63 } __packed;
64 
65 /*
66  * Directory block header (one at the beginning of every 2048-byte block).
67  */
68 struct afs_xdr_dir_hdr {
69 	__be16		npages;
70 	__be16		magic;
71 #define AFS_DIR_MAGIC htons(1234)
72 	u8		reserved;
73 	u8		bitmap[8];
74 	u8		pad[19];
75 } __packed;
76 
77 /*
78  * Directory block layout
79  */
80 union afs_xdr_dir_block {
81 	struct afs_xdr_dir_hdr		hdr;
82 
83 	struct {
84 		struct afs_xdr_dir_hdr	hdr;
85 		u8			alloc_ctrs[AFS_DIR_MAX_BLOCKS];
86 		__be16			hashtable[AFS_DIR_HASHTBL_SIZE];
87 	} meta;
88 
89 	union afs_xdr_dirent	dirents[AFS_DIR_SLOTS_PER_BLOCK];
90 } __packed;
91 
92 /*
93  * Directory layout on a linux VM page.
94  */
95 struct afs_xdr_dir_page {
96 	union afs_xdr_dir_block	blocks[AFS_DIR_BLOCKS_PER_PAGE];
97 };
98 
99 #endif /* XDR_FS_H */
100