1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
4 * Copyright (c) 2013 Red Hat, Inc.
9 #include "xfs_shared.h"
10 #include "xfs_format.h"
11 #include "xfs_log_format.h"
12 #include "xfs_trans_resv.h"
13 #include "xfs_mount.h"
14 #include "xfs_inode.h"
16 #include "xfs_dir2_priv.h"
17 #include "xfs_trace.h"
19 #include "xfs_trans.h"
20 #include "xfs_error.h"
23 * Directory file type support functions
25 static unsigned char xfs_dir3_filetype_table
[] = {
26 DT_UNKNOWN
, DT_REG
, DT_DIR
, DT_CHR
, DT_BLK
,
27 DT_FIFO
, DT_SOCK
, DT_LNK
, DT_WHT
,
35 if (!xfs_sb_version_hasftype(&mp
->m_sb
))
38 if (filetype
>= XFS_DIR3_FT_MAX
)
41 return xfs_dir3_filetype_table
[filetype
];
46 struct xfs_da_args
*args
,
47 struct dir_context
*ctx
)
49 int i
; /* shortform entry number */
50 struct xfs_inode
*dp
= args
->dp
; /* incore directory inode */
51 struct xfs_mount
*mp
= dp
->i_mount
;
52 xfs_dir2_dataptr_t off
; /* current entry's offset */
53 xfs_dir2_sf_entry_t
*sfep
; /* shortform directory entry */
54 xfs_dir2_sf_hdr_t
*sfp
; /* shortform structure */
55 xfs_dir2_dataptr_t dot_offset
;
56 xfs_dir2_dataptr_t dotdot_offset
;
58 struct xfs_da_geometry
*geo
= args
->geo
;
60 ASSERT(dp
->i_df
.if_flags
& XFS_IFINLINE
);
61 ASSERT(dp
->i_df
.if_bytes
== dp
->i_d
.di_size
);
62 ASSERT(dp
->i_df
.if_u1
.if_data
!= NULL
);
64 sfp
= (xfs_dir2_sf_hdr_t
*)dp
->i_df
.if_u1
.if_data
;
67 * If the block number in the offset is out of range, we're done.
69 if (xfs_dir2_dataptr_to_db(geo
, ctx
->pos
) > geo
->datablk
)
73 * Precalculate offsets for "." and ".." as we will always need them.
74 * This relies on the fact that directories always start with the
75 * entries for "." and "..".
77 dot_offset
= xfs_dir2_db_off_to_dataptr(geo
, geo
->datablk
,
78 geo
->data_entry_offset
);
79 dotdot_offset
= xfs_dir2_db_off_to_dataptr(geo
, geo
->datablk
,
80 geo
->data_entry_offset
+
81 xfs_dir2_data_entsize(mp
, sizeof(".") - 1));
84 * Put . entry unless we're starting past it.
86 if (ctx
->pos
<= dot_offset
) {
87 ctx
->pos
= dot_offset
& 0x7fffffff;
88 if (!dir_emit(ctx
, ".", 1, dp
->i_ino
, DT_DIR
))
93 * Put .. entry unless we're starting past it.
95 if (ctx
->pos
<= dotdot_offset
) {
96 ino
= xfs_dir2_sf_get_parent_ino(sfp
);
97 ctx
->pos
= dotdot_offset
& 0x7fffffff;
98 if (!dir_emit(ctx
, "..", 2, ino
, DT_DIR
))
103 * Loop while there are more entries and put'ing works.
105 sfep
= xfs_dir2_sf_firstentry(sfp
);
106 for (i
= 0; i
< sfp
->count
; i
++) {
109 off
= xfs_dir2_db_off_to_dataptr(geo
, geo
->datablk
,
110 xfs_dir2_sf_get_offset(sfep
));
112 if (ctx
->pos
> off
) {
113 sfep
= xfs_dir2_sf_nextentry(mp
, sfp
, sfep
);
117 ino
= xfs_dir2_sf_get_ino(mp
, sfp
, sfep
);
118 filetype
= xfs_dir2_sf_get_ftype(mp
, sfep
);
119 ctx
->pos
= off
& 0x7fffffff;
120 if (XFS_IS_CORRUPT(dp
->i_mount
,
121 !xfs_dir2_namecheck(sfep
->name
,
123 return -EFSCORRUPTED
;
124 if (!dir_emit(ctx
, (char *)sfep
->name
, sfep
->namelen
, ino
,
125 xfs_dir3_get_dtype(mp
, filetype
)))
127 sfep
= xfs_dir2_sf_nextentry(mp
, sfp
, sfep
);
130 ctx
->pos
= xfs_dir2_db_off_to_dataptr(geo
, geo
->datablk
+ 1, 0) &
136 * Readdir for block directories.
139 xfs_dir2_block_getdents(
140 struct xfs_da_args
*args
,
141 struct dir_context
*ctx
)
143 struct xfs_inode
*dp
= args
->dp
; /* incore directory inode */
144 struct xfs_buf
*bp
; /* buffer for block */
145 int error
; /* error return value */
146 int wantoff
; /* starting block offset */
148 struct xfs_da_geometry
*geo
= args
->geo
;
150 unsigned int offset
, next_offset
;
154 * If the block number in the offset is out of range, we're done.
156 if (xfs_dir2_dataptr_to_db(geo
, ctx
->pos
) > geo
->datablk
)
159 lock_mode
= xfs_ilock_data_map_shared(dp
);
160 error
= xfs_dir3_block_read(args
->trans
, dp
, &bp
);
161 xfs_iunlock(dp
, lock_mode
);
166 * Extract the byte offset we start at from the seek pointer.
167 * We'll skip entries before this.
169 wantoff
= xfs_dir2_dataptr_to_off(geo
, ctx
->pos
);
170 xfs_dir3_data_check(dp
, bp
);
173 * Loop over the data portion of the block.
174 * Each object is a real entry (dep) or an unused one (dup).
176 end
= xfs_dir3_data_end_offset(geo
, bp
->b_addr
);
177 for (offset
= geo
->data_entry_offset
;
179 offset
= next_offset
) {
180 struct xfs_dir2_data_unused
*dup
= bp
->b_addr
+ offset
;
181 struct xfs_dir2_data_entry
*dep
= bp
->b_addr
+ offset
;
187 if (be16_to_cpu(dup
->freetag
) == XFS_DIR2_DATA_FREE_TAG
) {
188 next_offset
= offset
+ be16_to_cpu(dup
->length
);
193 * Bump pointer for the next iteration.
195 next_offset
= offset
+
196 xfs_dir2_data_entsize(dp
->i_mount
, dep
->namelen
);
199 * The entry is before the desired starting point, skip it.
201 if (offset
< wantoff
)
204 cook
= xfs_dir2_db_off_to_dataptr(geo
, geo
->datablk
, offset
);
206 ctx
->pos
= cook
& 0x7fffffff;
207 filetype
= xfs_dir2_data_get_ftype(dp
->i_mount
, dep
);
209 * If it didn't fit, set the final offset to here & return.
211 if (XFS_IS_CORRUPT(dp
->i_mount
,
212 !xfs_dir2_namecheck(dep
->name
,
214 error
= -EFSCORRUPTED
;
217 if (!dir_emit(ctx
, (char *)dep
->name
, dep
->namelen
,
218 be64_to_cpu(dep
->inumber
),
219 xfs_dir3_get_dtype(dp
->i_mount
, filetype
)))
224 * Reached the end of the block.
225 * Set the offset to a non-existent block 1 and return.
227 ctx
->pos
= xfs_dir2_db_off_to_dataptr(geo
, geo
->datablk
+ 1, 0) &
230 xfs_trans_brelse(args
->trans
, bp
);
235 * Read a directory block and initiate readahead for blocks beyond that.
236 * We maintain a sliding readahead window of the remaining space in the
237 * buffer rounded up to the nearest block.
240 xfs_dir2_leaf_readbuf(
241 struct xfs_da_args
*args
,
243 xfs_dir2_off_t
*cur_off
,
245 struct xfs_buf
**bpp
)
247 struct xfs_inode
*dp
= args
->dp
;
248 struct xfs_buf
*bp
= NULL
;
249 struct xfs_da_geometry
*geo
= args
->geo
;
250 struct xfs_ifork
*ifp
= XFS_IFORK_PTR(dp
, XFS_DATA_FORK
);
251 struct xfs_bmbt_irec map
;
252 struct blk_plug plug
;
253 xfs_dir2_off_t new_off
;
257 struct xfs_iext_cursor icur
;
261 if (!(ifp
->if_flags
& XFS_IFEXTENTS
)) {
262 error
= xfs_iread_extents(args
->trans
, dp
, XFS_DATA_FORK
);
268 * Look for mapped directory blocks at or above the current offset.
269 * Truncate down to the nearest directory block to start the scanning
272 last_da
= xfs_dir2_byte_to_da(geo
, XFS_DIR2_LEAF_OFFSET
);
273 map_off
= xfs_dir2_db_to_da(geo
, xfs_dir2_byte_to_db(geo
, *cur_off
));
274 if (!xfs_iext_lookup_extent(dp
, ifp
, map_off
, &icur
, &map
))
276 if (map
.br_startoff
>= last_da
)
278 xfs_trim_extent(&map
, map_off
, last_da
- map_off
);
280 /* Read the directory block of that first mapping. */
281 new_off
= xfs_dir2_da_to_byte(geo
, map
.br_startoff
);
282 if (new_off
> *cur_off
)
284 error
= xfs_dir3_data_read(args
->trans
, dp
, map
.br_startoff
, 0, &bp
);
289 * Start readahead for the next bufsize's worth of dir data blocks.
290 * We may have already issued readahead for some of that range;
291 * ra_blk tracks the last block we tried to read(ahead).
293 ra_want
= howmany(bufsize
+ geo
->blksize
, (1 << geo
->fsblog
));
294 if (*ra_blk
>= last_da
)
296 else if (*ra_blk
== 0)
297 *ra_blk
= map
.br_startoff
;
298 next_ra
= map
.br_startoff
+ geo
->fsbcount
;
299 if (next_ra
>= last_da
)
301 if (map
.br_blockcount
< geo
->fsbcount
&&
302 !xfs_iext_next_extent(ifp
, &icur
, &map
))
304 if (map
.br_startoff
>= last_da
)
306 xfs_trim_extent(&map
, next_ra
, last_da
- next_ra
);
308 /* Start ra for each dir (not fs) block that has a mapping. */
309 blk_start_plug(&plug
);
310 while (ra_want
> 0) {
311 next_ra
= roundup((xfs_dablk_t
)map
.br_startoff
, geo
->fsbcount
);
312 while (ra_want
> 0 &&
313 next_ra
< map
.br_startoff
+ map
.br_blockcount
) {
314 if (next_ra
>= last_da
) {
318 if (next_ra
> *ra_blk
) {
319 xfs_dir3_data_readahead(dp
, next_ra
,
320 XFS_DABUF_MAP_HOLE_OK
);
323 ra_want
-= geo
->fsbcount
;
324 next_ra
+= geo
->fsbcount
;
326 if (!xfs_iext_next_extent(ifp
, &icur
, &map
)) {
331 blk_finish_plug(&plug
);
342 * Getdents (readdir) for leaf and node directories.
343 * This reads the data blocks only, so is the same for both forms.
346 xfs_dir2_leaf_getdents(
347 struct xfs_da_args
*args
,
348 struct dir_context
*ctx
,
351 struct xfs_inode
*dp
= args
->dp
;
352 struct xfs_mount
*mp
= dp
->i_mount
;
353 struct xfs_buf
*bp
= NULL
; /* data block buffer */
354 xfs_dir2_data_entry_t
*dep
; /* data entry */
355 xfs_dir2_data_unused_t
*dup
; /* unused entry */
356 struct xfs_da_geometry
*geo
= args
->geo
;
357 xfs_dablk_t rablk
= 0; /* current readahead block */
358 xfs_dir2_off_t curoff
; /* current overall offset */
359 int length
; /* temporary length value */
360 int byteoff
; /* offset in current block */
362 unsigned int offset
= 0;
363 int error
= 0; /* error return value */
366 * If the offset is at or past the largest allowed value,
367 * give up right away.
369 if (ctx
->pos
>= XFS_DIR2_MAX_DATAPTR
)
373 * Inside the loop we keep the main offset value as a byte offset
374 * in the directory file.
376 curoff
= xfs_dir2_dataptr_to_byte(ctx
->pos
);
379 * Loop over directory entries until we reach the end offset.
380 * Get more blocks and readahead as necessary.
382 while (curoff
< XFS_DIR2_LEAF_OFFSET
) {
386 * If we have no buffer, or we're off the end of the
387 * current buffer, need to get another one.
389 if (!bp
|| offset
>= geo
->blksize
) {
391 xfs_trans_brelse(args
->trans
, bp
);
395 lock_mode
= xfs_ilock_data_map_shared(dp
);
396 error
= xfs_dir2_leaf_readbuf(args
, bufsize
, &curoff
,
398 xfs_iunlock(dp
, lock_mode
);
402 xfs_dir3_data_check(dp
, bp
);
404 * Find our position in the block.
406 offset
= geo
->data_entry_offset
;
407 byteoff
= xfs_dir2_byte_to_off(geo
, curoff
);
409 * Skip past the header.
412 curoff
+= geo
->data_entry_offset
;
414 * Skip past entries until we reach our offset.
417 while (offset
< byteoff
) {
418 dup
= bp
->b_addr
+ offset
;
420 if (be16_to_cpu(dup
->freetag
)
421 == XFS_DIR2_DATA_FREE_TAG
) {
423 length
= be16_to_cpu(dup
->length
);
427 dep
= bp
->b_addr
+ offset
;
428 length
= xfs_dir2_data_entsize(mp
,
433 * Now set our real offset.
436 xfs_dir2_db_off_to_byte(geo
,
437 xfs_dir2_byte_to_db(geo
, curoff
),
439 if (offset
>= geo
->blksize
)
445 * We have a pointer to an entry. Is it a live one?
447 dup
= bp
->b_addr
+ offset
;
450 * No, it's unused, skip over it.
452 if (be16_to_cpu(dup
->freetag
) == XFS_DIR2_DATA_FREE_TAG
) {
453 length
= be16_to_cpu(dup
->length
);
459 dep
= bp
->b_addr
+ offset
;
460 length
= xfs_dir2_data_entsize(mp
, dep
->namelen
);
461 filetype
= xfs_dir2_data_get_ftype(mp
, dep
);
463 ctx
->pos
= xfs_dir2_byte_to_dataptr(curoff
) & 0x7fffffff;
464 if (XFS_IS_CORRUPT(dp
->i_mount
,
465 !xfs_dir2_namecheck(dep
->name
,
467 error
= -EFSCORRUPTED
;
470 if (!dir_emit(ctx
, (char *)dep
->name
, dep
->namelen
,
471 be64_to_cpu(dep
->inumber
),
472 xfs_dir3_get_dtype(dp
->i_mount
, filetype
)))
476 * Advance to next entry in the block.
480 /* bufsize may have just been a guess; don't go negative */
481 bufsize
= bufsize
> length
? bufsize
- length
: 0;
485 * All done. Set output offset value to current offset.
487 if (curoff
> xfs_dir2_dataptr_to_byte(XFS_DIR2_MAX_DATAPTR
))
488 ctx
->pos
= XFS_DIR2_MAX_DATAPTR
& 0x7fffffff;
490 ctx
->pos
= xfs_dir2_byte_to_dataptr(curoff
) & 0x7fffffff;
492 xfs_trans_brelse(args
->trans
, bp
);
499 * If supplied, the transaction collects locked dir buffers to avoid
500 * nested buffer deadlocks. This function does not dirty the
501 * transaction. The caller should ensure that the inode is locked
502 * before calling this function.
506 struct xfs_trans
*tp
,
507 struct xfs_inode
*dp
,
508 struct dir_context
*ctx
,
511 struct xfs_da_args args
= { NULL
};
515 trace_xfs_readdir(dp
);
517 if (XFS_FORCED_SHUTDOWN(dp
->i_mount
))
520 ASSERT(S_ISDIR(VFS_I(dp
)->i_mode
));
521 XFS_STATS_INC(dp
->i_mount
, xs_dir_getdents
);
524 args
.geo
= dp
->i_mount
->m_dir_geo
;
527 if (dp
->i_d
.di_format
== XFS_DINODE_FMT_LOCAL
)
528 rval
= xfs_dir2_sf_getdents(&args
, ctx
);
529 else if ((rval
= xfs_dir2_isblock(&args
, &v
)))
532 rval
= xfs_dir2_block_getdents(&args
, ctx
);
534 rval
= xfs_dir2_leaf_getdents(&args
, ctx
, bufsize
);