Linux-libre 4.19.116-gnu
[librecmc/linux-libre.git] / fs / afs / xdr_fs.h
1 /* AFS fileserver XDR types
2  *
3  * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public Licence
8  * as published by the Free Software Foundation; either version
9  * 2 of the Licence, or (at your option) any later version.
10  */
11
12 #ifndef XDR_FS_H
13 #define XDR_FS_H
14
15 struct afs_xdr_AFSFetchStatus {
16         __be32  if_version;
17 #define AFS_FSTATUS_VERSION     1
18         __be32  type;
19         __be32  nlink;
20         __be32  size_lo;
21         __be32  data_version_lo;
22         __be32  author;
23         __be32  owner;
24         __be32  caller_access;
25         __be32  anon_access;
26         __be32  mode;
27         __be32  parent_vnode;
28         __be32  parent_unique;
29         __be32  seg_size;
30         __be32  mtime_client;
31         __be32  mtime_server;
32         __be32  group;
33         __be32  sync_counter;
34         __be32  data_version_hi;
35         __be32  lock_count;
36         __be32  size_hi;
37         __be32  abort_code;
38 } __packed;
39
40 #define AFS_DIR_HASHTBL_SIZE    128
41 #define AFS_DIR_DIRENT_SIZE     32
42 #define AFS_DIR_SLOTS_PER_BLOCK 64
43 #define AFS_DIR_BLOCK_SIZE      2048
44 #define AFS_DIR_BLOCKS_PER_PAGE (PAGE_SIZE / AFS_DIR_BLOCK_SIZE)
45 #define AFS_DIR_MAX_SLOTS       65536
46 #define AFS_DIR_BLOCKS_WITH_CTR 128
47 #define AFS_DIR_MAX_BLOCKS      1023
48 #define AFS_DIR_RESV_BLOCKS     1
49 #define AFS_DIR_RESV_BLOCKS0    13
50
51 /*
52  * Directory entry structure.
53  */
54 union afs_xdr_dirent {
55         struct {
56                 u8              valid;
57                 u8              unused[1];
58                 __be16          hash_next;
59                 __be32          vnode;
60                 __be32          unique;
61                 u8              name[16];
62                 u8              overflow[4];    /* if any char of the name (inc
63                                                  * NUL) reaches here, consume
64                                                  * the next dirent too */
65         } u;
66         u8                      extended_name[32];
67 } __packed;
68
69 /*
70  * Directory block header (one at the beginning of every 2048-byte block).
71  */
72 struct afs_xdr_dir_hdr {
73         __be16          npages;
74         __be16          magic;
75 #define AFS_DIR_MAGIC htons(1234)
76         u8              reserved;
77         u8              bitmap[8];
78         u8              pad[19];
79 } __packed;
80
81 /*
82  * Directory block layout
83  */
84 union afs_xdr_dir_block {
85         struct afs_xdr_dir_hdr          hdr;
86
87         struct {
88                 struct afs_xdr_dir_hdr  hdr;
89                 u8                      alloc_ctrs[AFS_DIR_MAX_BLOCKS];
90                 __be16                  hashtable[AFS_DIR_HASHTBL_SIZE];
91         } meta;
92
93         union afs_xdr_dirent    dirents[AFS_DIR_SLOTS_PER_BLOCK];
94 } __packed;
95
96 /*
97  * Directory layout on a linux VM page.
98  */
99 struct afs_xdr_dir_page {
100         union afs_xdr_dir_block blocks[AFS_DIR_BLOCKS_PER_PAGE];
101 };
102
103 #endif /* XDR_FS_H */