Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / fs / afs / xdr_fs.h
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 */