afs: Work around strnlen() oops with CONFIG_FORTIFIED_SOURCE=y
[linux-2.6-microblaze.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[];
58                 /* When determining the number of dirent slots needed to
59                  * represent a directory entry, name should be assumed to be 16
60                  * bytes, due to a now-standardised (mis)calculation, but it is
61                  * in fact 20 bytes in size.
62                  *
63                  * For names longer than (16 or) 20 bytes, extra slots should
64                  * be annexed to this one using the extended_name format.
65                  */
66         } u;
67         u8                      extended_name[32];
68 } __packed;
69
70 /*
71  * Directory block header (one at the beginning of every 2048-byte block).
72  */
73 struct afs_xdr_dir_hdr {
74         __be16          npages;
75         __be16          magic;
76 #define AFS_DIR_MAGIC htons(1234)
77         u8              reserved;
78         u8              bitmap[8];
79         u8              pad[19];
80 } __packed;
81
82 /*
83  * Directory block layout
84  */
85 union afs_xdr_dir_block {
86         struct afs_xdr_dir_hdr          hdr;
87
88         struct {
89                 struct afs_xdr_dir_hdr  hdr;
90                 u8                      alloc_ctrs[AFS_DIR_MAX_BLOCKS];
91                 __be16                  hashtable[AFS_DIR_HASHTBL_SIZE];
92         } meta;
93
94         union afs_xdr_dirent    dirents[AFS_DIR_SLOTS_PER_BLOCK];
95 } __packed;
96
97 /*
98  * Directory layout on a linux VM page.
99  */
100 struct afs_xdr_dir_page {
101         union afs_xdr_dir_block blocks[AFS_DIR_BLOCKS_PER_PAGE];
102 };
103
104 #endif /* XDR_FS_H */