Lines Matching +full:entry +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
49 count += hdr->i8count ? XFS_INO64_SIZE : XFS_INO32_SIZE; /* ino # */ in xfs_dir2_sf_entsize()
62 return (void *)sfep + xfs_dir2_sf_entsize(mp, hdr, sfep->namelen); in xfs_dir2_sf_nextentry()
66 * In short-form directory entries the inode numbers are stored at variable
67 * offset behind the entry name. If the entry stores a filetype value, then it
68 * sits between the name and the inode number. The actual inode numbers can
77 uint8_t *from = sfep->name + sfep->namelen; in xfs_dir2_sf_get_ino()
82 if (!hdr->i8count) in xfs_dir2_sf_get_ino()
94 uint8_t *to = sfep->name + sfep->namelen; in xfs_dir2_sf_put_ino()
101 if (hdr->i8count) in xfs_dir2_sf_put_ino()
111 if (!hdr->i8count) in xfs_dir2_sf_get_parent_ino()
112 return get_unaligned_be32(hdr->parent); in xfs_dir2_sf_get_parent_ino()
113 return get_unaligned_be64(hdr->parent) & XFS_MAXINUMBER; in xfs_dir2_sf_get_parent_ino()
123 if (hdr->i8count) in xfs_dir2_sf_put_parent_ino()
124 put_unaligned_be64(ino, hdr->parent); in xfs_dir2_sf_put_parent_ino()
126 put_unaligned_be32(ino, hdr->parent); in xfs_dir2_sf_put_parent_ino()
130 * The file type field is stored at the end of the name for filetype enabled
139 uint8_t ftype = sfep->name[sfep->namelen]; in xfs_dir2_sf_get_ftype()
157 sfep->name[sfep->namelen] = ftype; in xfs_dir2_sf_put_ftype()
172 xfs_dir2_dataptr_t addr; /* data entry address */ in xfs_dir2_block_sfsize()
175 int count; /* shortform entry count */ in xfs_dir2_block_sfsize()
176 xfs_dir2_data_entry_t *dep; /* data entry in the block */ in xfs_dir2_block_sfsize()
177 int i; /* block entry index */ in xfs_dir2_block_sfsize()
178 int i8count; /* count of big-inode entries */ in xfs_dir2_block_sfsize()
179 int isdot; /* entry is "." */ in xfs_dir2_block_sfsize()
180 int isdotdot; /* entry is ".." */ in xfs_dir2_block_sfsize()
182 int namelen; /* total name bytes */ in xfs_dir2_block_sfsize()
188 mp = dp->i_mount; in xfs_dir2_block_sfsize()
189 geo = mp->m_dir_geo; in xfs_dir2_block_sfsize()
193 * for each entry that we see. in xfs_dir2_block_sfsize()
204 for (i = 0; i < be32_to_cpu(btp->count); i++) { in xfs_dir2_block_sfsize()
208 * Calculate the pointer to the entry at hand. in xfs_dir2_block_sfsize()
213 * Detect . and .., so we can special-case them. in xfs_dir2_block_sfsize()
217 isdot = dep->namelen == 1 && dep->name[0] == '.'; in xfs_dir2_block_sfsize()
219 dep->namelen == 2 && in xfs_dir2_block_sfsize()
220 dep->name[0] == '.' && dep->name[1] == '.'; in xfs_dir2_block_sfsize()
223 i8count += be64_to_cpu(dep->inumber) > XFS_DIR2_MAX_SHORT_INUM; in xfs_dir2_block_sfsize()
228 namelen += dep->namelen + has_ftype; in xfs_dir2_block_sfsize()
230 parent = be64_to_cpu(dep->inumber); in xfs_dir2_block_sfsize()
236 namelen + /* name */ in xfs_dir2_block_sfsize()
246 sfhp->count = count; in xfs_dir2_block_sfsize()
247 sfhp->i8count = i8count; in xfs_dir2_block_sfsize()
263 struct xfs_inode *dp = args->dp; in xfs_dir2_block_to_sf()
264 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_block_to_sf()
267 struct xfs_dir2_sf_entry *sfep; /* shortform entry */ in xfs_dir2_block_to_sf()
269 unsigned int offset = args->geo->data_entry_offset; in xfs_dir2_block_to_sf()
279 sfp = kmalloc(mp->m_sb.sb_inodesize, GFP_KERNEL | __GFP_NOFAIL); in xfs_dir2_block_to_sf()
280 memcpy(sfp, sfhp, xfs_dir2_sf_hdr_size(sfhp->i8count)); in xfs_dir2_block_to_sf()
286 end = xfs_dir3_data_end_offset(args->geo, bp->b_addr); in xfs_dir2_block_to_sf()
289 struct xfs_dir2_data_unused *dup = bp->b_addr + offset; in xfs_dir2_block_to_sf()
290 struct xfs_dir2_data_entry *dep = bp->b_addr + offset; in xfs_dir2_block_to_sf()
295 if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { in xfs_dir2_block_to_sf()
296 offset += be16_to_cpu(dup->length); in xfs_dir2_block_to_sf()
303 if (dep->namelen == 1 && dep->name[0] == '.') in xfs_dir2_block_to_sf()
304 ASSERT(be64_to_cpu(dep->inumber) == dp->i_ino); in xfs_dir2_block_to_sf()
308 else if (dep->namelen == 2 && in xfs_dir2_block_to_sf()
309 dep->name[0] == '.' && dep->name[1] == '.') in xfs_dir2_block_to_sf()
310 ASSERT(be64_to_cpu(dep->inumber) == in xfs_dir2_block_to_sf()
313 * Normal entry, copy it into shortform. in xfs_dir2_block_to_sf()
316 sfep->namelen = dep->namelen; in xfs_dir2_block_to_sf()
318 memcpy(sfep->name, dep->name, dep->namelen); in xfs_dir2_block_to_sf()
320 be64_to_cpu(dep->inumber)); in xfs_dir2_block_to_sf()
326 offset += xfs_dir2_data_entsize(mp, dep->namelen); in xfs_dir2_block_to_sf()
328 ASSERT((char *)sfep - (char *)sfp == size); in xfs_dir2_block_to_sf()
332 error = xfs_dir2_shrink_inode(args, args->geo->datablk, bp); in xfs_dir2_block_to_sf()
334 ASSERT(error != -ENOSPC); in xfs_dir2_block_to_sf()
344 ASSERT(dp->i_df.if_bytes == 0); in xfs_dir2_block_to_sf()
346 dp->i_df.if_format = XFS_DINODE_FMT_LOCAL; in xfs_dir2_block_to_sf()
347 dp->i_disk_size = size; in xfs_dir2_block_to_sf()
352 xfs_trans_log_inode(args->trans, dp, logflags); in xfs_dir2_block_to_sf()
358 * Add a name to a shortform directory.
361 * Convert to block form if necessary, if the new entry won't fit.
367 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_addname()
368 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_addname()
371 int new_isize; /* size after adding name */ in xfs_dir2_sf_addname()
372 int objchange; /* changing to 8-byte inodes */ in xfs_dir2_sf_addname()
373 xfs_dir2_data_aoff_t offset = 0; /* offset for new entry */ in xfs_dir2_sf_addname()
375 xfs_dir2_sf_entry_t *sfep = NULL; /* shortform entry */ in xfs_dir2_sf_addname()
379 ASSERT(xfs_dir2_sf_lookup(args) == -ENOENT); in xfs_dir2_sf_addname()
380 ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); in xfs_dir2_sf_addname()
381 ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent)); in xfs_dir2_sf_addname()
382 ASSERT(dp->i_df.if_bytes == dp->i_disk_size); in xfs_dir2_sf_addname()
384 ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); in xfs_dir2_sf_addname()
386 * Compute entry (and change in) size. in xfs_dir2_sf_addname()
388 incr_isize = xfs_dir2_sf_entsize(dp->i_mount, sfp, args->namelen); in xfs_dir2_sf_addname()
394 if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->i8count == 0) { in xfs_dir2_sf_addname()
398 incr_isize += (sfp->count + 2) * XFS_INO64_DIFF; in xfs_dir2_sf_addname()
402 new_isize = (int)dp->i_disk_size + incr_isize; in xfs_dir2_sf_addname()
413 if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0) in xfs_dir2_sf_addname()
414 return -ENOSPC; in xfs_dir2_sf_addname()
416 * Convert to block form then add the name. in xfs_dir2_sf_addname()
426 if (args->op_flags & XFS_DA_OP_JUSTCHECK) in xfs_dir2_sf_addname()
429 * Do it the easy way - just add it at the end. in xfs_dir2_sf_addname()
434 * Do it the hard way - look for a place to insert the new entry. in xfs_dir2_sf_addname()
443 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); in xfs_dir2_sf_addname()
448 * Add the new entry the "easy" way.
449 * This is copying the old directory and adding the new entry at the end.
457 xfs_dir2_sf_entry_t *sfep, /* pointer to new entry */ in xfs_dir2_sf_addname_easy()
461 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_addname_easy()
462 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_addname_easy()
463 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_addname_easy()
464 int byteoff = (int)((char *)sfep - (char *)sfp); in xfs_dir2_sf_addname_easy()
467 * Grow the in-inode space. in xfs_dir2_sf_addname_easy()
469 sfp = xfs_idata_realloc(dp, xfs_dir2_sf_entsize(mp, sfp, args->namelen), in xfs_dir2_sf_addname_easy()
476 * Fill in the new entry. in xfs_dir2_sf_addname_easy()
478 sfep->namelen = args->namelen; in xfs_dir2_sf_addname_easy()
480 memcpy(sfep->name, args->name, sfep->namelen); in xfs_dir2_sf_addname_easy()
481 xfs_dir2_sf_put_ino(mp, sfp, sfep, args->inumber); in xfs_dir2_sf_addname_easy()
482 xfs_dir2_sf_put_ftype(mp, sfep, args->filetype); in xfs_dir2_sf_addname_easy()
487 sfp->count++; in xfs_dir2_sf_addname_easy()
488 if (args->inumber > XFS_DIR2_MAX_SHORT_INUM) in xfs_dir2_sf_addname_easy()
489 sfp->i8count++; in xfs_dir2_sf_addname_easy()
490 dp->i_disk_size = new_isize; in xfs_dir2_sf_addname_easy()
495 * Add the new entry the "hard" way.
498 * Find a hole that the new entry will fit into, and copy
499 * the first part of the entries, the new entry, and the last part of
509 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_addname_hard()
510 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_addname_hard()
518 xfs_dir2_sf_entry_t *oldsfep; /* entry in original dir */ in xfs_dir2_sf_addname_hard()
520 xfs_dir2_sf_entry_t *sfep; /* entry in new dir */ in xfs_dir2_sf_addname_hard()
526 old_isize = (int)dp->i_disk_size; in xfs_dir2_sf_addname_hard()
529 memcpy(oldsfp, dp->i_df.if_data, old_isize); in xfs_dir2_sf_addname_hard()
532 * to insert the new entry. in xfs_dir2_sf_addname_hard()
535 for (offset = args->geo->data_first_offset, in xfs_dir2_sf_addname_hard()
537 add_datasize = xfs_dir2_data_entsize(mp, args->namelen), in xfs_dir2_sf_addname_hard()
540 offset = new_offset + xfs_dir2_data_entsize(mp, oldsfep->namelen), in xfs_dir2_sf_addname_hard()
552 xfs_idata_realloc(dp, -old_isize, XFS_DATA_FORK); in xfs_dir2_sf_addname_hard()
558 nbytes = (int)((char *)oldsfep - (char *)oldsfp); in xfs_dir2_sf_addname_hard()
562 * Fill in the new entry, and update the header counts. in xfs_dir2_sf_addname_hard()
564 sfep->namelen = args->namelen; in xfs_dir2_sf_addname_hard()
566 memcpy(sfep->name, args->name, sfep->namelen); in xfs_dir2_sf_addname_hard()
567 xfs_dir2_sf_put_ino(mp, sfp, sfep, args->inumber); in xfs_dir2_sf_addname_hard()
568 xfs_dir2_sf_put_ftype(mp, sfep, args->filetype); in xfs_dir2_sf_addname_hard()
569 sfp->count++; in xfs_dir2_sf_addname_hard()
570 if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) in xfs_dir2_sf_addname_hard()
571 sfp->i8count++; in xfs_dir2_sf_addname_hard()
577 memcpy(sfep, oldsfep, old_isize - nbytes); in xfs_dir2_sf_addname_hard()
580 dp->i_disk_size = new_isize; in xfs_dir2_sf_addname_hard()
585 * Decide if the new entry will fit at all.
586 * If it will fit, pick between adding the new entry to the end (easy)
595 xfs_dir2_sf_entry_t **sfepp, /* out(1): new entry ptr */ in xfs_dir2_sf_addname_pick()
598 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_addname_pick()
599 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_addname_pick()
601 int i; /* entry number */ in xfs_dir2_sf_addname_pick()
603 xfs_dir2_sf_entry_t *sfep; /* shortform entry */ in xfs_dir2_sf_addname_pick()
604 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_addname_pick()
605 int size; /* entry's data size */ in xfs_dir2_sf_addname_pick()
608 size = xfs_dir2_data_entsize(mp, args->namelen); in xfs_dir2_sf_addname_pick()
609 offset = args->geo->data_first_offset; in xfs_dir2_sf_addname_pick()
615 * to insert the new entry. in xfs_dir2_sf_addname_pick()
617 for (i = 0; i < sfp->count; i++) { in xfs_dir2_sf_addname_pick()
621 xfs_dir2_data_entsize(mp, sfep->namelen); in xfs_dir2_sf_addname_pick()
625 * Calculate data bytes used excluding the new entry, if this in xfs_dir2_sf_addname_pick()
629 (sfp->count + 3) * (uint)sizeof(xfs_dir2_leaf_entry_t) + in xfs_dir2_sf_addname_pick()
636 if (used + (holefit ? 0 : size) > args->geo->blksize) in xfs_dir2_sf_addname_pick()
646 if (used + size > args->geo->blksize) in xfs_dir2_sf_addname_pick()
664 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_check()
665 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_check()
666 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_check()
667 int i; /* entry number */ in xfs_dir2_sf_check()
669 xfs_ino_t ino; /* entry inode number */ in xfs_dir2_sf_check()
671 xfs_dir2_sf_entry_t *sfep; /* shortform dir entry */ in xfs_dir2_sf_check()
673 offset = args->geo->data_first_offset; in xfs_dir2_sf_check()
678 i < sfp->count; in xfs_dir2_sf_check()
685 xfs_dir2_data_entsize(mp, sfep->namelen); in xfs_dir2_sf_check()
688 ASSERT(i8count == sfp->i8count); in xfs_dir2_sf_check()
689 ASSERT((char *)sfep - (char *)sfp == dp->i_disk_size); in xfs_dir2_sf_check()
691 (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + in xfs_dir2_sf_check()
692 (uint)sizeof(xfs_dir2_block_tail_t) <= args->geo->blksize); in xfs_dir2_sf_check()
717 size < xfs_dir2_sf_hdr_size(sfp->i8count)) in xfs_dir2_sf_verify()
722 /* Check .. entry */ in xfs_dir2_sf_verify()
728 offset = mp->m_dir_geo->data_first_offset; in xfs_dir2_sf_verify()
732 for (i = 0; i < sfp->count; i++) { in xfs_dir2_sf_verify()
735 * Check the fixed-offset parts of the structure are in xfs_dir2_sf_verify()
742 if (sfep->namelen == 0) in xfs_dir2_sf_verify()
746 * Check that the variable-length part of the structure is in xfs_dir2_sf_verify()
747 * within the data buffer. The next entry starts after the in xfs_dir2_sf_verify()
748 * name component, so nextentry is an acceptable test. in xfs_dir2_sf_verify()
771 xfs_dir2_data_entsize(mp, sfep->namelen); in xfs_dir2_sf_verify()
775 if (i8count != sfp->i8count) in xfs_dir2_sf_verify()
781 if (offset + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + in xfs_dir2_sf_verify()
782 (uint)sizeof(xfs_dir2_block_tail_t) > mp->m_dir_geo->blksize) in xfs_dir2_sf_verify()
797 int i8count; /* parent inode is an 8-byte number */ in xfs_dir2_sf_create()
803 dp = args->dp; in xfs_dir2_sf_create()
806 ASSERT(dp->i_disk_size == 0); in xfs_dir2_sf_create()
808 * If it's currently a zero-length extent file, in xfs_dir2_sf_create()
811 if (dp->i_df.if_format == XFS_DINODE_FMT_EXTENTS) { in xfs_dir2_sf_create()
812 dp->i_df.if_format = XFS_DINODE_FMT_LOCAL; in xfs_dir2_sf_create()
813 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); in xfs_dir2_sf_create()
815 ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); in xfs_dir2_sf_create()
816 ASSERT(dp->i_df.if_bytes == 0); in xfs_dir2_sf_create()
824 sfp->i8count = i8count; in xfs_dir2_sf_create()
830 sfp->count = 0; in xfs_dir2_sf_create()
831 dp->i_disk_size = size; in xfs_dir2_sf_create()
833 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); in xfs_dir2_sf_create()
838 * Lookup an entry in a shortform directory.
845 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_lookup()
846 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_lookup()
847 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_lookup()
848 int i; /* entry index */ in xfs_dir2_sf_lookup()
849 xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ in xfs_dir2_sf_lookup()
851 xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ in xfs_dir2_sf_lookup()
857 ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); in xfs_dir2_sf_lookup()
858 ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent)); in xfs_dir2_sf_lookup()
859 ASSERT(dp->i_df.if_bytes == dp->i_disk_size); in xfs_dir2_sf_lookup()
861 ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); in xfs_dir2_sf_lookup()
865 if (args->namelen == 1 && args->name[0] == '.') { in xfs_dir2_sf_lookup()
866 args->inumber = dp->i_ino; in xfs_dir2_sf_lookup()
867 args->cmpresult = XFS_CMP_EXACT; in xfs_dir2_sf_lookup()
868 args->filetype = XFS_DIR3_FT_DIR; in xfs_dir2_sf_lookup()
869 return -EEXIST; in xfs_dir2_sf_lookup()
874 if (args->namelen == 2 && in xfs_dir2_sf_lookup()
875 args->name[0] == '.' && args->name[1] == '.') { in xfs_dir2_sf_lookup()
876 args->inumber = xfs_dir2_sf_get_parent_ino(sfp); in xfs_dir2_sf_lookup()
877 args->cmpresult = XFS_CMP_EXACT; in xfs_dir2_sf_lookup()
878 args->filetype = XFS_DIR3_FT_DIR; in xfs_dir2_sf_lookup()
879 return -EEXIST; in xfs_dir2_sf_lookup()
885 for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; in xfs_dir2_sf_lookup()
888 * Compare name and if it's an exact match, return the inode in xfs_dir2_sf_lookup()
889 * number. If it's the first case-insensitive match, store the in xfs_dir2_sf_lookup()
892 cmp = xfs_dir2_compname(args, sfep->name, sfep->namelen); in xfs_dir2_sf_lookup()
893 if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { in xfs_dir2_sf_lookup()
894 args->cmpresult = cmp; in xfs_dir2_sf_lookup()
895 args->inumber = xfs_dir2_sf_get_ino(mp, sfp, sfep); in xfs_dir2_sf_lookup()
896 args->filetype = xfs_dir2_sf_get_ftype(mp, sfep); in xfs_dir2_sf_lookup()
898 return -EEXIST; in xfs_dir2_sf_lookup()
902 ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); in xfs_dir2_sf_lookup()
905 * If a case-insensitive match was not found, return -ENOENT. in xfs_dir2_sf_lookup()
908 return -ENOENT; in xfs_dir2_sf_lookup()
910 return xfs_dir_cilookup_result(args, ci_sfep->name, ci_sfep->namelen); in xfs_dir2_sf_lookup()
914 * Remove an entry from a shortform directory.
920 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_removename()
921 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_removename()
922 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_removename()
923 int byteoff; /* offset of removed entry */ in xfs_dir2_sf_removename()
924 int entsize; /* this entry's size */ in xfs_dir2_sf_removename()
925 int i; /* shortform entry index */ in xfs_dir2_sf_removename()
928 xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ in xfs_dir2_sf_removename()
932 ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); in xfs_dir2_sf_removename()
933 oldsize = (int)dp->i_disk_size; in xfs_dir2_sf_removename()
935 ASSERT(dp->i_df.if_bytes == oldsize); in xfs_dir2_sf_removename()
937 ASSERT(oldsize >= xfs_dir2_sf_hdr_size(sfp->i8count)); in xfs_dir2_sf_removename()
942 for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; in xfs_dir2_sf_removename()
944 if (xfs_da_compname(args, sfep->name, sfep->namelen) == in xfs_dir2_sf_removename()
947 args->inumber); in xfs_dir2_sf_removename()
954 if (i == sfp->count) in xfs_dir2_sf_removename()
955 return -ENOENT; in xfs_dir2_sf_removename()
959 byteoff = (int)((char *)sfep - (char *)sfp); in xfs_dir2_sf_removename()
960 entsize = xfs_dir2_sf_entsize(mp, sfp, args->namelen); in xfs_dir2_sf_removename()
961 newsize = oldsize - entsize; in xfs_dir2_sf_removename()
963 * Copy the part if any after the removed entry, sliding it down. in xfs_dir2_sf_removename()
967 oldsize - (byteoff + entsize)); in xfs_dir2_sf_removename()
971 sfp->count--; in xfs_dir2_sf_removename()
972 dp->i_disk_size = newsize; in xfs_dir2_sf_removename()
977 sfp = xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK); in xfs_dir2_sf_removename()
982 if (args->inumber > XFS_DIR2_MAX_SHORT_INUM) { in xfs_dir2_sf_removename()
983 if (sfp->i8count == 1) in xfs_dir2_sf_removename()
986 sfp->i8count--; in xfs_dir2_sf_removename()
989 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); in xfs_dir2_sf_removename()
1001 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_replace_needblock()
1004 if (dp->i_df.if_format != XFS_DINODE_FMT_LOCAL) in xfs_dir2_sf_replace_needblock()
1007 newsize = dp->i_df.if_bytes + (sfp->count + 1) * XFS_INO64_DIFF; in xfs_dir2_sf_replace_needblock()
1010 sfp->i8count == 0 && newsize > xfs_inode_data_fork_size(dp); in xfs_dir2_sf_replace_needblock()
1014 * Replace the inode number of an entry in a shortform directory.
1020 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_replace()
1021 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_replace()
1022 struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; in xfs_dir2_sf_replace()
1023 int i; /* entry index */ in xfs_dir2_sf_replace()
1024 xfs_ino_t ino=0; /* entry old inode number */ in xfs_dir2_sf_replace()
1026 xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ in xfs_dir2_sf_replace()
1030 ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); in xfs_dir2_sf_replace()
1031 ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent)); in xfs_dir2_sf_replace()
1032 ASSERT(dp->i_df.if_bytes == dp->i_disk_size); in xfs_dir2_sf_replace()
1034 ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); in xfs_dir2_sf_replace()
1037 * New inode number is large, and need to convert to 8-byte inodes. in xfs_dir2_sf_replace()
1039 if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && sfp->i8count == 0) { in xfs_dir2_sf_replace()
1045 if (xfs_dir2_sf_replace_needblock(dp, args->inumber)) { in xfs_dir2_sf_replace()
1052 * Still fits, convert to 8-byte now. in xfs_dir2_sf_replace()
1056 sfp = dp->i_df.if_data; in xfs_dir2_sf_replace()
1060 ASSERT(args->namelen != 1 || args->name[0] != '.'); in xfs_dir2_sf_replace()
1062 * Replace ..'s entry. in xfs_dir2_sf_replace()
1064 if (args->namelen == 2 && in xfs_dir2_sf_replace()
1065 args->name[0] == '.' && args->name[1] == '.') { in xfs_dir2_sf_replace()
1067 ASSERT(args->inumber != ino); in xfs_dir2_sf_replace()
1068 xfs_dir2_sf_put_parent_ino(sfp, args->inumber); in xfs_dir2_sf_replace()
1071 * Normal entry, look for the name. in xfs_dir2_sf_replace()
1074 for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; in xfs_dir2_sf_replace()
1076 if (xfs_da_compname(args, sfep->name, sfep->namelen) == in xfs_dir2_sf_replace()
1079 ASSERT(args->inumber != ino); in xfs_dir2_sf_replace()
1081 args->inumber); in xfs_dir2_sf_replace()
1082 xfs_dir2_sf_put_ftype(mp, sfep, args->filetype); in xfs_dir2_sf_replace()
1089 if (i == sfp->count) { in xfs_dir2_sf_replace()
1090 ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); in xfs_dir2_sf_replace()
1093 return -ENOENT; in xfs_dir2_sf_replace()
1100 args->inumber <= XFS_DIR2_MAX_SHORT_INUM) { in xfs_dir2_sf_replace()
1104 if (sfp->i8count == 1) in xfs_dir2_sf_replace()
1107 sfp->i8count--; in xfs_dir2_sf_replace()
1113 args->inumber > XFS_DIR2_MAX_SHORT_INUM) { in xfs_dir2_sf_replace()
1115 * add to the i8count unless we just converted to 8-byte in xfs_dir2_sf_replace()
1118 ASSERT(sfp->i8count != 0); in xfs_dir2_sf_replace()
1120 sfp->i8count++; in xfs_dir2_sf_replace()
1123 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_DDATA); in xfs_dir2_sf_replace()
1128 * Convert from 8-byte inode numbers to 4-byte inode numbers.
1129 * The last 8-byte inode number is gone, but the count is still 1.
1135 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_toino4()
1136 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_toino4()
1137 struct xfs_dir2_sf_hdr *oldsfp = dp->i_df.if_data; in xfs_dir2_sf_toino4()
1139 int i; /* entry index */ in xfs_dir2_sf_toino4()
1141 xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ in xfs_dir2_sf_toino4()
1143 xfs_dir2_sf_entry_t *sfep; /* new sf entry */ in xfs_dir2_sf_toino4()
1153 oldsize = dp->i_df.if_bytes; in xfs_dir2_sf_toino4()
1155 ASSERT(oldsfp->i8count == 1); in xfs_dir2_sf_toino4()
1160 newsize = oldsize - (oldsfp->count + 1) * XFS_INO64_DIFF; in xfs_dir2_sf_toino4()
1161 xfs_idata_realloc(dp, -oldsize, XFS_DATA_FORK); in xfs_dir2_sf_toino4()
1167 sfp = dp->i_df.if_data; in xfs_dir2_sf_toino4()
1171 sfp->count = oldsfp->count; in xfs_dir2_sf_toino4()
1172 sfp->i8count = 0; in xfs_dir2_sf_toino4()
1179 i < sfp->count; in xfs_dir2_sf_toino4()
1182 sfep->namelen = oldsfep->namelen; in xfs_dir2_sf_toino4()
1183 memcpy(sfep->offset, oldsfep->offset, sizeof(sfep->offset)); in xfs_dir2_sf_toino4()
1184 memcpy(sfep->name, oldsfep->name, sfep->namelen); in xfs_dir2_sf_toino4()
1194 dp->i_disk_size = newsize; in xfs_dir2_sf_toino4()
1195 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); in xfs_dir2_sf_toino4()
1199 * Convert existing entries from 4-byte inode numbers to 8-byte inode numbers.
1200 * The new entry w/ an 8-byte inode number is not there yet; we leave with
1201 * i8count set to 1, but no corresponding 8-byte entry.
1207 struct xfs_inode *dp = args->dp; in xfs_dir2_sf_toino8()
1208 struct xfs_mount *mp = dp->i_mount; in xfs_dir2_sf_toino8()
1209 struct xfs_dir2_sf_hdr *oldsfp = dp->i_df.if_data; in xfs_dir2_sf_toino8()
1211 int i; /* entry index */ in xfs_dir2_sf_toino8()
1213 xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ in xfs_dir2_sf_toino8()
1215 xfs_dir2_sf_entry_t *sfep; /* new sf entry */ in xfs_dir2_sf_toino8()
1225 oldsize = dp->i_df.if_bytes; in xfs_dir2_sf_toino8()
1227 ASSERT(oldsfp->i8count == 0); in xfs_dir2_sf_toino8()
1230 * Compute the new inode size (nb: entry count + 1 for parent) in xfs_dir2_sf_toino8()
1232 newsize = oldsize + (oldsfp->count + 1) * XFS_INO64_DIFF; in xfs_dir2_sf_toino8()
1233 xfs_idata_realloc(dp, -oldsize, XFS_DATA_FORK); in xfs_dir2_sf_toino8()
1239 sfp = dp->i_df.if_data; in xfs_dir2_sf_toino8()
1243 sfp->count = oldsfp->count; in xfs_dir2_sf_toino8()
1244 sfp->i8count = 1; in xfs_dir2_sf_toino8()
1251 i < sfp->count; in xfs_dir2_sf_toino8()
1254 sfep->namelen = oldsfep->namelen; in xfs_dir2_sf_toino8()
1255 memcpy(sfep->offset, oldsfep->offset, sizeof(sfep->offset)); in xfs_dir2_sf_toino8()
1256 memcpy(sfep->name, oldsfep->name, sfep->namelen); in xfs_dir2_sf_toino8()
1266 dp->i_disk_size = newsize; in xfs_dir2_sf_toino8()
1267 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA); in xfs_dir2_sf_toino8()