Blame view

fs/xfs/xfs_dir2_sf.h 5.24 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
7b7187698   Nathan Scott   [XFS] Update lice...
2
3
   * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
   * All Rights Reserved.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
   *
7b7187698   Nathan Scott   [XFS] Update lice...
5
6
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
   * published by the Free Software Foundation.
   *
7b7187698   Nathan Scott   [XFS] Update lice...
9
10
11
12
   * This program is distributed in the hope that it would be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
   *
7b7187698   Nathan Scott   [XFS] Update lice...
14
15
16
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write the Free Software Foundation,
   * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
   */
  #ifndef __XFS_DIR2_SF_H__
  #define	__XFS_DIR2_SF_H__
  
  /*
   * Directory layout when stored internal to an inode.
   *
   * Small directories are packed as tightly as possible so as to
   * fit into the literal area of the inode.
   */
  
  struct uio;
  struct xfs_dabuf;
  struct xfs_da_args;
  struct xfs_dir2_block;
  struct xfs_inode;
  struct xfs_mount;
  struct xfs_trans;
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
   * Inode number stored as 8 8-bit values.
   */
  typedef	struct { __uint8_t i[8]; } xfs_dir2_ino8_t;
  
  /*
   * Inode number stored as 4 8-bit values.
   * Works a lot of the time, when all the inode numbers in a directory
   * fit in 32 bits.
   */
  typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t;
  
  typedef union {
  	xfs_dir2_ino8_t	i8;
  	xfs_dir2_ino4_t	i4;
  } xfs_dir2_inou_t;
  #define	XFS_DIR2_MAX_SHORT_INUM	((xfs_ino_t)0xffffffffULL)
  
  /*
   * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t.
   * Only need 16 bits, this is the byte offset into the single block form.
   */
ae23a5e87   Eric Sandeen   [XFS] Pack some s...
58
  typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
63
64
65
66
67
68
69
70
71
  
  /*
   * The parent directory has a dedicated field, and the self-pointer must
   * be calculated on the fly.
   *
   * Entries are packed toward the top as tightly as possible.  The header
   * and the elements must be memcpy'd out into a work area to get correct
   * alignment for the inode number fields.
   */
  typedef struct xfs_dir2_sf_hdr {
  	__uint8_t		count;		/* count of entries */
  	__uint8_t		i8count;	/* count of 8-byte inode #s */
  	xfs_dir2_inou_t		parent;		/* parent dir inode number */
ae23a5e87   Eric Sandeen   [XFS] Pack some s...
72
  } __arch_pack xfs_dir2_sf_hdr_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
74
75
76
77
78
  
  typedef struct xfs_dir2_sf_entry {
  	__uint8_t		namelen;	/* actual name length */
  	xfs_dir2_sf_off_t	offset;		/* saved offset */
  	__uint8_t		name[1];	/* name, variable size */
  	xfs_dir2_inou_t		inumber;	/* inode number, var. offset */
ae23a5e87   Eric Sandeen   [XFS] Pack some s...
79
  } __arch_pack xfs_dir2_sf_entry_t; 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
  
  typedef struct xfs_dir2_sf {
  	xfs_dir2_sf_hdr_t	hdr;		/* shortform header */
  	xfs_dir2_sf_entry_t	list[1];	/* shortform entries */
  } xfs_dir2_sf_t;
a844f4510   Nathan Scott   [XFS] Remove xfs_...
85
86
87
88
89
90
  static inline int xfs_dir2_sf_hdr_size(int i8count)
  {
  	return ((uint)sizeof(xfs_dir2_sf_hdr_t) - \
  		((i8count) == 0) * \
  		((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)));
  }
