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 */ 104