2 * Copyright (c) 2000-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
26 #include "err_protos.h"
33 static struct cred zerocr
;
34 static struct fsxattr zerofsx
;
35 static xfs_ino_t orphanage_ino
;
37 static struct xfs_name xfs_name_dot
= {(unsigned char *)".", 1};
40 * Data structures used to keep track of directories where the ".."
41 * entries are updated. These must be rebuilt after the initial pass
43 typedef struct dotdot_update
{
44 struct dotdot_update
*next
;
45 ino_tree_node_t
*irec
;
50 static dotdot_update_t
*dotdot_update_list
;
51 static int dotdot_update
;
56 ino_tree_node_t
*irec
,
59 dotdot_update_t
*dir
= malloc(sizeof(dotdot_update_t
));
62 do_error(_("malloc failed add_dotdot_update (%zu bytes)\n"),
63 sizeof(dotdot_update_t
));
65 dir
->next
= dotdot_update_list
;
68 dir
->ino_offset
= ino_offset
;
70 dotdot_update_list
= dir
;
74 * Data structures and routines to keep track of directory entries
75 * and whether their leaf entry has been seen. Also used for name
76 * duplicate checking and rebuilding step if required.
78 typedef struct dir_hash_ent
{
79 struct dir_hash_ent
*nextbyaddr
; /* next in addr bucket */
80 struct dir_hash_ent
*nextbyhash
; /* next in name bucket */
81 struct dir_hash_ent
*nextbyorder
; /* next in order added */
82 xfs_dahash_t hashval
; /* hash value of name */
83 __uint32_t address
; /* offset of data entry */
84 xfs_ino_t inum
; /* inode num of entry */
85 short junkit
; /* name starts with / */
86 short seen
; /* have seen leaf entry */
90 typedef struct dir_hash_tab
{
91 int size
; /* size of hash tables */
92 int names_duped
; /* 1 = ent names malloced */
93 dir_hash_ent_t
*first
; /* ptr to first added entry */
94 dir_hash_ent_t
*last
; /* ptr to last added entry */
95 dir_hash_ent_t
**byhash
; /* ptr to name hash buckets */
96 dir_hash_ent_t
**byaddr
; /* ptr to addr hash buckets */
99 #define DIR_HASH_TAB_SIZE(n) \
100 (sizeof(dir_hash_tab_t) + (sizeof(dir_hash_ent_t *) * (n) * 2))
101 #define DIR_HASH_FUNC(t,a) ((a) % (t)->size)
104 * Track the contents of the freespace table in a directory.
106 typedef struct freetab
{
107 int naents
; /* expected number of data blocks */
108 int nents
; /* number of data blocks processed */
110 xfs_dir2_data_off_t v
;
114 #define FREETAB_SIZE(n) \
115 (offsetof(freetab_t, ents) + (sizeof(struct freetab_ent) * (n)))
117 #define DIR_HASH_CK_OK 0
118 #define DIR_HASH_CK_DUPLEAF 1
119 #define DIR_HASH_CK_BADHASH 2
120 #define DIR_HASH_CK_NODATA 3
121 #define DIR_HASH_CK_NOLEAF 4
122 #define DIR_HASH_CK_BADSTALE 5
123 #define DIR_HASH_CK_TOTAL 6
126 * Returns 0 if the name already exists (ie. a duplicate)
131 dir_hash_tab_t
*hashtab
,
137 xfs_dahash_t hash
= 0;
143 struct xfs_name xname
;
145 ASSERT(!hashtab
->names_duped
);
150 junk
= name
[0] == '/';
151 byaddr
= DIR_HASH_FUNC(hashtab
, addr
);
155 hash
= mp
->m_dirnameops
->hashname(&xname
);
156 byhash
= DIR_HASH_FUNC(hashtab
, hash
);
159 * search hash bucket for existing name.
161 for (p
= hashtab
->byhash
[byhash
]; p
; p
= p
->nextbyhash
) {
162 if (p
->hashval
== hash
&& p
->name
.len
== namelen
) {
163 if (memcmp(p
->name
.name
, name
, namelen
) == 0) {
172 if ((p
= malloc(sizeof(*p
))) == NULL
)
173 do_error(_("malloc failed in dir_hash_add (%zu bytes)\n"),
176 p
->nextbyaddr
= hashtab
->byaddr
[byaddr
];
177 hashtab
->byaddr
[byaddr
] = p
;
179 hashtab
->last
->nextbyorder
= p
;
182 p
->nextbyorder
= NULL
;
185 if (!(p
->junkit
= junk
)) {
187 p
->nextbyhash
= hashtab
->byhash
[byhash
];
188 hashtab
->byhash
[byhash
] = p
;
199 * checks to see if any data entries are not in the leaf blocks
203 dir_hash_tab_t
*hashtab
)
208 for (i
= 0; i
< hashtab
->size
; i
++) {
209 for (p
= hashtab
->byaddr
[i
]; p
; p
= p
->nextbyaddr
) {
219 dir_hash_tab_t
*hashtab
,
223 static char *seevalstr
[DIR_HASH_CK_TOTAL
];
227 seevalstr
[DIR_HASH_CK_OK
] = _("ok");
228 seevalstr
[DIR_HASH_CK_DUPLEAF
] = _("duplicate leaf");
229 seevalstr
[DIR_HASH_CK_BADHASH
] = _("hash value mismatch");
230 seevalstr
[DIR_HASH_CK_NODATA
] = _("no data entry");
231 seevalstr
[DIR_HASH_CK_NOLEAF
] = _("no leaf entry");
232 seevalstr
[DIR_HASH_CK_BADSTALE
] = _("bad stale count");
236 if (seeval
== DIR_HASH_CK_OK
&& dir_hash_unseen(hashtab
))
237 seeval
= DIR_HASH_CK_NOLEAF
;
238 if (seeval
== DIR_HASH_CK_OK
)
240 do_warn(_("bad hash table for directory inode %" PRIu64
" (%s): "),
241 ip
->i_ino
, seevalstr
[seeval
]);
243 do_warn(_("rebuilding\n"));
245 do_warn(_("would rebuild\n"));
251 dir_hash_tab_t
*hashtab
)
257 for (i
= 0; i
< hashtab
->size
; i
++) {
258 for (p
= hashtab
->byaddr
[i
]; p
; p
= n
) {
260 if (hashtab
->names_duped
)
261 free((void *)p
->name
.name
);
268 static dir_hash_tab_t
*
272 dir_hash_tab_t
*hashtab
;
275 hsize
= size
/ (16 * 4);
280 if ((hashtab
= calloc(DIR_HASH_TAB_SIZE(hsize
), 1)) == NULL
)
281 do_error(_("calloc failed in dir_hash_init\n"));
282 hashtab
->size
= hsize
;
283 hashtab
->byhash
= (dir_hash_ent_t
**)((char *)hashtab
+
284 sizeof(dir_hash_tab_t
));
285 hashtab
->byaddr
= (dir_hash_ent_t
**)((char *)hashtab
+
286 sizeof(dir_hash_tab_t
) + sizeof(dir_hash_ent_t
*) * hsize
);
292 dir_hash_tab_t
*hashtab
,
294 xfs_dir2_dataptr_t addr
)
299 i
= DIR_HASH_FUNC(hashtab
, addr
);
300 for (p
= hashtab
->byaddr
[i
]; p
; p
= p
->nextbyaddr
) {
301 if (p
->address
!= addr
)
304 return DIR_HASH_CK_DUPLEAF
;
305 if (p
->junkit
== 0 && p
->hashval
!= hash
)
306 return DIR_HASH_CK_BADHASH
;
308 return DIR_HASH_CK_OK
;
310 return DIR_HASH_CK_NODATA
;
314 * checks to make sure leafs match a data entry, and that the stale
319 dir_hash_tab_t
*hashtab
,
320 xfs_dir2_leaf_entry_t
*ents
,
328 for (i
= j
= 0; i
< count
; i
++) {
329 if (be32_to_cpu(ents
[i
].address
) == XFS_DIR2_NULL_DATAPTR
) {
333 rval
= dir_hash_see(hashtab
, be32_to_cpu(ents
[i
].hashval
),
334 be32_to_cpu(ents
[i
].address
));
335 if (rval
!= DIR_HASH_CK_OK
)
338 return j
== stale
? DIR_HASH_CK_OK
: DIR_HASH_CK_BADSTALE
;
342 * Convert name pointers into locally allocated memory.
343 * This must only be done after all the entries have been added.
346 dir_hash_dup_names(dir_hash_tab_t
*hashtab
)
351 if (hashtab
->names_duped
)
354 for (p
= hashtab
->first
; p
; p
= p
->nextbyorder
) {
355 name
= malloc(p
->name
.len
);
356 memcpy(name
, p
->name
.name
, p
->name
.len
);
359 hashtab
->names_duped
= 1;
363 * Given a block number in a fork, return the next valid block number
365 * If this is the last block number then NULLFILEOFF is returned.
367 * This was originally in the kernel, but only used in xfs_repair.
371 xfs_trans_t
*tp
, /* transaction pointer */
372 xfs_inode_t
*ip
, /* incore inode */
373 xfs_fileoff_t
*bnop
, /* current block */
374 int whichfork
) /* data or attr fork */
376 xfs_fileoff_t bno
; /* current block */
377 int eof
; /* hit end of file */
378 int error
; /* error return value */
379 xfs_bmbt_irec_t got
; /* current extent value */
380 xfs_ifork_t
*ifp
; /* inode fork pointer */
381 xfs_extnum_t lastx
; /* last extent used */
382 xfs_bmbt_irec_t prev
; /* previous extent value */
384 if (XFS_IFORK_FORMAT(ip
, whichfork
) != XFS_DINODE_FMT_BTREE
&&
385 XFS_IFORK_FORMAT(ip
, whichfork
) != XFS_DINODE_FMT_EXTENTS
&&
386 XFS_IFORK_FORMAT(ip
, whichfork
) != XFS_DINODE_FMT_LOCAL
)
388 if (XFS_IFORK_FORMAT(ip
, whichfork
) == XFS_DINODE_FMT_LOCAL
) {
392 ifp
= XFS_IFORK_PTR(ip
, whichfork
);
393 if (!(ifp
->if_flags
& XFS_IFEXTENTS
) &&
394 (error
= xfs_iread_extents(tp
, ip
, whichfork
)))
397 xfs_bmap_search_extents(ip
, bno
, whichfork
, &eof
, &lastx
, &got
, &prev
);
401 *bnop
= got
.br_startoff
< bno
? bno
: got
.br_startoff
;
411 do_error(_("ran out of disk space!\n"));
413 do_error(_("xfs_trans_reserve returned %d\n"), err
);
417 mk_rbmino(xfs_mount_t
*mp
)
427 xfs_bmap_free_t flist
;
429 xfs_bmbt_irec_t map
[XFS_BMAP_MAX_NMAP
];
436 tp
= libxfs_trans_alloc(mp
, 0);
438 if ((i
= libxfs_trans_reserve(tp
, 10, 0, 0, 0, 0)))
441 error
= libxfs_trans_iget(mp
, tp
, mp
->m_sb
.sb_rbmino
, 0, 0, &ip
);
444 _("couldn't iget realtime bitmap inode -- error - %d\n"),
448 vers
= xfs_sb_version_hascrc(&mp
->m_sb
) ? 3 : 1;
449 ip
->i_d
.di_version
= vers
;
450 memset(&ip
->i_d
, 0, xfs_icdinode_size(&ip
->i_d
));
452 ip
->i_d
.di_magic
= XFS_DINODE_MAGIC
;
453 ip
->i_d
.di_mode
= S_IFREG
;
454 ip
->i_d
.di_version
= vers
;
455 ip
->i_d
.di_format
= XFS_DINODE_FMT_EXTENTS
;
456 ip
->i_d
.di_aformat
= XFS_DINODE_FMT_EXTENTS
;
458 ip
->i_d
.di_nlink
= 1; /* account for sb ptr */
460 times
= XFS_ICHGTIME_CHG
| XFS_ICHGTIME_MOD
;
461 if (ip
->i_d
.di_version
== 3) {
463 ip
->i_d
.di_changecount
= 1;
465 ip
->i_d
.di_flags2
= 0;
466 ip
->i_d
.di_ino
= mp
->m_sb
.sb_rbmino
;
467 memset(&(ip
->i_d
.di_pad2
[0]), 0, sizeof(ip
->i_d
.di_pad2
));
468 platform_uuid_copy(&ip
->i_d
.di_uuid
, &mp
->m_sb
.sb_uuid
);
469 times
|= XFS_ICHGTIME_CREATE
;
471 libxfs_trans_ichgtime(tp
, ip
, times
);
476 ip
->i_df
.if_flags
= XFS_IFEXTENTS
;
477 ip
->i_df
.if_bytes
= ip
->i_df
.if_real_bytes
= 0;
478 ip
->i_df
.if_u1
.if_extents
= NULL
;
480 ip
->i_d
.di_size
= mp
->m_sb
.sb_rbmblocks
* mp
->m_sb
.sb_blocksize
;
485 libxfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
486 libxfs_trans_ihold(tp
, ip
);
487 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
490 * then allocate blocks for file and fill with zeroes (stolen
493 tp
= libxfs_trans_alloc(mp
, 0);
494 if ((error
= libxfs_trans_reserve(tp
, mp
->m_sb
.sb_rbmblocks
+
495 (XFS_BM_MAXLEVELS(mp
, XFS_DATA_FORK
) - 1), 0, 0, 0, 0)))
498 libxfs_trans_ijoin(tp
, ip
, 0);
500 xfs_bmap_init(&flist
, &first
);
501 while (bno
< mp
->m_sb
.sb_rbmblocks
) {
502 nmap
= XFS_BMAP_MAX_NMAP
;
503 error
= libxfs_bmapi_write(tp
, ip
, bno
,
504 (xfs_extlen_t
)(mp
->m_sb
.sb_rbmblocks
- bno
),
505 0, &first
, mp
->m_sb
.sb_rbmblocks
,
509 _("couldn't allocate realtime bitmap, error = %d\n"),
512 for (i
= 0, ep
= map
; i
< nmap
; i
++, ep
++) {
513 libxfs_device_zero(mp
->m_dev
,
514 XFS_FSB_TO_DADDR(mp
, ep
->br_startblock
),
515 XFS_FSB_TO_BB(mp
, ep
->br_blockcount
));
516 bno
+= ep
->br_blockcount
;
519 error
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
522 _("allocation of the realtime bitmap failed, error = %d\n"),
525 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
529 fill_rbmino(xfs_mount_t
*mp
)
544 tp
= libxfs_trans_alloc(mp
, 0);
546 if ((error
= libxfs_trans_reserve(tp
, 10, 0, 0, 0, 0)))
549 error
= libxfs_trans_iget(mp
, tp
, mp
->m_sb
.sb_rbmino
, 0, 0, &ip
);
552 _("couldn't iget realtime bitmap inode -- error - %d\n"),
556 while (bno
< mp
->m_sb
.sb_rbmblocks
) {
558 * fill the file one block at a time
561 error
= libxfs_bmapi_write(tp
, ip
, bno
, 1, 0,
562 &first
, 1, &map
, &nmap
, NULL
);
563 if (error
|| nmap
!= 1) {
565 _("couldn't map realtime bitmap block %" PRIu64
", error = %d\n"),
569 ASSERT(map
.br_startblock
!= HOLESTARTBLOCK
);
571 error
= libxfs_trans_read_buf(
573 XFS_FSB_TO_DADDR(mp
, map
.br_startblock
),
574 XFS_FSB_TO_BB(mp
, 1), 1, &bp
, NULL
);
578 _("can't access block %" PRIu64
" (fsbno %" PRIu64
") of realtime bitmap inode %" PRIu64
"\n"),
579 bno
, map
.br_startblock
, mp
->m_sb
.sb_rbmino
);
583 memmove(XFS_BUF_PTR(bp
), bmp
, mp
->m_sb
.sb_blocksize
);
585 libxfs_trans_log_buf(tp
, bp
, 0, mp
->m_sb
.sb_blocksize
- 1);
587 bmp
= (xfs_rtword_t
*)((__psint_t
) bmp
+ mp
->m_sb
.sb_blocksize
);
591 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
596 fill_rsumino(xfs_mount_t
*mp
)
606 xfs_dfiloff_t end_bno
;
611 end_bno
= mp
->m_rsumsize
>> mp
->m_sb
.sb_blocklog
;
613 tp
= libxfs_trans_alloc(mp
, 0);
615 if ((error
= libxfs_trans_reserve(tp
, 10, 0, 0, 0, 0)))
618 error
= libxfs_trans_iget(mp
, tp
, mp
->m_sb
.sb_rsumino
, 0, 0, &ip
);
621 _("couldn't iget realtime summary inode -- error - %d\n"),
625 while (bno
< end_bno
) {
627 * fill the file one block at a time
630 error
= libxfs_bmapi_write(tp
, ip
, bno
, 1, 0,
631 &first
, 1, &map
, &nmap
, NULL
);
632 if (error
|| nmap
!= 1) {
634 _("couldn't map realtime summary inode block %" PRIu64
", error = %d\n"),
638 ASSERT(map
.br_startblock
!= HOLESTARTBLOCK
);
640 error
= libxfs_trans_read_buf(
642 XFS_FSB_TO_DADDR(mp
, map
.br_startblock
),
643 XFS_FSB_TO_BB(mp
, 1), 1, &bp
, NULL
);
647 _("can't access block %" PRIu64
" (fsbno %" PRIu64
") of realtime summary inode %" PRIu64
"\n"),
648 bno
, map
.br_startblock
, mp
->m_sb
.sb_rsumino
);
652 memmove(XFS_BUF_PTR(bp
), smp
, mp
->m_sb
.sb_blocksize
);
654 libxfs_trans_log_buf(tp
, bp
, 0, mp
->m_sb
.sb_blocksize
- 1);
656 smp
= (xfs_suminfo_t
*)((__psint_t
)smp
+ mp
->m_sb
.sb_blocksize
);
660 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
665 mk_rsumino(xfs_mount_t
*mp
)
676 xfs_bmap_free_t flist
;
678 xfs_bmbt_irec_t map
[XFS_BMAP_MAX_NMAP
];
685 tp
= libxfs_trans_alloc(mp
, 0);
687 if ((i
= libxfs_trans_reserve(tp
, 10, XFS_ICHANGE_LOG_RES(mp
), 0,
688 XFS_TRANS_PERM_LOG_RES
, XFS_MKDIR_LOG_COUNT
)))
691 error
= libxfs_trans_iget(mp
, tp
, mp
->m_sb
.sb_rsumino
, 0, 0, &ip
);
694 _("couldn't iget realtime summary inode -- error - %d\n"),
698 vers
= xfs_sb_version_hascrc(&mp
->m_sb
) ? 3 : 1;
699 ip
->i_d
.di_version
= vers
;
700 memset(&ip
->i_d
, 0, xfs_icdinode_size(&ip
->i_d
));
702 ip
->i_d
.di_magic
= XFS_DINODE_MAGIC
;
703 ip
->i_d
.di_mode
= S_IFREG
;
704 ip
->i_d
.di_version
= vers
;
705 ip
->i_d
.di_format
= XFS_DINODE_FMT_EXTENTS
;
706 ip
->i_d
.di_aformat
= XFS_DINODE_FMT_EXTENTS
;
708 ip
->i_d
.di_nlink
= 1; /* account for sb ptr */
710 times
= XFS_ICHGTIME_CHG
| XFS_ICHGTIME_MOD
;
711 if (ip
->i_d
.di_version
== 3) {
713 ip
->i_d
.di_changecount
= 1;
715 ip
->i_d
.di_flags2
= 0;
716 ip
->i_d
.di_ino
= mp
->m_sb
.sb_rsumino
;
717 memset(&(ip
->i_d
.di_pad2
[0]), 0, sizeof(ip
->i_d
.di_pad2
));
718 platform_uuid_copy(&ip
->i_d
.di_uuid
, &mp
->m_sb
.sb_uuid
);
719 times
|= XFS_ICHGTIME_CREATE
;
721 libxfs_trans_ichgtime(tp
, ip
, times
);
726 ip
->i_df
.if_flags
= XFS_IFEXTENTS
;
727 ip
->i_df
.if_bytes
= ip
->i_df
.if_real_bytes
= 0;
728 ip
->i_df
.if_u1
.if_extents
= NULL
;
730 ip
->i_d
.di_size
= mp
->m_rsumsize
;
735 libxfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
736 libxfs_trans_ihold(tp
, ip
);
737 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
740 * then allocate blocks for file and fill with zeroes (stolen
743 tp
= libxfs_trans_alloc(mp
, 0);
744 xfs_bmap_init(&flist
, &first
);
746 nsumblocks
= mp
->m_rsumsize
>> mp
->m_sb
.sb_blocklog
;
747 if ((error
= libxfs_trans_reserve(tp
,
748 mp
->m_sb
.sb_rbmblocks
+
749 (XFS_BM_MAXLEVELS(mp
, XFS_DATA_FORK
) - 1),
750 BBTOB(128), 0, XFS_TRANS_PERM_LOG_RES
,
751 XFS_DEFAULT_PERM_LOG_COUNT
)))
754 libxfs_trans_ijoin(tp
, ip
, 0);
756 xfs_bmap_init(&flist
, &first
);
757 while (bno
< nsumblocks
) {
758 nmap
= XFS_BMAP_MAX_NMAP
;
759 error
= libxfs_bmapi_write(tp
, ip
, bno
,
760 (xfs_extlen_t
)(nsumblocks
- bno
),
761 0, &first
, nsumblocks
, map
, &nmap
, &flist
);
764 _("couldn't allocate realtime summary inode, error = %d\n"),
767 for (i
= 0, ep
= map
; i
< nmap
; i
++, ep
++) {
768 libxfs_device_zero(mp
->m_dev
,
769 XFS_FSB_TO_DADDR(mp
, ep
->br_startblock
),
770 XFS_FSB_TO_BB(mp
, ep
->br_blockcount
));
771 bno
+= ep
->br_blockcount
;
774 error
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
777 _("allocation of the realtime summary ino failed, error = %d\n"),
780 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
784 * makes a new root directory.
787 mk_root_dir(xfs_mount_t
*mp
)
793 const mode_t mode
= 0755;
794 ino_tree_node_t
*irec
;
798 ASSERT(xfs_sb_version_hasdirv2(&mp
->m_sb
));
800 tp
= libxfs_trans_alloc(mp
, 0);
803 if ((i
= libxfs_trans_reserve(tp
, 10, XFS_ICHANGE_LOG_RES(mp
), 0,
804 XFS_TRANS_PERM_LOG_RES
, XFS_MKDIR_LOG_COUNT
)))
807 error
= libxfs_trans_iget(mp
, tp
, mp
->m_sb
.sb_rootino
, 0, 0, &ip
);
809 do_error(_("could not iget root inode -- error - %d\n"), error
);
813 * take care of the core -- initialization from xfs_ialloc()
815 vers
= xfs_sb_version_hascrc(&mp
->m_sb
) ? 3 : 1;
816 ip
->i_d
.di_version
= vers
;
817 memset(&ip
->i_d
, 0, xfs_icdinode_size(&ip
->i_d
));
819 ip
->i_d
.di_magic
= XFS_DINODE_MAGIC
;
820 ip
->i_d
.di_mode
= (__uint16_t
) mode
|S_IFDIR
;
821 ip
->i_d
.di_version
= vers
;
822 ip
->i_d
.di_format
= XFS_DINODE_FMT_EXTENTS
;
823 ip
->i_d
.di_aformat
= XFS_DINODE_FMT_EXTENTS
;
825 ip
->i_d
.di_nlink
= 1; /* account for . */
827 times
= XFS_ICHGTIME_CHG
| XFS_ICHGTIME_MOD
;
828 if (ip
->i_d
.di_version
== 3) {
830 ip
->i_d
.di_changecount
= 1;
832 ip
->i_d
.di_flags2
= 0;
833 ip
->i_d
.di_ino
= mp
->m_sb
.sb_rootino
;
834 memset(&(ip
->i_d
.di_pad2
[0]), 0, sizeof(ip
->i_d
.di_pad2
));
835 platform_uuid_copy(&ip
->i_d
.di_uuid
, &mp
->m_sb
.sb_uuid
);
836 times
|= XFS_ICHGTIME_CREATE
;
838 libxfs_trans_ichgtime(tp
, ip
, times
);
840 libxfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
845 ip
->i_df
.if_flags
= XFS_IFEXTENTS
;
846 ip
->i_df
.if_bytes
= ip
->i_df
.if_real_bytes
= 0;
847 ip
->i_df
.if_u1
.if_extents
= NULL
;
852 * initialize the directory
854 libxfs_dir_init(tp
, ip
, ip
);
856 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
858 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rootino
),
859 XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rootino
));
860 set_inode_isadir(irec
, XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rootino
) -
865 * orphanage name == lost+found
868 mk_orphanage(xfs_mount_t
*mp
)
875 ino_tree_node_t
*irec
;
880 xfs_bmap_free_t flist
;
881 const int mode
= 0755;
883 struct xfs_name xname
;
885 ASSERT(xfs_sb_version_hasdirv2(&mp
->m_sb
));
888 * check for an existing lost+found first, if it exists, return
889 * its inode. Otherwise, we can create it. Bad lost+found inodes
890 * would have been cleared in phase3 and phase4.
893 if ((i
= libxfs_iget(mp
, NULL
, mp
->m_sb
.sb_rootino
, 0, &pip
, 0)))
894 do_error(_("%d - couldn't iget root inode to obtain %s\n"),
897 xname
.name
= (unsigned char *)ORPHANAGE
;
898 xname
.len
= strlen(ORPHANAGE
);
899 if (libxfs_dir_lookup(NULL
, pip
, &xname
, &ino
, NULL
) == 0)
903 * could not be found, create it
906 tp
= libxfs_trans_alloc(mp
, 0);
907 xfs_bmap_init(&flist
, &first
);
909 nres
= XFS_MKDIR_SPACE_RES(mp
, xname
.len
);
910 if ((i
= libxfs_trans_reserve(tp
, nres
, XFS_MKDIR_LOG_RES(mp
), 0,
911 XFS_TRANS_PERM_LOG_RES
, XFS_MKDIR_LOG_COUNT
)))
915 * use iget/ijoin instead of trans_iget because the ialloc
916 * wrapper can commit the transaction and start a new one
918 /* if ((i = libxfs_iget(mp, NULL, mp->m_sb.sb_rootino, 0, &pip, 0)))
919 do_error(_("%d - couldn't iget root inode to make %s\n"),
922 error
= libxfs_inode_alloc(&tp
, pip
, mode
|S_IFDIR
,
923 1, 0, &zerocr
, &zerofsx
, &ip
);
925 do_error(_("%s inode allocation failed %d\n"),
928 ip
->i_d
.di_nlink
++; /* account for . */
931 irec
= find_inode_rec(mp
,
932 XFS_INO_TO_AGNO(mp
, ino
),
933 XFS_INO_TO_AGINO(mp
, ino
));
934 ino_offset
= get_inode_offset(mp
, ino
, irec
);
937 * Mark the inode allocated to lost+found as used in the AVL tree
938 * so it is not skipped in phase 7
940 set_inode_used(irec
, ino_offset
);
941 add_inode_ref(irec
, ino_offset
);
944 * now that we know the transaction will stay around,
945 * add the root inode to it
947 libxfs_trans_ijoin(tp
, pip
, 0);
950 * create the actual entry
952 error
= libxfs_dir_createname(tp
, pip
, &xname
, ip
->i_ino
, &first
,
956 _("can't make %s, createname error %d\n"),
960 * bump up the link count in the root directory to account
961 * for .. in the new directory
964 add_inode_ref(find_inode_rec(mp
,
965 XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rootino
),
966 XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rootino
)), 0);
970 libxfs_trans_log_inode(tp
, pip
, XFS_ILOG_CORE
);
971 libxfs_dir_init(tp
, ip
, pip
);
972 libxfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
974 error
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
976 do_error(_("%s directory creation failed -- bmapf error %d\n"),
981 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
982 add_inode_reached(irec
,ino_offset
);
988 * move a file to the orphange.
993 xfs_ino_t ino
, /* inode # to be moved */
994 int isa_dir
) /* 1 if inode is a directory */
996 xfs_inode_t
*orphanage_ip
;
997 xfs_ino_t entry_ino_num
;
1000 xfs_fsblock_t first
;
1001 xfs_bmap_free_t flist
;
1004 unsigned char fname
[MAXPATHLEN
+ 1];
1007 ino_tree_node_t
*irec
;
1009 struct xfs_name xname
;
1011 ASSERT(xfs_sb_version_hasdirv2(&mp
->m_sb
));
1014 xname
.len
= snprintf((char *)fname
, sizeof(fname
), "%llu",
1015 (unsigned long long)ino
);
1017 err
= libxfs_iget(mp
, NULL
, orphanage_ino
, 0, &orphanage_ip
, 0);
1019 do_error(_("%d - couldn't iget orphanage inode\n"), err
);
1021 * Make sure the filename is unique in the lost+found
1024 while (libxfs_dir_lookup(NULL
, orphanage_ip
, &xname
, &entry_ino_num
,
1026 xname
.len
= snprintf((char *)fname
, sizeof(fname
), "%llu.%d",
1027 (unsigned long long)ino
, ++incr
);
1029 tp
= libxfs_trans_alloc(mp
, 0);
1031 if ((err
= libxfs_iget(mp
, NULL
, ino
, 0, &ino_p
, 0)))
1032 do_error(_("%d - couldn't iget disconnected inode\n"), err
);
1035 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
, orphanage_ino
),
1036 XFS_INO_TO_AGINO(mp
, orphanage_ino
));
1038 ino_offset
= XFS_INO_TO_AGINO(mp
, orphanage_ino
) -
1040 nres
= XFS_DIRENTER_SPACE_RES(mp
, fnamelen
) +
1041 XFS_DIRENTER_SPACE_RES(mp
, 2);
1042 err
= libxfs_dir_lookup(tp
, ino_p
, &xfs_name_dotdot
,
1043 &entry_ino_num
, NULL
);
1045 ASSERT(err
== ENOENT
);
1047 if ((err
= libxfs_trans_reserve(tp
, nres
,
1048 XFS_RENAME_LOG_RES(mp
), 0,
1049 XFS_TRANS_PERM_LOG_RES
,
1050 XFS_RENAME_LOG_COUNT
)))
1052 _("space reservation failed (%d), filesystem may be out of space\n"),
1055 libxfs_trans_ijoin(tp
, orphanage_ip
, 0);
1056 libxfs_trans_ijoin(tp
, ino_p
, 0);
1058 xfs_bmap_init(&flist
, &first
);
1059 err
= libxfs_dir_createname(tp
, orphanage_ip
, &xname
,
1060 ino
, &first
, &flist
, nres
);
1063 _("name create failed in %s (%d), filesystem may be out of space\n"),
1067 add_inode_ref(irec
, ino_offset
);
1069 orphanage_ip
->i_d
.di_nlink
++;
1070 libxfs_trans_log_inode(tp
, orphanage_ip
, XFS_ILOG_CORE
);
1072 err
= libxfs_dir_createname(tp
, ino_p
, &xfs_name_dotdot
,
1073 orphanage_ino
, &first
, &flist
, nres
);
1076 _("creation of .. entry failed (%d), filesystem may be out of space\n"),
1079 ino_p
->i_d
.di_nlink
++;
1080 libxfs_trans_log_inode(tp
, ino_p
, XFS_ILOG_CORE
);
1082 err
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
1085 _("bmap finish failed (err - %d), filesystem may be out of space\n"),
1088 libxfs_trans_commit(tp
,
1089 XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
1091 if ((err
= libxfs_trans_reserve(tp
, nres
,
1092 XFS_RENAME_LOG_RES(mp
), 0,
1093 XFS_TRANS_PERM_LOG_RES
,
1094 XFS_RENAME_LOG_COUNT
)))
1096 _("space reservation failed (%d), filesystem may be out of space\n"),
1099 libxfs_trans_ijoin(tp
, orphanage_ip
, 0);
1100 libxfs_trans_ijoin(tp
, ino_p
, 0);
1102 xfs_bmap_init(&flist
, &first
);
1104 err
= libxfs_dir_createname(tp
, orphanage_ip
, &xname
,
1105 ino
, &first
, &flist
, nres
);
1108 _("name create failed in %s (%d), filesystem may be out of space\n"),
1112 add_inode_ref(irec
, ino_offset
);
1114 orphanage_ip
->i_d
.di_nlink
++;
1115 libxfs_trans_log_inode(tp
, orphanage_ip
, XFS_ILOG_CORE
);
1118 * don't replace .. value if it already points
1119 * to us. that'll pop a libxfs/kernel ASSERT.
1121 if (entry_ino_num
!= orphanage_ino
) {
1122 err
= libxfs_dir_replace(tp
, ino_p
,
1123 &xfs_name_dotdot
, orphanage_ino
,
1124 &first
, &flist
, nres
);
1127 _("name replace op failed (%d), filesystem may be out of space\n"),
1131 err
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
1134 _("bmap finish failed (%d), filesystem may be out of space\n"),
1137 libxfs_trans_commit(tp
,
1138 XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
1143 * use the remove log reservation as that's
1144 * more accurate. we're only creating the
1145 * links, we're not doing the inode allocation
1146 * also accounted for in the create
1148 nres
= XFS_DIRENTER_SPACE_RES(mp
, xname
.len
);
1149 err
= libxfs_trans_reserve(tp
, nres
, XFS_REMOVE_LOG_RES(mp
), 0,
1150 XFS_TRANS_PERM_LOG_RES
, XFS_REMOVE_LOG_COUNT
);
1153 _("space reservation failed (%d), filesystem may be out of space\n"),
1156 libxfs_trans_ijoin(tp
, orphanage_ip
, 0);
1157 libxfs_trans_ijoin(tp
, ino_p
, 0);
1159 xfs_bmap_init(&flist
, &first
);
1160 err
= libxfs_dir_createname(tp
, orphanage_ip
, &xname
, ino
,
1161 &first
, &flist
, nres
);
1164 _("name create failed in %s (%d), filesystem may be out of space\n"),
1168 ino_p
->i_d
.di_nlink
= 1;
1169 libxfs_trans_log_inode(tp
, ino_p
, XFS_ILOG_CORE
);
1171 err
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
1174 _("bmap finish failed (%d), filesystem may be out of space\n"),
1177 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
1188 do_warn(msg
, iname
, ino1
, ino2
);
1191 do_warn(_(", marking entry to be junked\n"));
1195 do_warn(_(", would junk entry\n"));
1200 * Unexpected failure during the rebuild will leave the entries in
1201 * lost+found on the next run
1205 longform_dir2_rebuild(
1209 ino_tree_node_t
*irec
,
1211 dir_hash_tab_t
*hashtab
)
1216 xfs_fileoff_t lastblock
;
1217 xfs_fsblock_t firstblock
;
1218 xfs_bmap_free_t flist
;
1225 * trash directory completely and rebuild from scratch using the
1226 * name/inode pairs in the hash table
1229 do_warn(_("rebuilding directory inode %" PRIu64
"\n"), ino
);
1232 * first attempt to locate the parent inode, if it can't be
1233 * found, set it to the root inode and it'll be moved to the
1234 * orphanage later (the inode number here needs to be valid
1235 * for the libxfs_dir_init() call).
1237 pip
.i_ino
= get_inode_parent(irec
, ino_offset
);
1238 if (pip
.i_ino
== NULLFSINO
)
1239 pip
.i_ino
= mp
->m_sb
.sb_rootino
;
1241 xfs_bmap_init(&flist
, &firstblock
);
1243 tp
= libxfs_trans_alloc(mp
, 0);
1244 nres
= XFS_REMOVE_SPACE_RES(mp
);
1245 error
= libxfs_trans_reserve(tp
, nres
, XFS_REMOVE_LOG_RES(mp
), 0,
1246 XFS_TRANS_PERM_LOG_RES
, XFS_REMOVE_LOG_COUNT
);
1249 libxfs_trans_ijoin(tp
, ip
, 0);
1250 libxfs_trans_ihold(tp
, ip
);
1252 if ((error
= libxfs_bmap_last_offset(tp
, ip
, &lastblock
,
1254 do_error(_("xfs_bmap_last_offset failed -- error - %d\n"),
1257 /* free all data, leaf, node and freespace blocks */
1258 error
= libxfs_bunmapi(tp
, ip
, 0, lastblock
, XFS_BMAPI_METADATA
, 0,
1259 &firstblock
, &flist
, &done
);
1261 do_warn(_("xfs_bunmapi failed -- error - %d\n"), error
);
1262 libxfs_trans_cancel(tp
, XFS_TRANS_RELEASE_LOG_RES
|
1269 libxfs_dir_init(tp
, ip
, &pip
);
1271 error
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
1273 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
1275 /* go through the hash list and re-add the inodes */
1277 for (p
= hashtab
->first
; p
; p
= p
->nextbyorder
) {
1279 if (p
->name
.name
[0] == '/' || (p
->name
.name
[0] == '.' &&
1280 (p
->name
.len
== 1 || (p
->name
.len
== 2 &&
1281 p
->name
.name
[1] == '.'))))
1284 tp
= libxfs_trans_alloc(mp
, 0);
1285 nres
= XFS_CREATE_SPACE_RES(mp
, p
->name
.len
);
1286 error
= libxfs_trans_reserve(tp
, nres
, XFS_CREATE_LOG_RES(mp
),
1287 0, XFS_TRANS_PERM_LOG_RES
, XFS_CREATE_LOG_COUNT
);
1290 _("space reservation failed (%d), filesystem may be out of space\n"),
1295 libxfs_trans_ijoin(tp
, ip
, 0);
1296 libxfs_trans_ihold(tp
, ip
);
1298 xfs_bmap_init(&flist
, &firstblock
);
1299 error
= libxfs_dir_createname(tp
, ip
, &p
->name
, p
->inum
,
1300 &firstblock
, &flist
, nres
);
1303 _("name create failed in ino %" PRIu64
" (%d), filesystem may be out of space\n"),
1305 libxfs_trans_cancel(tp
, XFS_TRANS_RELEASE_LOG_RES
|
1310 error
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
1313 _("bmap finish failed (%d), filesystem may be out of space\n"),
1315 libxfs_bmap_cancel(&flist
);
1316 libxfs_trans_cancel(tp
, XFS_TRANS_RELEASE_LOG_RES
|
1321 libxfs_trans_commit(tp
,
1322 XFS_TRANS_RELEASE_LOG_RES
|XFS_TRANS_SYNC
);
1328 * Kill a block in a version 2 inode.
1329 * Makes its own transaction.
1341 xfs_fsblock_t firstblock
;
1342 xfs_bmap_free_t flist
;
1346 tp
= libxfs_trans_alloc(mp
, 0);
1347 nres
= XFS_REMOVE_SPACE_RES(mp
);
1348 error
= libxfs_trans_reserve(tp
, nres
, XFS_REMOVE_LOG_RES(mp
), 0,
1349 XFS_TRANS_PERM_LOG_RES
, XFS_REMOVE_LOG_COUNT
);
1352 libxfs_trans_ijoin(tp
, ip
, 0);
1353 libxfs_trans_ihold(tp
, ip
);
1354 libxfs_trans_bjoin(tp
, bp
);
1355 memset(&args
, 0, sizeof(args
));
1356 xfs_bmap_init(&flist
, &firstblock
);
1359 args
.firstblock
= &firstblock
;
1360 args
.flist
= &flist
;
1361 args
.whichfork
= XFS_DATA_FORK
;
1362 if (da_bno
>= mp
->m_dirleafblk
&& da_bno
< mp
->m_dirfreeblk
)
1363 error
= libxfs_da_shrink_inode(&args
, da_bno
, bp
);
1365 error
= libxfs_dir2_shrink_inode(&args
,
1366 xfs_dir2_da_to_db(mp
, da_bno
), bp
);
1368 do_error(_("shrink_inode failed inode %" PRIu64
" block %u\n"),
1370 libxfs_bmap_finish(&tp
, &flist
, &committed
);
1371 libxfs_trans_commit(tp
, 0);
1375 * process a data block, also checks for .. entry
1376 * and corrects it to match what we think .. should be
1379 longform_dir2_entry_check_data(
1384 ino_tree_node_t
*current_irec
,
1385 int current_ino_offset
,
1386 struct xfs_buf
**bpp
,
1387 dir_hash_tab_t
*hashtab
,
1388 freetab_t
**freetabp
,
1392 xfs_dir2_dataptr_t addr
;
1393 xfs_dir2_leaf_entry_t
*blp
;
1395 xfs_dir2_block_tail_t
*btp
;
1399 xfs_dir2_data_entry_t
*dep
;
1400 xfs_dir2_data_unused_t
*dup
;
1403 xfs_fsblock_t firstblock
;
1404 xfs_bmap_free_t flist
;
1405 char fname
[MAXNAMELEN
+ 1];
1410 ino_tree_node_t
*irec
;
1426 needscan
= needlog
= 0;
1428 freetab
= *freetabp
;
1430 btp
= xfs_dir2_block_tail_p(mp
, (struct xfs_dir2_data_hdr
*)d
);
1431 blp
= xfs_dir2_block_leaf_p(btp
);
1432 endptr
= (char *)blp
;
1433 if (endptr
> (char *)btp
)
1434 endptr
= (char *)btp
;
1435 wantmagic
= XFS_DIR2_BLOCK_MAGIC
;
1437 endptr
= (char *)d
+ mp
->m_dirblksize
;
1438 wantmagic
= XFS_DIR2_DATA_MAGIC
;
1440 db
= xfs_dir2_da_to_db(mp
, da_bno
);
1442 /* check for data block beyond expected end */
1443 if (freetab
->naents
<= db
) {
1444 struct freetab_ent e
;
1446 *freetabp
= freetab
= realloc(freetab
, FREETAB_SIZE(db
+ 1));
1449 _("realloc failed in longform_dir2_entry_check_data (%zu bytes)\n"),
1450 FREETAB_SIZE(db
+ 1));
1454 for (i
= freetab
->naents
; i
< db
; i
++)
1455 freetab
->ents
[i
] = e
;
1456 freetab
->naents
= db
+ 1;
1459 /* check the data block */
1460 while (ptr
< endptr
) {
1462 /* check for freespace */
1463 dup
= (xfs_dir2_data_unused_t
*)ptr
;
1464 if (XFS_DIR2_DATA_FREE_TAG
== be16_to_cpu(dup
->freetag
)) {
1466 /* check for invalid freespace length */
1467 if (ptr
+ be16_to_cpu(dup
->length
) > endptr
||
1468 be16_to_cpu(dup
->length
) == 0 ||
1469 (be16_to_cpu(dup
->length
) &
1470 (XFS_DIR2_DATA_ALIGN
- 1)))
1473 /* check for invalid tag */
1474 if (be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup
)) !=
1475 (char *)dup
- (char *)d
)
1478 /* check for block with no data entries */
1479 if ((ptr
== (char *)d
->u
) && (ptr
+
1480 be16_to_cpu(dup
->length
) >= endptr
)) {
1486 /* continue at the end of the freespace */
1487 ptr
+= be16_to_cpu(dup
->length
);
1492 /* validate data entry size */
1493 dep
= (xfs_dir2_data_entry_t
*)ptr
;
1494 if (ptr
+ xfs_dir2_data_entsize(dep
->namelen
) > endptr
)
1496 if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep
)) !=
1497 (char *)dep
- (char *)d
)
1499 ptr
+= xfs_dir2_data_entsize(dep
->namelen
);
1502 /* did we find an empty or corrupt block? */
1503 if (ptr
!= endptr
) {
1506 _("empty data block %u in directory inode %" PRIu64
": "),
1510 ("corrupt block %u in directory inode %" PRIu64
": "),
1514 do_warn(_("junking block\n"));
1515 dir2_kill_block(mp
, ip
, da_bno
, bp
);
1517 do_warn(_("would junk block\n"));
1520 freetab
->ents
[db
].v
= NULLDATAOFF
;
1525 /* update number of data blocks processed */
1526 if (freetab
->nents
< db
+ 1)
1527 freetab
->nents
= db
+ 1;
1529 tp
= libxfs_trans_alloc(mp
, 0);
1530 error
= libxfs_trans_reserve(tp
, 0, XFS_REMOVE_LOG_RES(mp
), 0,
1531 XFS_TRANS_PERM_LOG_RES
, XFS_REMOVE_LOG_COUNT
);
1534 libxfs_trans_ijoin(tp
, ip
, 0);
1535 libxfs_trans_ihold(tp
, ip
);
1536 libxfs_trans_bjoin(tp
, bp
);
1537 libxfs_trans_bhold(tp
, bp
);
1538 xfs_bmap_init(&flist
, &firstblock
);
1539 if (be32_to_cpu(d
->hdr
.magic
) != wantmagic
) {
1541 _("bad directory block magic # %#x for directory inode %" PRIu64
" block %d: "),
1542 be32_to_cpu(d
->hdr
.magic
), ip
->i_ino
, da_bno
);
1544 do_warn(_("fixing magic # to %#x\n"), wantmagic
);
1545 d
->hdr
.magic
= cpu_to_be32(wantmagic
);
1548 do_warn(_("would fix magic # to %#x\n"), wantmagic
);
1553 * look at each entry. reference inode pointed to by each
1554 * entry in the incore inode tree.
1555 * if not a directory, set reached flag, increment link count
1556 * if a directory and reached, mark entry as to be deleted.
1557 * if a directory, check to see if recorded parent
1558 * matches current inode #,
1559 * if so, then set reached flag, increment link count
1560 * of current and child dir inodes, push the child
1561 * directory inode onto the directory stack.
1562 * if current inode != parent, then mark entry to be deleted.
1564 while (ptr
< endptr
) {
1565 dup
= (xfs_dir2_data_unused_t
*)ptr
;
1566 if (be16_to_cpu(dup
->freetag
) == XFS_DIR2_DATA_FREE_TAG
) {
1569 _("directory inode %" PRIu64
" block %u has consecutive free entries: "),
1572 do_warn(_("joining together\n"));
1573 len
= be16_to_cpu(dup
->length
);
1574 libxfs_dir2_data_use_free(tp
, bp
, dup
,
1575 ptr
- (char *)d
, len
, &needlog
,
1577 libxfs_dir2_data_make_free(tp
, bp
,
1578 ptr
- (char *)d
, len
, &needlog
,
1581 do_warn(_("would join together\n"));
1583 ptr
+= be16_to_cpu(dup
->length
);
1587 addr
= xfs_dir2_db_off_to_dataptr(mp
, db
, ptr
- (char *)d
);
1588 dep
= (xfs_dir2_data_entry_t
*)ptr
;
1589 ptr
+= xfs_dir2_data_entsize(dep
->namelen
);
1590 inum
= be64_to_cpu(dep
->inumber
);
1593 * skip bogus entries (leading '/'). they'll be deleted
1594 * later. must still log it, else we leak references to
1597 if (dep
->name
[0] == '/') {
1600 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1604 memmove(fname
, dep
->name
, dep
->namelen
);
1605 fname
[dep
->namelen
] = '\0';
1606 ASSERT(inum
!= NULLFSINO
);
1608 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
, inum
),
1609 XFS_INO_TO_AGINO(mp
, inum
));
1613 _("entry \"%s\" in directory inode %" PRIu64
" points to non-existent inode %" PRIu64
""),
1614 fname
, ip
->i_ino
, inum
)) {
1616 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1620 ino_offset
= XFS_INO_TO_AGINO(mp
, inum
) - irec
->ino_startnum
;
1623 * if it's a free inode, blow out the entry.
1624 * by now, any inode that we think is free
1627 if (is_inode_free(irec
, ino_offset
)) {
1630 _("entry \"%s\" in directory inode %" PRIu64
" points to free inode %" PRIu64
),
1631 fname
, ip
->i_ino
, inum
)) {
1633 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1639 * check if this inode is lost+found dir in the root
1641 if (inum
== mp
->m_sb
.sb_rootino
&& strcmp(fname
, ORPHANAGE
) == 0) {
1643 * if it's not a directory, trash it
1645 if (!inode_isadir(irec
, ino_offset
)) {
1648 _("%s (ino %" PRIu64
") in root (%" PRIu64
") is not a directory"),
1649 ORPHANAGE
, inum
, ip
->i_ino
)) {
1651 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1656 * if this is a dup, it will be picked up below,
1657 * otherwise, mark it as the orphanage for later.
1660 orphanage_ino
= inum
;
1663 * check for duplicate names in directory.
1665 if (!dir_hash_add(mp
, hashtab
, addr
, inum
, dep
->namelen
,
1669 _("entry \"%s\" (ino %" PRIu64
") in dir %" PRIu64
" is a duplicate name"),
1670 fname
, inum
, ip
->i_ino
)) {
1672 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1674 if (inum
== orphanage_ino
)
1680 * if just scanning to rebuild a directory due to a ".."
1681 * update, just continue
1687 * skip the '..' entry since it's checked when the
1688 * directory is reached by something else. if it never
1689 * gets reached, it'll be moved to the orphanage and we'll
1690 * take care of it then. If it doesn't exist at all, the
1691 * directory needs to be rebuilt first before being added
1694 if (dep
->namelen
== 2 && dep
->name
[0] == '.' &&
1695 dep
->name
[1] == '.') {
1697 /* ".." should be in the first block */
1700 _("entry \"%s\" (ino %" PRIu64
") in dir %" PRIu64
" is not in the the first block"), fname
,
1703 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1708 ASSERT(no_modify
|| !verify_inum(mp
, inum
));
1710 * special case the . entry. we know there's only one
1711 * '.' and only '.' points to itself because bogus entries
1712 * got trashed in phase 3 if there were > 1.
1713 * bump up link count for '.' but don't set reached
1714 * until we're actually reached by another directory
1715 * '..' is already accounted for or will be taken care
1716 * of when directory is moved to orphanage.
1718 if (ip
->i_ino
== inum
) {
1719 ASSERT(dep
->name
[0] == '.' && dep
->namelen
== 1);
1720 add_inode_ref(current_irec
, current_ino_offset
);
1721 if (da_bno
!= 0 || dep
!= (xfs_dir2_data_entry_t
*)d
->u
) {
1722 /* "." should be the first entry */
1725 _("entry \"%s\" in dir %" PRIu64
" is not the first entry"),
1726 fname
, inum
, ip
->i_ino
)) {
1728 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1735 * skip entries with bogus inumbers if we're in no modify mode
1737 if (no_modify
&& verify_inum(mp
, inum
))
1740 * check easy case first, regular inode, just bump
1741 * the link count and continue
1743 if (!inode_isadir(irec
, ino_offset
)) {
1744 add_inode_reached(irec
, ino_offset
);
1747 parent
= get_inode_parent(irec
, ino_offset
);
1748 ASSERT(parent
!= 0);
1751 * bump up the link counts in parent and child
1752 * directory but if the link doesn't agree with
1753 * the .. in the child, blow out the entry.
1754 * if the directory has already been reached,
1755 * blow away the entry also.
1757 if (is_inode_reached(irec
, ino_offset
)) {
1760 _("entry \"%s\" in dir %" PRIu64
" points to an already connected directory inode %" PRIu64
"\n"),
1761 fname
, ip
->i_ino
, inum
);
1762 } else if (parent
== ip
->i_ino
) {
1763 add_inode_reached(irec
, ino_offset
);
1764 add_inode_ref(current_irec
, current_ino_offset
);
1765 } else if (parent
== NULLFSINO
) {
1766 /* ".." was missing, but this entry refers to it,
1767 so, set it as the parent and mark for rebuild */
1769 _("entry \"%s\" in dir ino %" PRIu64
" doesn't have a .. entry, will set it in ino %" PRIu64
".\n"),
1770 fname
, ip
->i_ino
, inum
);
1771 set_inode_parent(irec
, ino_offset
, ip
->i_ino
);
1772 add_inode_reached(irec
, ino_offset
);
1773 add_inode_ref(current_irec
, current_ino_offset
);
1774 add_dotdot_update(XFS_INO_TO_AGNO(mp
, inum
), irec
,
1779 _("entry \"%s\" in dir inode %" PRIu64
" inconsistent with .. value (%" PRIu64
") in ino %" PRIu64
"\n"),
1780 fname
, ip
->i_ino
, parent
, inum
);
1783 if (inum
== orphanage_ino
)
1789 libxfs_dir2_data_log_entry(tp
, bp
, dep
);
1792 _("\twill clear entry \"%s\"\n"),
1795 do_warn(_("\twould clear entry \"%s\"\n"),
1800 *num_illegal
+= nbad
;
1802 libxfs_dir2_data_freescan(mp
, &d
->hdr
, &needlog
);
1804 libxfs_dir2_data_log_header(tp
, bp
);
1805 libxfs_bmap_finish(&tp
, &flist
, &committed
);
1806 libxfs_trans_commit(tp
, 0);
1807 freetab
->ents
[db
].v
= be16_to_cpu(d
->hdr
.bestfree
[0].length
);
1808 freetab
->ents
[db
].s
= 0;
1812 * Check contents of leaf-form block.
1815 longform_dir2_check_leaf(
1818 dir_hash_tab_t
*hashtab
,
1826 xfs_dir2_leaf_t
*leaf
;
1827 xfs_dir2_leaf_tail_t
*ltp
;
1829 struct xfs_dir2_leaf_entry
*ents
;
1831 da_bno
= mp
->m_dirleafblk
;
1832 if (libxfs_da_read_buf(NULL
, ip
, da_bno
, -1, &bp
, XFS_DATA_FORK
, NULL
)) {
1834 _("can't read block %u for directory inode %" PRIu64
"\n"),
1839 ents
= xfs_dir3_leaf_ents_p(leaf
);
1840 ltp
= xfs_dir2_leaf_tail_p(mp
, leaf
);
1841 bestsp
= xfs_dir2_leaf_bests_p(ltp
);
1842 if (be16_to_cpu(leaf
->hdr
.info
.magic
) != XFS_DIR2_LEAF1_MAGIC
||
1843 be32_to_cpu(leaf
->hdr
.info
.forw
) ||
1844 be32_to_cpu(leaf
->hdr
.info
.back
) ||
1845 be16_to_cpu(leaf
->hdr
.count
) <
1846 be16_to_cpu(leaf
->hdr
.stale
) ||
1847 be16_to_cpu(leaf
->hdr
.count
) >
1848 xfs_dir3_max_leaf_ents(mp
, leaf
) ||
1849 (char *)&ents
[be16_to_cpu(
1850 leaf
->hdr
.count
)] > (char *)bestsp
) {
1852 _("leaf block %u for directory inode %" PRIu64
" bad header\n"),
1857 seeval
= dir_hash_see_all(hashtab
, ents
,
1858 be16_to_cpu(leaf
->hdr
.count
),
1859 be16_to_cpu(leaf
->hdr
.stale
));
1860 if (dir_hash_check(hashtab
, ip
, seeval
)) {
1864 badtail
= freetab
->nents
!= be32_to_cpu(ltp
->bestcount
);
1865 for (i
= 0; !badtail
&& i
< be32_to_cpu(ltp
->bestcount
); i
++) {
1866 freetab
->ents
[i
].s
= 1;
1867 badtail
= freetab
->ents
[i
].v
!= be16_to_cpu(bestsp
[i
]);
1871 _("leaf block %u for directory inode %" PRIu64
" bad tail\n"),
1881 * Check contents of the node blocks (leaves)
1882 * Looks for matching hash values for the data entries.
1885 longform_dir2_check_node(
1888 dir_hash_tab_t
*hashtab
,
1894 xfs_dir2_free_t
*free
;
1896 xfs_dir2_leaf_t
*leaf
;
1897 xfs_fileoff_t next_da_bno
;
1900 struct xfs_dir2_leaf_entry
*ents
;
1902 for (da_bno
= mp
->m_dirleafblk
, next_da_bno
= 0;
1903 next_da_bno
!= NULLFILEOFF
&& da_bno
< mp
->m_dirfreeblk
;
1904 da_bno
= (xfs_dablk_t
)next_da_bno
) {
1905 next_da_bno
= da_bno
+ mp
->m_dirblkfsbs
- 1;
1906 if (bmap_next_offset(NULL
, ip
, &next_da_bno
, XFS_DATA_FORK
))
1908 if (libxfs_da_read_buf(NULL
, ip
, da_bno
, -1, &bp
,
1909 XFS_DATA_FORK
, NULL
)) {
1911 _("can't read leaf block %u for directory inode %" PRIu64
"\n"),
1916 ents
= xfs_dir3_leaf_ents_p(leaf
);
1917 if (be16_to_cpu(leaf
->hdr
.info
.magic
) != XFS_DIR2_LEAFN_MAGIC
) {
1918 if (be16_to_cpu(leaf
->hdr
.info
.magic
) ==
1919 XFS_DA_NODE_MAGIC
) {
1924 _("unknown magic number %#x for block %u in directory inode %" PRIu64
"\n"),
1925 be16_to_cpu(leaf
->hdr
.info
.magic
),
1930 if (be16_to_cpu(leaf
->hdr
.count
) > xfs_dir3_max_leaf_ents(mp
, leaf
) ||
1931 be16_to_cpu(leaf
->hdr
.count
) <
1932 be16_to_cpu(leaf
->hdr
.stale
)) {
1934 _("leaf block %u for directory inode %" PRIu64
" bad header\n"),
1939 seeval
= dir_hash_see_all(hashtab
, ents
,
1940 be16_to_cpu(leaf
->hdr
.count
),
1941 be16_to_cpu(leaf
->hdr
.stale
));
1943 if (seeval
!= DIR_HASH_CK_OK
)
1946 if (dir_hash_check(hashtab
, ip
, seeval
))
1949 for (da_bno
= mp
->m_dirfreeblk
, next_da_bno
= 0;
1950 next_da_bno
!= NULLFILEOFF
;
1951 da_bno
= (xfs_dablk_t
)next_da_bno
) {
1952 next_da_bno
= da_bno
+ mp
->m_dirblkfsbs
- 1;
1953 if (bmap_next_offset(NULL
, ip
, &next_da_bno
, XFS_DATA_FORK
))
1955 if (libxfs_da_read_buf(NULL
, ip
, da_bno
, -1, &bp
,
1956 XFS_DATA_FORK
, NULL
)) {
1958 _("can't read freespace block %u for directory inode %" PRIu64
"\n"),
1963 fdb
= xfs_dir2_da_to_db(mp
, da_bno
);
1964 if (be32_to_cpu(free
->hdr
.magic
) != XFS_DIR2_FREE_MAGIC
||
1965 be32_to_cpu(free
->hdr
.firstdb
) !=
1966 (fdb
- XFS_DIR2_FREE_FIRSTDB(mp
)) *
1967 xfs_dir3_free_max_bests(mp
) ||
1968 be32_to_cpu(free
->hdr
.nvalid
) <
1969 be32_to_cpu(free
->hdr
.nused
)) {
1971 _("free block %u for directory inode %" PRIu64
" bad header\n"),
1976 for (i
= used
= 0; i
< be32_to_cpu(free
->hdr
.nvalid
); i
++) {
1977 if (i
+ be32_to_cpu(free
->hdr
.firstdb
) >=
1979 freetab
->ents
[i
+ be32_to_cpu(
1980 free
->hdr
.firstdb
)].v
!=
1981 be16_to_cpu(free
->bests
[i
])) {
1983 _("free block %u entry %i for directory ino %" PRIu64
" bad\n"),
1984 da_bno
, i
, ip
->i_ino
);
1988 used
+= be16_to_cpu(free
->bests
[i
]) != NULLDATAOFF
;
1989 freetab
->ents
[i
+ be32_to_cpu(free
->hdr
.firstdb
)].s
= 1;
1991 if (used
!= be32_to_cpu(free
->hdr
.nused
)) {
1993 _("free block %u for directory inode %" PRIu64
" bad nused\n"),
2000 for (i
= 0; i
< freetab
->nents
; i
++) {
2001 if ((freetab
->ents
[i
].s
== 0) &&
2002 (freetab
->ents
[i
].v
!= NULLDATAOFF
)) {
2004 _("missing freetab entry %u for directory inode %" PRIu64
"\n"),
2013 * If a directory is corrupt, we need to read in as many entries as possible,
2014 * destroy the entry and create a new one with recovered name/inode pairs.
2015 * (ie. get libxfs to do all the grunt work)
2018 longform_dir2_entry_check(xfs_mount_t
*mp
,
2023 ino_tree_node_t
*irec
,
2025 dir_hash_tab_t
*hashtab
)
2027 xfs_dir2_block_t
*block
;
2028 struct xfs_buf
**bplist
;
2035 xfs_fileoff_t next_da_bno
;
2041 freetab
= malloc(FREETAB_SIZE(ip
->i_d
.di_size
/ mp
->m_dirblksize
));
2044 _("malloc failed in longform_dir2_entry_check (%" PRId64
" bytes)\n"),
2045 FREETAB_SIZE(ip
->i_d
.di_size
/ mp
->m_dirblksize
));
2048 freetab
->naents
= ip
->i_d
.di_size
/ mp
->m_dirblksize
;
2050 for (i
= 0; i
< freetab
->naents
; i
++) {
2051 freetab
->ents
[i
].v
= NULLDATAOFF
;
2052 freetab
->ents
[i
].s
= 0;
2054 num_bps
= freetab
->naents
;
2055 bplist
= calloc(num_bps
, sizeof(struct xfs_buf
*));
2056 /* is this a block, leaf, or node directory? */
2057 libxfs_dir2_isblock(NULL
, ip
, &isblock
);
2058 libxfs_dir2_isleaf(NULL
, ip
, &isleaf
);
2060 /* check directory "data" blocks (ie. name/inode pairs) */
2061 for (da_bno
= 0, next_da_bno
= 0;
2062 next_da_bno
!= NULLFILEOFF
&& da_bno
< mp
->m_dirleafblk
;
2063 da_bno
= (xfs_dablk_t
)next_da_bno
) {
2064 next_da_bno
= da_bno
+ mp
->m_dirblkfsbs
- 1;
2065 if (bmap_next_offset(NULL
, ip
, &next_da_bno
, XFS_DATA_FORK
))
2067 db
= xfs_dir2_da_to_db(mp
, da_bno
);
2068 if (db
>= num_bps
) {
2069 /* more data blocks than expected */
2071 bplist
= realloc(bplist
, num_bps
* sizeof(struct xfs_buf
*));
2074 _("realloc failed in longform_dir2_entry_check (%zu bytes)\n"),
2075 num_bps
* sizeof(struct xfs_buf
*));
2077 if (libxfs_da_read_buf(NULL
, ip
, da_bno
, -1, &bplist
[db
],
2078 XFS_DATA_FORK
, NULL
)) {
2080 _("can't read data block %u for directory inode %" PRIu64
"\n"),
2083 continue; /* try and read all "data" blocks */
2085 longform_dir2_entry_check_data(mp
, ip
, num_illegal
, need_dot
,
2086 irec
, ino_offset
, &bplist
[db
], hashtab
,
2087 &freetab
, da_bno
, isblock
);
2089 fixit
= (*num_illegal
!= 0) || dir2_is_badino(ino
) || *need_dot
;
2091 if (!dotdot_update
) {
2092 /* check btree and freespace */
2094 xfs_dir2_block_tail_t
*btp
;
2095 xfs_dir2_leaf_entry_t
*blp
;
2097 block
= bplist
[0]->b_addr
;
2098 btp
= xfs_dir2_block_tail_p(mp
, &block
->hdr
);
2099 blp
= xfs_dir2_block_leaf_p(btp
);
2100 seeval
= dir_hash_see_all(hashtab
, blp
,
2101 be32_to_cpu(btp
->count
),
2102 be32_to_cpu(btp
->stale
));
2103 if (dir_hash_check(hashtab
, ip
, seeval
))
2105 } else if (isleaf
) {
2106 fixit
|= longform_dir2_check_leaf(mp
, ip
, hashtab
,
2109 fixit
|= longform_dir2_check_node(mp
, ip
, hashtab
,
2113 if (!no_modify
&& (fixit
|| dotdot_update
)) {
2114 dir_hash_dup_names(hashtab
);
2115 for (i
= 0; i
< freetab
->naents
; i
++)
2117 libxfs_putbuf(bplist
[i
]);
2118 longform_dir2_rebuild(mp
, ino
, ip
, irec
, ino_offset
, hashtab
);
2122 for (i
= 0; i
< freetab
->naents
; i
++)
2124 libxfs_putbuf(bplist
[i
]);
2132 * shortform directory v2 processing routines -- entry verification and
2133 * bad entry deletion (pruning).
2136 shortform_dir2_entry_check(xfs_mount_t
*mp
,
2140 ino_tree_node_t
*current_irec
,
2141 int current_ino_offset
,
2142 dir_hash_tab_t
*hashtab
)
2147 xfs_dir2_sf_entry_t
*sfep
, *next_sfep
, *tmp_sfep
;
2149 ino_tree_node_t
*irec
;
2159 char fname
[MAXNAMELEN
+ 1];
2163 sfp
= (xfs_dir2_sf_t
*) ifp
->if_u1
.if_data
;
2167 max_size
= ifp
->if_bytes
;
2168 ASSERT(ip
->i_d
.di_size
<= ifp
->if_bytes
);
2171 * if just rebuild a directory due to a "..", update and return
2173 if (dotdot_update
) {
2174 parent
= get_inode_parent(current_irec
, current_ino_offset
);
2177 _("would set .. in sf dir inode %" PRIu64
" to %" PRIu64
"\n"),
2181 _("setting .. in sf dir inode %" PRIu64
" to %" PRIu64
"\n"),
2183 xfs_dir2_sf_put_parent_ino(&sfp
->hdr
, parent
);
2190 * no '.' entry in shortform dirs, just bump up ref count by 1
2191 * '..' was already (or will be) accounted for and checked when
2192 * the directory is reached or will be taken care of when the
2193 * directory is moved to orphanage.
2195 add_inode_ref(current_irec
, current_ino_offset
);
2198 * Initialise i8 counter -- the parent inode number counts as well.
2200 i8
= xfs_dir2_sf_get_parent_ino(&sfp
->hdr
) > XFS_DIR2_MAX_SHORT_INUM
;
2203 * now run through entries, stop at first bad entry, don't need
2204 * to skip over '..' since that's encoded in its own field and
2205 * no need to worry about '.' since it doesn't exist.
2207 sfep
= next_sfep
= xfs_dir2_sf_firstentry(&sfp
->hdr
);
2209 for (i
= 0; i
< sfp
->hdr
.count
&& max_size
>
2210 (__psint_t
)next_sfep
- (__psint_t
)sfp
;
2211 sfep
= next_sfep
, i
++) {
2216 lino
= xfs_dir2_sfe_get_ino(&sfp
->hdr
, sfep
);
2218 namelen
= sfep
->namelen
;
2220 ASSERT(no_modify
|| namelen
> 0);
2222 if (no_modify
&& namelen
== 0) {
2224 * if we're really lucky, this is
2225 * the last entry in which case we
2226 * can use the dir size to set the
2227 * namelen value. otherwise, forget
2228 * it because we're not going to be
2229 * able to find the next entry.
2233 if (i
== sfp
->hdr
.count
- 1) {
2234 namelen
= ip
->i_d
.di_size
-
2235 ((__psint_t
) &sfep
->name
[0] -
2239 * don't process the rest of the directory,
2240 * break out of processing loop
2244 } else if (no_modify
&& (__psint_t
) sfep
- (__psint_t
) sfp
+
2245 + xfs_dir2_sf_entsize(&sfp
->hdr
, sfep
->namelen
)
2246 > ip
->i_d
.di_size
) {
2249 if (i
== sfp
->hdr
.count
- 1) {
2250 namelen
= ip
->i_d
.di_size
-
2251 ((__psint_t
) &sfep
->name
[0] -
2255 * don't process the rest of the directory,
2256 * break out of processing loop
2262 memmove(fname
, sfep
->name
, sfep
->namelen
);
2263 fname
[sfep
->namelen
] = '\0';
2265 ASSERT(no_modify
|| (lino
!= NULLFSINO
&& lino
!= 0));
2266 ASSERT(no_modify
|| !verify_inum(mp
, lino
));
2269 * Also skip entries with bogus inode numbers if we're
2270 * in no modify mode.
2273 if (no_modify
&& verify_inum(mp
, lino
)) {
2274 next_sfep
= (xfs_dir2_sf_entry_t
*)((__psint_t
)sfep
+
2275 xfs_dir2_sf_entsize(&sfp
->hdr
, sfep
->namelen
));
2279 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
, lino
),
2280 XFS_INO_TO_AGINO(mp
, lino
));
2284 _("entry \"%s\" in shortform directory %" PRIu64
" references non-existent inode %" PRIu64
"\n"),
2289 ino_offset
= XFS_INO_TO_AGINO(mp
, lino
) - irec
->ino_startnum
;
2292 * if it's a free inode, blow out the entry.
2293 * by now, any inode that we think is free
2296 if (is_inode_free(irec
, ino_offset
)) {
2298 _("entry \"%s\" in shortform directory inode %" PRIu64
" points to free inode %" PRIu64
"\n"),
2303 * check if this inode is lost+found dir in the root
2305 if (ino
== mp
->m_sb
.sb_rootino
&& strcmp(fname
, ORPHANAGE
) == 0) {
2307 * if it's not a directory, trash it
2309 if (!inode_isadir(irec
, ino_offset
)) {
2311 _("%s (ino %" PRIu64
") in root (%" PRIu64
") is not a directory"),
2312 ORPHANAGE
, lino
, ino
);
2316 * if this is a dup, it will be picked up below,
2317 * otherwise, mark it as the orphanage for later.
2320 orphanage_ino
= lino
;
2323 * check for duplicate names in directory.
2325 if (!dir_hash_add(mp
, hashtab
, (xfs_dir2_dataptr_t
)
2326 (sfep
- xfs_dir2_sf_firstentry(&sfp
->hdr
)),
2327 lino
, sfep
->namelen
, sfep
->name
)) {
2329 _("entry \"%s\" (ino %" PRIu64
") in dir %" PRIu64
" is a duplicate name"),
2334 if (!inode_isadir(irec
, ino_offset
)) {
2336 * check easy case first, regular inode, just bump
2339 add_inode_reached(irec
, ino_offset
);
2341 parent
= get_inode_parent(irec
, ino_offset
);
2344 * bump up the link counts in parent and child.
2345 * directory but if the link doesn't agree with
2346 * the .. in the child, blow out the entry
2348 if (is_inode_reached(irec
, ino_offset
)) {
2351 _("entry \"%s\" in directory inode %" PRIu64
2352 " references already connected inode %" PRIu64
".\n"),
2354 } else if (parent
== ino
) {
2355 add_inode_reached(irec
, ino_offset
);
2356 add_inode_ref(current_irec
, current_ino_offset
);
2357 } else if (parent
== NULLFSINO
) {
2358 /* ".." was missing, but this entry refers to it,
2359 so, set it as the parent and mark for rebuild */
2361 _("entry \"%s\" in dir ino %" PRIu64
" doesn't have a .. entry, will set it in ino %" PRIu64
".\n"),
2363 set_inode_parent(irec
, ino_offset
, ino
);
2364 add_inode_reached(irec
, ino_offset
);
2365 add_inode_ref(current_irec
, current_ino_offset
);
2366 add_dotdot_update(XFS_INO_TO_AGNO(mp
, lino
),
2371 _("entry \"%s\" in directory inode %" PRIu64
2372 " not consistent with .. value (%" PRIu64
2373 ") in inode %" PRIu64
",\n"),
2374 fname
, ino
, parent
, lino
);
2380 if (lino
== orphanage_ino
)
2383 tmp_elen
= xfs_dir2_sf_entsize(&sfp
->hdr
,
2385 tmp_sfep
= (xfs_dir2_sf_entry_t
*)
2386 ((__psint_t
) sfep
+ tmp_elen
);
2387 tmp_len
= max_size
- ((__psint_t
) tmp_sfep
2389 max_size
-= tmp_elen
;
2390 bytes_deleted
+= tmp_elen
;
2392 memmove(sfep
, tmp_sfep
, tmp_len
);
2394 sfp
->hdr
.count
-= 1;
2395 memset((void *)((__psint_t
)sfep
+ tmp_len
), 0,
2399 * set the tmp value to the current
2400 * pointer so we'll process the entry
2406 * WARNING: drop the index i by one
2407 * so it matches the decremented count for
2408 * accurate comparisons in the loop test
2415 do_warn(_("junking entry\n"));
2419 do_warn(_("would junk entry\n"));
2421 } else if (lino
> XFS_DIR2_MAX_SHORT_INUM
)
2425 * go onto next entry unless we've just junked an
2426 * entry in which the current entry pointer points
2427 * to an unprocessed entry. have to take into entries
2428 * with bad namelen into account in no modify mode since we
2429 * calculate size based on next_sfep.
2431 ASSERT(no_modify
|| bad_sfnamelen
== 0);
2433 next_sfep
= (tmp_sfep
== NULL
)
2434 ? (xfs_dir2_sf_entry_t
*) ((__psint_t
) sfep
2436 ? xfs_dir2_sf_entsize(&sfp
->hdr
, sfep
->namelen
)
2437 : xfs_dir2_sf_entsize(&sfp
->hdr
, namelen
)))
2441 if (sfp
->hdr
.i8count
!= i8
) {
2443 do_warn(_("would fix i8count in inode %" PRIu64
"\n"),
2447 tmp_sfep
= next_sfep
;
2448 process_sf_dir2_fixi8(sfp
, &tmp_sfep
);
2450 (__psint_t
)next_sfep
-
2451 (__psint_t
)tmp_sfep
;
2452 next_sfep
= tmp_sfep
;
2454 sfp
->hdr
.i8count
= i8
;
2456 do_warn(_("fixing i8count in inode %" PRIu64
"\n"),
2462 * sync up sizes if required
2465 ASSERT(bytes_deleted
> 0);
2467 libxfs_idata_realloc(ip
, -bytes_deleted
, XFS_DATA_FORK
);
2468 ip
->i_d
.di_size
-= bytes_deleted
;
2471 if (ip
->i_d
.di_size
!= ip
->i_df
.if_bytes
) {
2472 ASSERT(ip
->i_df
.if_bytes
== (xfs_fsize_t
)
2473 ((__psint_t
) next_sfep
- (__psint_t
) sfp
));
2474 ip
->i_d
.di_size
= (xfs_fsize_t
)
2475 ((__psint_t
) next_sfep
- (__psint_t
) sfp
);
2477 _("setting size to %" PRId64
" bytes to reflect junked entries\n"),
2484 * processes all reachable inodes in directories
2489 xfs_agnumber_t agno
,
2490 ino_tree_node_t
*irec
,
2494 xfs_bmap_free_t flist
;
2495 xfs_fsblock_t first
;
2498 dir_hash_tab_t
*hashtab
;
2499 int need_dot
, committed
;
2500 int dirty
, num_illegal
, error
, nres
;
2502 ino
= XFS_AGINO_TO_INO(mp
, agno
, irec
->ino_startnum
+ ino_offset
);
2505 * open up directory inode, check all entries,
2506 * then call prune_dir_entries to remove all
2507 * remaining illegal directory entries.
2510 ASSERT(!is_inode_refchecked(irec
, ino_offset
) || dotdot_update
);
2512 error
= libxfs_iget(mp
, NULL
, ino
, 0, &ip
, 0);
2516 _("couldn't map inode %" PRIu64
", err = %d\n"),
2520 _("couldn't map inode %" PRIu64
", err = %d\n"),
2523 * see below for what we're doing if this
2524 * is root. Why do we need to do this here?
2525 * to ensure that the root doesn't show up
2526 * as being disconnected in the no_modify case.
2528 if (mp
->m_sb
.sb_rootino
== ino
) {
2529 add_inode_reached(irec
, 0);
2530 add_inode_ref(irec
, 0);
2534 add_inode_refchecked(irec
, 0);
2538 need_dot
= dirty
= num_illegal
= 0;
2540 if (mp
->m_sb
.sb_rootino
== ino
) {
2542 * mark root inode reached and bump up
2543 * link count for root inode to account
2544 * for '..' entry since the root inode is
2545 * never reached by a parent. we know
2546 * that root's '..' is always good --
2547 * guaranteed by phase 3 and/or below.
2549 add_inode_reached(irec
, ino_offset
);
2552 add_inode_refchecked(irec
, ino_offset
);
2554 hashtab
= dir_hash_init(ip
->i_d
.di_size
);
2557 * look for bogus entries
2559 switch (ip
->i_d
.di_format
) {
2560 case XFS_DINODE_FMT_EXTENTS
:
2561 case XFS_DINODE_FMT_BTREE
:
2563 * also check for missing '.' in longform dirs.
2564 * missing .. entries are added if required when
2565 * the directory is connected to lost+found. but
2566 * we need to create '.' entries here.
2568 longform_dir2_entry_check(mp
, ino
, ip
,
2569 &num_illegal
, &need_dot
,
2574 case XFS_DINODE_FMT_LOCAL
:
2575 tp
= libxfs_trans_alloc(mp
, 0);
2577 * using the remove reservation is overkill
2578 * since at most we'll only need to log the
2579 * inode but it's easier than wedging a
2580 * new define in ourselves.
2582 nres
= no_modify
? 0 : XFS_REMOVE_SPACE_RES(mp
);
2583 error
= libxfs_trans_reserve(tp
, nres
,
2584 XFS_REMOVE_LOG_RES(mp
), 0,
2585 XFS_TRANS_PERM_LOG_RES
,
2586 XFS_REMOVE_LOG_COUNT
);
2590 libxfs_trans_ijoin(tp
, ip
, 0);
2591 libxfs_trans_ihold(tp
, ip
);
2593 shortform_dir2_entry_check(mp
, ino
, ip
, &dirty
,
2597 ASSERT(dirty
== 0 || (dirty
&& !no_modify
));
2599 libxfs_trans_log_inode(tp
, ip
,
2600 XFS_ILOG_CORE
| XFS_ILOG_DDATA
);
2601 libxfs_trans_commit(tp
,
2602 XFS_TRANS_RELEASE_LOG_RES
|
2605 libxfs_trans_cancel(tp
,
2606 XFS_TRANS_RELEASE_LOG_RES
);
2613 dir_hash_done(hashtab
);
2616 * if we have to create a .. for /, do it now *before*
2617 * we delete the bogus entries, otherwise the directory
2618 * could transform into a shortform dir which would
2619 * probably cause the simulation to choke. Even
2620 * if the illegal entries get shifted around, it's ok
2621 * because the entries are structurally intact and in
2622 * in hash-value order so the simulation won't get confused
2623 * if it has to move them around.
2625 if (!no_modify
&& need_root_dotdot
&& ino
== mp
->m_sb
.sb_rootino
) {
2626 ASSERT(ip
->i_d
.di_format
!= XFS_DINODE_FMT_LOCAL
);
2628 do_warn(_("recreating root directory .. entry\n"));
2630 tp
= libxfs_trans_alloc(mp
, 0);
2633 nres
= XFS_MKDIR_SPACE_RES(mp
, 2);
2634 error
= libxfs_trans_reserve(tp
, nres
, XFS_MKDIR_LOG_RES(mp
),
2635 0, XFS_TRANS_PERM_LOG_RES
, XFS_MKDIR_LOG_COUNT
);
2639 libxfs_trans_ijoin(tp
, ip
, 0);
2640 libxfs_trans_ihold(tp
, ip
);
2642 xfs_bmap_init(&flist
, &first
);
2644 error
= libxfs_dir_createname(tp
, ip
, &xfs_name_dotdot
,
2645 ip
->i_ino
, &first
, &flist
, nres
);
2648 _("can't make \"..\" entry in root inode %" PRIu64
", createname error %d\n"), ino
, error
);
2650 libxfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
2652 error
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
2654 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
|
2657 need_root_dotdot
= 0;
2658 } else if (need_root_dotdot
&& ino
== mp
->m_sb
.sb_rootino
) {
2659 do_warn(_("would recreate root directory .. entry\n"));
2663 * if we need to create the '.' entry, do so only if
2664 * the directory is a longform dir. if it's been
2665 * turned into a shortform dir, then the inode is ok
2666 * since shortform dirs have no '.' entry and the inode
2667 * has already been committed by prune_lf_dir_entry().
2671 * bump up our link count but don't
2672 * bump up the inode link count. chances
2673 * are good that even though we lost '.'
2674 * the inode link counts reflect '.' so
2675 * leave the inode link count alone and if
2676 * it turns out to be wrong, we'll catch
2679 add_inode_ref(irec
, ino_offset
);
2683 _("would create missing \".\" entry in dir ino %" PRIu64
"\n"),
2685 } else if (ip
->i_d
.di_format
!= XFS_DINODE_FMT_LOCAL
) {
2687 * need to create . entry in longform dir.
2690 _("creating missing \".\" entry in dir ino %" PRIu64
"\n"), ino
);
2692 tp
= libxfs_trans_alloc(mp
, 0);
2695 nres
= XFS_MKDIR_SPACE_RES(mp
, 1);
2696 error
= libxfs_trans_reserve(tp
, nres
,
2697 XFS_MKDIR_LOG_RES(mp
),
2699 XFS_TRANS_PERM_LOG_RES
,
2700 XFS_MKDIR_LOG_COUNT
);
2705 libxfs_trans_ijoin(tp
, ip
, 0);
2706 libxfs_trans_ihold(tp
, ip
);
2708 xfs_bmap_init(&flist
, &first
);
2710 error
= libxfs_dir_createname(tp
, ip
, &xfs_name_dot
,
2711 ip
->i_ino
, &first
, &flist
, nres
);
2714 _("can't make \".\" entry in dir ino %" PRIu64
", createname error %d\n"),
2717 libxfs_trans_log_inode(tp
, ip
, XFS_ILOG_CORE
);
2719 error
= libxfs_bmap_finish(&tp
, &flist
, &committed
);
2721 libxfs_trans_commit(tp
, XFS_TRANS_RELEASE_LOG_RES
2729 * mark realtime bitmap and summary inodes as reached.
2730 * quota inode will be marked here as well
2733 mark_standalone_inodes(xfs_mount_t
*mp
)
2735 ino_tree_node_t
*irec
;
2738 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rbmino
),
2739 XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rbmino
));
2741 ASSERT(irec
!= NULL
);
2743 offset
= XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rbmino
) -
2746 add_inode_reached(irec
, offset
);
2748 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rsumino
),
2749 XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rsumino
));
2751 offset
= XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rsumino
) -
2754 ASSERT(irec
!= NULL
);
2756 add_inode_reached(irec
, offset
);
2759 if (mp
->m_sb
.sb_uquotino
2760 && mp
->m_sb
.sb_uquotino
!= NULLFSINO
) {
2761 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
,
2762 mp
->m_sb
.sb_uquotino
),
2763 XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_uquotino
));
2764 offset
= XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_uquotino
)
2765 - irec
->ino_startnum
;
2766 add_inode_reached(irec
, offset
);
2768 if (mp
->m_sb
.sb_gquotino
2769 && mp
->m_sb
.sb_gquotino
!= NULLFSINO
) {
2770 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
,
2771 mp
->m_sb
.sb_gquotino
),
2772 XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_gquotino
));
2773 offset
= XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_gquotino
)
2774 - irec
->ino_startnum
;
2775 add_inode_reached(irec
, offset
);
2781 check_for_orphaned_inodes(
2783 xfs_agnumber_t agno
,
2784 ino_tree_node_t
*irec
)
2789 for (i
= 0; i
< XFS_INODES_PER_CHUNK
; i
++) {
2790 ASSERT(is_inode_confirmed(irec
, i
));
2791 if (is_inode_free(irec
, i
))
2794 if (is_inode_reached(irec
, i
))
2797 ASSERT(inode_isadir(irec
, i
) ||
2798 num_inode_references(irec
, i
) == 0);
2800 ino
= XFS_AGINO_TO_INO(mp
, agno
, i
+ irec
->ino_startnum
);
2801 if (inode_isadir(irec
, i
))
2802 do_warn(_("disconnected dir inode %" PRIu64
", "), ino
);
2804 do_warn(_("disconnected inode %" PRIu64
", "), ino
);
2807 orphanage_ino
= mk_orphanage(mp
);
2808 do_warn(_("moving to %s\n"), ORPHANAGE
);
2809 mv_orphanage(mp
, ino
, inode_isadir(irec
, i
));
2811 do_warn(_("would move to %s\n"), ORPHANAGE
);
2814 * for read-only case, even though the inode isn't
2815 * really reachable, set the flag (and bump our link
2816 * count) anyway to fool phase 7
2818 add_inode_reached(irec
, i
);
2825 xfs_agnumber_t agno
,
2828 ino_tree_node_t
*irec
;
2830 prefetch_args_t
*pf_args
= arg
;
2832 wait_for_inode_prefetch(pf_args
);
2835 do_log(_(" - agno = %d\n"), agno
);
2837 for (irec
= findfirst_inode_rec(agno
); irec
; irec
= next_ino_rec(irec
)) {
2838 if (irec
->ino_isa_dir
== 0)
2842 sem_post(&pf_args
->ra_count
);
2844 for (i
= 0; i
< XFS_INODES_PER_CHUNK
; i
++) {
2845 if (inode_isadir(irec
, i
))
2846 process_dir_inode(wq
->mp
, agno
, irec
, i
);
2849 cleanup_inode_prefetch(pf_args
);
2853 update_missing_dotdot_entries(
2856 dotdot_update_t
*dir
;
2859 * these entries parents were updated, rebuild them again
2860 * set dotdot_update flag so processing routines do not count links
2863 while (dotdot_update_list
) {
2864 dir
= dotdot_update_list
;
2865 dotdot_update_list
= dir
->next
;
2866 process_dir_inode(mp
, dir
->agno
, dir
->irec
, dir
->ino_offset
);
2877 prefetch_args_t
*pf_args
[2];
2880 * we always do prefetch for phase 6 as it will fill in the gaps
2881 * not read during phase 3 prefetch.
2884 pf_args
[0] = start_inode_prefetch(0, 1, NULL
);
2885 for (i
= 0; i
< glob_agcount
; i
++) {
2886 pf_args
[(~i
) & 1] = start_inode_prefetch(i
+ 1, 1,
2888 traverse_function(&queue
, i
, pf_args
[i
& 1]);
2893 phase6(xfs_mount_t
*mp
)
2895 ino_tree_node_t
*irec
;
2898 memset(&zerocr
, 0, sizeof(struct cred
));
2899 memset(&zerofsx
, 0, sizeof(struct fsxattr
));
2902 do_log(_("Phase 6 - check inode connectivity...\n"));
2904 incore_ext_teardown(mp
);
2906 add_ino_ex_data(mp
);
2909 * verify existence of root directory - if we have to
2910 * make one, it's ok for the incore data structs not to
2911 * know about it since everything about it (and the other
2912 * inodes in its chunk if a new chunk was created) are ok
2914 if (need_root_inode
) {
2916 do_warn(_("reinitializing root directory\n"));
2918 need_root_inode
= 0;
2919 need_root_dotdot
= 0;
2921 do_warn(_("would reinitialize root directory\n"));
2927 do_warn(_("reinitializing realtime bitmap inode\n"));
2931 do_warn(_("would reinitialize realtime bitmap inode\n"));
2937 do_warn(_("reinitializing realtime summary inode\n"));
2941 do_warn(_("would reinitialize realtime summary inode\n"));
2947 _(" - resetting contents of realtime bitmap and summary inodes\n"));
2948 if (fill_rbmino(mp
)) {
2950 _("Warning: realtime bitmap may be inconsistent\n"));
2953 if (fill_rsumino(mp
)) {
2955 _("Warning: realtime bitmap may be inconsistent\n"));
2959 mark_standalone_inodes(mp
);
2961 do_log(_(" - traversing filesystem ...\n"));
2963 irec
= find_inode_rec(mp
, XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rootino
),
2964 XFS_INO_TO_AGINO(mp
, mp
->m_sb
.sb_rootino
));
2967 * we always have a root inode, even if it's free...
2968 * if the root is free, forget it, lost+found is already gone
2970 if (is_inode_free(irec
, 0) || !inode_isadir(irec
, 0)) {
2971 need_root_inode
= 1;
2975 * then process all inodes by walking incore inode tree
2980 * any directories that had updated ".." entries, rebuild them now
2982 update_missing_dotdot_entries(mp
);
2984 do_log(_(" - traversal finished ...\n"));
2985 do_log(_(" - moving disconnected inodes to %s ...\n"),
2989 * move all disconnected inodes to the orphanage
2991 for (i
= 0; i
< glob_agcount
; i
++) {
2992 irec
= findfirst_inode_rec(i
);
2993 while (irec
!= NULL
) {
2994 check_for_orphaned_inodes(mp
, i
, irec
);
2995 irec
= next_ino_rec(irec
);