a844f4510   Nathan Scott   [XFS] Remove xfs_...
91
92
93
94
  static inline xfs_dir2_inou_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *sfep)
  {
  	return (xfs_dir2_inou_t *)&(sfep)->name[(sfep)->namelen];
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95

a844f4510   Nathan Scott   [XFS] Remove xfs_...
96
97
98
99
  static inline xfs_intino_t
  xfs_dir2_sf_get_inumber(xfs_dir2_sf_t *sfp, xfs_dir2_inou_t *from)
  {
  	return ((sfp)->hdr.i8count == 0 ? \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
  		(xfs_intino_t)XFS_GET_DIR_INO4((from)->i4) : \
a844f4510   Nathan Scott   [XFS] Remove xfs_...
101
102
  		(xfs_intino_t)XFS_GET_DIR_INO8((from)->i8));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103

a844f4510   Nathan Scott   [XFS] Remove xfs_...
104
105
106
107
108
109
110
111
  static inline void xfs_dir2_sf_put_inumber(xfs_dir2_sf_t *sfp, xfs_ino_t *from,
  						xfs_dir2_inou_t *to)
  {
  	if ((sfp)->hdr.i8count == 0)
  		XFS_PUT_DIR_INO4(*(from), (to)->i4);
  	else
  		XFS_PUT_DIR_INO8(*(from), (to)->i8);
  }
a844f4510   Nathan Scott   [XFS] Remove xfs_...
112
113
114
115
116
  static inline xfs_dir2_data_aoff_t
  xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep)
  {
  	return INT_GET_UNALIGNED_16_BE(&(sfep)->offset.i);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117

a844f4510   Nathan Scott   [XFS] Remove xfs_...
118
119
120
121
122
  static inline void
  xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off)
  {
  	INT_SET_UNALIGNED_16_BE(&(sfep)->offset.i, off);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123

a844f4510   Nathan Scott   [XFS] Remove xfs_...
124
125
126
127
128
129
  static inline int xfs_dir2_sf_entsize_byname(xfs_dir2_sf_t *sfp, int len)
  {
  	return ((uint)sizeof(xfs_dir2_sf_entry_t) - 1 + (len) - \
  		((sfp)->hdr.i8count == 0) * \
  		((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)));
  }
a844f4510   Nathan Scott   [XFS] Remove xfs_...
130
131
132
133
134
135
136
  static inline int
  xfs_dir2_sf_entsize_byentry(xfs_dir2_sf_t *sfp, xfs_dir2_sf_entry_t *sfep)
  {
  	return ((uint)sizeof(xfs_dir2_sf_entry_t) - 1 + (sfep)->namelen - \
  		((sfp)->hdr.i8count == 0) * \
  		((uint)sizeof(xfs_dir2_ino8_t) - (uint)sizeof(xfs_dir2_ino4_t)));
  }
a844f4510   Nathan Scott   [XFS] Remove xfs_...
137
138
139
  static inline xfs_dir2_sf_entry_t *xfs_dir2_sf_firstentry(xfs_dir2_sf_t *sfp)
  {
  	return ((xfs_dir2_sf_entry_t *) \
bbaaf5380   Christoph Hellwig   [XFS] Reduce shou...
140
  		((char *)(sfp) + xfs_dir2_sf_hdr_size(sfp->hdr.i8count)));
a844f4510   Nathan Scott   [XFS] Remove xfs_...
141
  }
a844f4510   Nathan Scott   [XFS] Remove xfs_...
142
143
144
145
  static inline xfs_dir2_sf_entry_t *
  xfs_dir2_sf_nextentry(xfs_dir2_sf_t *sfp, xfs_dir2_sf_entry_t *sfep)
  {
  	return ((xfs_dir2_sf_entry_t *) \
bbaaf5380   Christoph Hellwig   [XFS] Reduce shou...
146
  		((char *)(sfep) + xfs_dir2_sf_entsize_byentry(sfp,sfep)));
a844f4510   Nathan Scott   [XFS] Remove xfs_...
147
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
149
150
151
  
  /*
   * Functions.
   */
a844f4510   Nathan Scott   [XFS] Remove xfs_...
152
153
154
155
156
157
158
  extern int xfs_dir2_block_sfsize(struct xfs_inode *dp,
  				 struct xfs_dir2_block *block,
  				 xfs_dir2_sf_hdr_t *sfhp);
  extern int xfs_dir2_block_to_sf(struct xfs_da_args *args, struct xfs_dabuf *bp,
  				int size, xfs_dir2_sf_hdr_t *sfhp);
  extern int xfs_dir2_sf_addname(struct xfs_da_args *args);
  extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino);
051e7cd44   Christoph Hellwig   [XFS] use filldir...
159
160
  extern int xfs_dir2_sf_getdents(struct xfs_inode *dp, void *dirent,
  				xfs_off_t *offset, filldir_t filldir);
a844f4510   Nathan Scott   [XFS] Remove xfs_...
161
162
163
  extern int xfs_dir2_sf_lookup(struct xfs_da_args *args);
  extern int xfs_dir2_sf_removename(struct xfs_da_args *args);
  extern int xfs_dir2_sf_replace(struct xfs_da_args *args);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
  
  #endif	/* __XFS_DIR2_SF_H__ */