2 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 #ifndef __XFS_DIR2_SF_H__
19 #define __XFS_DIR2_SF_H__
22 * Directory layout when stored internal to an inode.
24 * Small directories are packed as tightly as possible so as to fit into the
25 * literal area of the inode. They consist of a single xfs_dir2_sf_hdr header
26 * followed by zero or more xfs_dir2_sf_entry structures. Due the different
27 * inode number storage size and the variable length name field in
28 * the xfs_dir2_sf_entry all these structure are variable length, and the
29 * accessors in this file should be used to iterate over them.
35 struct xfs_dir2_data_hdr
;
41 * Inode number stored as 8 8-bit values.
43 typedef struct { __uint8_t i
[8]; } xfs_dir2_ino8_t
;
46 * Inode number stored as 4 8-bit values.
47 * Works a lot of the time, when all the inode numbers in a directory
50 typedef struct { __uint8_t i
[4]; } xfs_dir2_ino4_t
;
56 #define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL)
59 * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t.
60 * Only need 16 bits, this is the byte offset into the single block form.
62 typedef struct { __uint8_t i
[2]; } __arch_pack xfs_dir2_sf_off_t
;
65 * The parent directory has a dedicated field, and the self-pointer must
66 * be calculated on the fly.
68 * Entries are packed toward the top as tightly as possible, and thus may
69 * be misaligned. Care needs to be taken to access them through special
70 * helpers or copy them into aligned variables first.
72 typedef struct xfs_dir2_sf_hdr
{
73 __uint8_t count
; /* count of entries */
74 __uint8_t i8count
; /* count of 8-byte inode #s */
75 xfs_dir2_inou_t parent
; /* parent dir inode number */
76 } __arch_pack xfs_dir2_sf_hdr_t
;
78 typedef struct xfs_dir2_sf_entry
{
79 __u8 namelen
; /* actual name length */
80 xfs_dir2_sf_off_t offset
; /* saved offset */
81 __u8 name
[]; /* name, variable size */
83 * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a
84 * variable offset after the name.
86 } __arch_pack xfs_dir2_sf_entry_t
;
88 static inline int xfs_dir2_sf_hdr_size(int i8count
)
90 return ((uint
)sizeof(xfs_dir2_sf_hdr_t
) - \
92 ((uint
)sizeof(xfs_dir2_ino8_t
) - (uint
)sizeof(xfs_dir2_ino4_t
)));
95 static inline xfs_dir2_data_aoff_t
96 xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t
*sfep
)
98 return get_unaligned_be16(&sfep
->offset
.i
);
102 xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t
*sfep
, xfs_dir2_data_aoff_t off
)
104 put_unaligned_be16(off
, &sfep
->offset
.i
);
108 xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr
*hdr
, int len
)
110 return sizeof(struct xfs_dir2_sf_entry
) + /* namelen + offset */
112 (hdr
->i8count
? /* ino */
113 sizeof(xfs_dir2_ino8_t
) :
114 sizeof(xfs_dir2_ino4_t
));
117 static inline struct xfs_dir2_sf_entry
*
118 xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr
*hdr
)
120 return (struct xfs_dir2_sf_entry
*)
121 ((char *)hdr
+ xfs_dir2_sf_hdr_size(hdr
->i8count
));
124 static inline struct xfs_dir2_sf_entry
*
125 xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr
*hdr
,
126 struct xfs_dir2_sf_entry
*sfep
)
128 return (struct xfs_dir2_sf_entry
*)
129 ((char *)sfep
+ xfs_dir2_sf_entsize(hdr
, sfep
->namelen
));
135 extern xfs_ino_t
xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr
*sfp
);
136 extern xfs_ino_t
xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr
*sfp
,
137 struct xfs_dir2_sf_entry
*sfep
);
138 extern int xfs_dir2_block_sfsize(struct xfs_inode
*dp
,
139 struct xfs_dir2_data_hdr
*block
,
140 xfs_dir2_sf_hdr_t
*sfhp
);
141 extern int xfs_dir2_block_to_sf(struct xfs_da_args
*args
, struct xfs_dabuf
*bp
,
142 int size
, xfs_dir2_sf_hdr_t
*sfhp
);
143 extern int xfs_dir2_sf_addname(struct xfs_da_args
*args
);
144 extern int xfs_dir2_sf_create(struct xfs_da_args
*args
, xfs_ino_t pino
);
145 extern int xfs_dir2_sf_getdents(struct xfs_inode
*dp
, void *dirent
,
146 xfs_off_t
*offset
, filldir_t filldir
);
147 extern int xfs_dir2_sf_lookup(struct xfs_da_args
*args
);
148 extern int xfs_dir2_sf_removename(struct xfs_da_args
*args
);
149 extern int xfs_dir2_sf_replace(struct xfs_da_args
*args
);
151 #endif /* __XFS_DIR2_SF_H__ */