1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_inode.h"
14 #include "xfs_trans.h"
17 #include "xfs_dir2_priv.h"
18 #include "xfs_errortag.h"
19 #include "xfs_error.h"
20 #include "xfs_trace.h"
22 const struct xfs_name xfs_name_dotdot = {
23 .name = (const unsigned char *)"..",
25 .type = XFS_DIR3_FT_DIR,
29 * Convert inode mode to directory entry filetype
35 switch (mode & S_IFMT) {
37 return XFS_DIR3_FT_REG_FILE;
39 return XFS_DIR3_FT_DIR;
41 return XFS_DIR3_FT_CHRDEV;
43 return XFS_DIR3_FT_BLKDEV;
45 return XFS_DIR3_FT_FIFO;
47 return XFS_DIR3_FT_SOCK;
49 return XFS_DIR3_FT_SYMLINK;
51 return XFS_DIR3_FT_UNKNOWN;
56 * ASCII case-insensitive (ie. A-Z) support for directories that was
60 xfs_ascii_ci_hashname(
61 const struct xfs_name *name)
66 for (i = 0, hash = 0; i < name->len; i++)
67 hash = tolower(name->name[i]) ^ rol32(hash, 7);
73 xfs_ascii_ci_compname(
74 struct xfs_da_args *args,
75 const unsigned char *name,
78 enum xfs_dacmp result;
81 if (args->namelen != len)
82 return XFS_CMP_DIFFERENT;
84 result = XFS_CMP_EXACT;
85 for (i = 0; i < len; i++) {
86 if (args->name[i] == name[i])
88 if (tolower(args->name[i]) != tolower(name[i]))
89 return XFS_CMP_DIFFERENT;
90 result = XFS_CMP_CASE;
100 struct xfs_da_geometry *dageo;
103 ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT);
104 ASSERT(xfs_dir2_dirblock_bytes(&mp->m_sb) <= XFS_MAX_BLOCKSIZE);
106 mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry),
108 mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry),
110 if (!mp->m_dir_geo || !mp->m_attr_geo) {
111 kmem_free(mp->m_dir_geo);
112 kmem_free(mp->m_attr_geo);
116 /* set up directory geometry */
117 dageo = mp->m_dir_geo;
118 dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog;
119 dageo->fsblog = mp->m_sb.sb_blocklog;
120 dageo->blksize = xfs_dir2_dirblock_bytes(&mp->m_sb);
121 dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog;
122 if (xfs_has_crc(mp)) {
123 dageo->node_hdr_size = sizeof(struct xfs_da3_node_hdr);
124 dageo->leaf_hdr_size = sizeof(struct xfs_dir3_leaf_hdr);
125 dageo->free_hdr_size = sizeof(struct xfs_dir3_free_hdr);
126 dageo->data_entry_offset =
127 sizeof(struct xfs_dir3_data_hdr);
129 dageo->node_hdr_size = sizeof(struct xfs_da_node_hdr);
130 dageo->leaf_hdr_size = sizeof(struct xfs_dir2_leaf_hdr);
131 dageo->free_hdr_size = sizeof(struct xfs_dir2_free_hdr);
132 dageo->data_entry_offset =
133 sizeof(struct xfs_dir2_data_hdr);
135 dageo->leaf_max_ents = (dageo->blksize - dageo->leaf_hdr_size) /
136 sizeof(struct xfs_dir2_leaf_entry);
137 dageo->free_max_bests = (dageo->blksize - dageo->free_hdr_size) /
138 sizeof(xfs_dir2_data_off_t);
140 dageo->data_first_offset = dageo->data_entry_offset +
141 xfs_dir2_data_entsize(mp, 1) +
142 xfs_dir2_data_entsize(mp, 2);
145 * Now we've set up the block conversion variables, we can calculate the
146 * segment block constants using the geometry structure.
148 dageo->datablk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_DATA_OFFSET);
149 dageo->leafblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_LEAF_OFFSET);
150 dageo->freeblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_FREE_OFFSET);
151 dageo->node_ents = (dageo->blksize - dageo->node_hdr_size) /
152 (uint)sizeof(xfs_da_node_entry_t);
153 dageo->max_extents = (XFS_DIR2_MAX_SPACES * XFS_DIR2_SPACE_SIZE) >>
154 mp->m_sb.sb_blocklog;
155 dageo->magicpct = (dageo->blksize * 37) / 100;
157 /* set up attribute geometry - single fsb only */
158 dageo = mp->m_attr_geo;
159 dageo->blklog = mp->m_sb.sb_blocklog;
160 dageo->fsblog = mp->m_sb.sb_blocklog;
161 dageo->blksize = 1 << dageo->blklog;
163 dageo->node_hdr_size = mp->m_dir_geo->node_hdr_size;
164 dageo->node_ents = (dageo->blksize - dageo->node_hdr_size) /
165 (uint)sizeof(xfs_da_node_entry_t);
167 if (xfs_has_large_extent_counts(mp))
168 dageo->max_extents = XFS_MAX_EXTCNT_ATTR_FORK_LARGE;
170 dageo->max_extents = XFS_MAX_EXTCNT_ATTR_FORK_SMALL;
172 dageo->magicpct = (dageo->blksize * 37) / 100;
178 struct xfs_mount *mp)
180 kmem_free(mp->m_dir_geo);
181 kmem_free(mp->m_attr_geo);
185 * Return 1 if directory contains only "." and "..".
191 xfs_dir2_sf_hdr_t *sfp;
193 ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
194 if (dp->i_disk_size == 0) /* might happen during shutdown. */
196 if (dp->i_disk_size > xfs_inode_data_fork_size(dp))
198 sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
203 * Validate a given inode number.
206 xfs_dir_ino_validate(
210 bool ino_ok = xfs_verify_dir_ino(mp, ino);
212 if (XFS_IS_CORRUPT(mp, !ino_ok) ||
213 XFS_TEST_ERROR(false, mp, XFS_ERRTAG_DIR_INO_VALIDATE)) {
214 xfs_warn(mp, "Invalid inode number 0x%Lx",
215 (unsigned long long) ino);
216 return -EFSCORRUPTED;
222 * Initialize a directory with its "." and ".." entries.
230 struct xfs_da_args *args;
233 ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
234 error = xfs_dir_ino_validate(tp->t_mountp, pdp->i_ino);
238 args = kmem_zalloc(sizeof(*args), KM_NOFS);
242 args->geo = dp->i_mount->m_dir_geo;
245 error = xfs_dir2_sf_create(args, pdp->i_ino);
251 * Enter a name in a directory, or check for available space.
252 * If inum is 0, only the available space test is performed.
256 struct xfs_trans *tp,
257 struct xfs_inode *dp,
258 const struct xfs_name *name,
259 xfs_ino_t inum, /* new entry inode number */
260 xfs_extlen_t total) /* bmap's total block count */
262 struct xfs_da_args *args;
266 ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
269 rval = xfs_dir_ino_validate(tp->t_mountp, inum);
272 XFS_STATS_INC(dp->i_mount, xs_dir_create);
275 args = kmem_zalloc(sizeof(*args), KM_NOFS);
279 args->geo = dp->i_mount->m_dir_geo;
280 args->name = name->name;
281 args->namelen = name->len;
282 args->filetype = name->type;
283 args->hashval = xfs_dir2_hashname(dp->i_mount, name);
284 args->inumber = inum;
287 args->whichfork = XFS_DATA_FORK;
289 args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT;
291 args->op_flags |= XFS_DA_OP_JUSTCHECK;
293 if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
294 rval = xfs_dir2_sf_addname(args);
298 rval = xfs_dir2_isblock(args, &v);
302 rval = xfs_dir2_block_addname(args);
306 rval = xfs_dir2_isleaf(args, &v);
310 rval = xfs_dir2_leaf_addname(args);
312 rval = xfs_dir2_node_addname(args);
320 * If doing a CI lookup and case-insensitive match, dup actual name into
321 * args.value. Return EEXIST for success (ie. name found) or an error.
324 xfs_dir_cilookup_result(
325 struct xfs_da_args *args,
326 const unsigned char *name,
329 if (args->cmpresult == XFS_CMP_DIFFERENT)
331 if (args->cmpresult != XFS_CMP_CASE ||
332 !(args->op_flags & XFS_DA_OP_CILOOKUP))
335 args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL);
339 memcpy(args->value, name, len);
340 args->valuelen = len;
345 * Lookup a name in a directory, give back the inode number.
346 * If ci_name is not NULL, returns the actual name in ci_name if it differs
347 * to name, or ci_name->name is set to NULL for an exact match.
352 struct xfs_trans *tp,
353 struct xfs_inode *dp,
354 const struct xfs_name *name,
355 xfs_ino_t *inum, /* out: inode number */
356 struct xfs_name *ci_name) /* out: actual name if CI match */
358 struct xfs_da_args *args;
363 ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
364 XFS_STATS_INC(dp->i_mount, xs_dir_lookup);
367 * We need to use KM_NOFS here so that lockdep will not throw false
368 * positive deadlock warnings on a non-transactional lookup path. It is
369 * safe to recurse into inode recalim in that case, but lockdep can't
370 * easily be taught about it. Hence KM_NOFS avoids having to add more
371 * lockdep Doing this avoids having to add a bunch of lockdep class
372 * annotations into the reclaim path for the ilock.
374 args = kmem_zalloc(sizeof(*args), KM_NOFS);
375 args->geo = dp->i_mount->m_dir_geo;
376 args->name = name->name;
377 args->namelen = name->len;
378 args->filetype = name->type;
379 args->hashval = xfs_dir2_hashname(dp->i_mount, name);
381 args->whichfork = XFS_DATA_FORK;
383 args->op_flags = XFS_DA_OP_OKNOENT;
385 args->op_flags |= XFS_DA_OP_CILOOKUP;
387 lock_mode = xfs_ilock_data_map_shared(dp);
388 if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
389 rval = xfs_dir2_sf_lookup(args);
393 rval = xfs_dir2_isblock(args, &v);
397 rval = xfs_dir2_block_lookup(args);
401 rval = xfs_dir2_isleaf(args, &v);
405 rval = xfs_dir2_leaf_lookup(args);
407 rval = xfs_dir2_node_lookup(args);
413 *inum = args->inumber;
415 ci_name->name = args->value;
416 ci_name->len = args->valuelen;
420 xfs_iunlock(dp, lock_mode);
426 * Remove an entry from a directory.
430 struct xfs_trans *tp,
431 struct xfs_inode *dp,
432 struct xfs_name *name,
434 xfs_extlen_t total) /* bmap's total block count */
436 struct xfs_da_args *args;
440 ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
441 XFS_STATS_INC(dp->i_mount, xs_dir_remove);
443 args = kmem_zalloc(sizeof(*args), KM_NOFS);
447 args->geo = dp->i_mount->m_dir_geo;
448 args->name = name->name;
449 args->namelen = name->len;
450 args->filetype = name->type;
451 args->hashval = xfs_dir2_hashname(dp->i_mount, name);
455 args->whichfork = XFS_DATA_FORK;
458 if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
459 rval = xfs_dir2_sf_removename(args);
463 rval = xfs_dir2_isblock(args, &v);
467 rval = xfs_dir2_block_removename(args);
471 rval = xfs_dir2_isleaf(args, &v);
475 rval = xfs_dir2_leaf_removename(args);
477 rval = xfs_dir2_node_removename(args);
484 * Replace the inode number of a directory entry.
488 struct xfs_trans *tp,
489 struct xfs_inode *dp,
490 const struct xfs_name *name, /* name of entry to replace */
491 xfs_ino_t inum, /* new inode number */
492 xfs_extlen_t total) /* bmap's total block count */
494 struct xfs_da_args *args;
498 ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
500 rval = xfs_dir_ino_validate(tp->t_mountp, inum);
504 args = kmem_zalloc(sizeof(*args), KM_NOFS);
508 args->geo = dp->i_mount->m_dir_geo;
509 args->name = name->name;
510 args->namelen = name->len;
511 args->filetype = name->type;
512 args->hashval = xfs_dir2_hashname(dp->i_mount, name);
513 args->inumber = inum;
516 args->whichfork = XFS_DATA_FORK;
519 if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
520 rval = xfs_dir2_sf_replace(args);
524 rval = xfs_dir2_isblock(args, &v);
528 rval = xfs_dir2_block_replace(args);
532 rval = xfs_dir2_isleaf(args, &v);
536 rval = xfs_dir2_leaf_replace(args);
538 rval = xfs_dir2_node_replace(args);
545 * See if this entry can be added to the directory without allocating space.
551 struct xfs_name *name) /* name of entry to add */
553 return xfs_dir_createname(tp, dp, name, 0, 0);
561 * Add a block to the directory.
563 * This routine is for data and free blocks, not leaf/node blocks which are
564 * handled by xfs_da_grow_inode.
568 struct xfs_da_args *args,
569 int space, /* v2 dir's space XFS_DIR2_xxx_SPACE */
570 xfs_dir2_db_t *dbp) /* out: block number added */
572 struct xfs_inode *dp = args->dp;
573 struct xfs_mount *mp = dp->i_mount;
574 xfs_fileoff_t bno; /* directory offset of new block */
575 int count; /* count of filesystem blocks */
578 trace_xfs_dir2_grow_inode(args, space);
581 * Set lowest possible block in the space requested.
583 bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE);
584 count = args->geo->fsbcount;
586 error = xfs_da_grow_inode_int(args, &bno, count);
590 *dbp = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)bno);
593 * Update file's size if this is the data space and it grew.
595 if (space == XFS_DIR2_DATA_SPACE) {
596 xfs_fsize_t size; /* directory file (data) size */
598 size = XFS_FSB_TO_B(mp, bno + count);
599 if (size > dp->i_disk_size) {
600 dp->i_disk_size = size;
601 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE);
608 * See if the directory is a single-block form directory.
612 struct xfs_da_args *args,
615 struct xfs_mount *mp = args->dp->i_mount;
619 error = xfs_bmap_last_offset(args->dp, &eof, XFS_DATA_FORK);
624 if (XFS_FSB_TO_B(mp, eof) != args->geo->blksize)
628 if (XFS_IS_CORRUPT(mp, args->dp->i_disk_size != args->geo->blksize))
629 return -EFSCORRUPTED;
634 * See if the directory is a single-leaf form directory.
638 struct xfs_da_args *args,
644 error = xfs_bmap_last_offset(args->dp, &eof, XFS_DATA_FORK);
649 if (eof != args->geo->leafblk + args->geo->fsbcount)
657 * Remove the given block from the directory.
658 * This routine is used for data and free blocks, leaf/node are done
659 * by xfs_da_shrink_inode.
662 xfs_dir2_shrink_inode(
663 struct xfs_da_args *args,
667 xfs_fileoff_t bno; /* directory file offset */
668 xfs_dablk_t da; /* directory file offset */
669 int done; /* bunmap is finished */
670 struct xfs_inode *dp;
672 struct xfs_mount *mp;
673 struct xfs_trans *tp;
675 trace_xfs_dir2_shrink_inode(args, db);
680 da = xfs_dir2_db_to_da(args->geo, db);
682 /* Unmap the fsblock(s). */
683 error = xfs_bunmapi(tp, dp, da, args->geo->fsbcount, 0, 0, &done);
686 * ENOSPC actually can happen if we're in a removename with no
687 * space reservation, and the resulting block removal would
688 * cause a bmap btree split or conversion from extents to btree.
689 * This can only happen for un-fragmented directory blocks,
690 * since you need to be punching out the middle of an extent.
691 * In this case we need to leave the block in the file, and not
692 * binval it. So the block has to be in a consistent empty
693 * state and appropriately logged. We don't free up the buffer,
694 * the caller can tell it hasn't happened since it got an error
701 * Invalidate the buffer from the transaction.
703 xfs_trans_binval(tp, bp);
705 * If it's not a data block, we're done.
707 if (db >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET))
710 * If the block isn't the last one in the directory, we're done.
712 if (dp->i_disk_size > xfs_dir2_db_off_to_byte(args->geo, db + 1, 0))
715 if ((error = xfs_bmap_last_before(tp, dp, &bno, XFS_DATA_FORK))) {
717 * This can't really happen unless there's kernel corruption.
721 if (db == args->geo->datablk)
726 * Set the size to the new last block.
728 dp->i_disk_size = XFS_FSB_TO_B(mp, bno);
729 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
733 /* Returns true if the directory entry name is valid. */
740 * MAXNAMELEN includes the trailing null, but (name/length) leave it
741 * out, so use >= for the length check.
743 if (length >= MAXNAMELEN)
746 /* There shouldn't be any slashes or nulls here */
747 return !memchr(name, '/', length) && !memchr(name, 0, length);
752 struct xfs_mount *mp,
753 const struct xfs_name *name)
755 if (unlikely(xfs_has_asciici(mp)))
756 return xfs_ascii_ci_hashname(name);
757 return xfs_da_hashname(name->name, name->len);
762 struct xfs_da_args *args,
763 const unsigned char *name,
766 if (unlikely(xfs_has_asciici(args->dp->i_mount)))
767 return xfs_ascii_ci_compname(args, name, len);
768 return xfs_da_compname(args, name, len);