]>
git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - repair/phase3.c
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
15 #include "err_protos.h"
31 bp
= libxfs_readbuf(mp
->m_dev
,
32 XFS_AG_DADDR(mp
, agno
, XFS_AGI_DADDR(mp
)),
33 mp
->m_sb
.sb_sectsize
/BBSIZE
, 0, &xfs_agi_buf_ops
);
35 do_error(_("cannot read agi block %" PRId64
" for ag %u\n"),
36 XFS_AG_DADDR(mp
, agno
, XFS_AGI_DADDR(mp
)), agno
);
38 agip
= XFS_BUF_TO_AGI(bp
);
40 ASSERT(be32_to_cpu(agip
->agi_seqno
) == agno
);
42 for (i
= 0; i
< XFS_AGI_UNLINKED_BUCKETS
; i
++) {
43 if (agip
->agi_unlinked
[i
] != cpu_to_be32(NULLAGINO
)) {
44 agip
->agi_unlinked
[i
] = cpu_to_be32(NULLAGINO
);
50 libxfs_writebuf(bp
, 0);
62 * turn on directory processing (inode discovery) and
63 * attribute processing (extra_attr_check)
65 wait_for_inode_prefetch(arg
);
66 do_log(_(" - agno = %d\n"), agno
);
67 process_aginodes(wq
->wq_ctx
, arg
, agno
, 1, 0, 1);
69 cleanup_inode_prefetch(arg
);
76 do_inode_prefetch(mp
, ag_stride
, process_ag_func
, false, false);
80 do_uncertain_aginodes(
87 *count
= process_uncertain_aginodes(wq
->wq_ctx
, agno
);
91 "\t\t phase 3 - ag %d process_uncertain_inodes returns %d\n",
95 PROG_RPT_INC(prog_rpt_done
[agno
], 1);
100 struct xfs_mount
*mp
,
107 do_log(_("Phase 3 - for each AG...\n"));
109 do_log(_(" - scan and clear agi unlinked lists...\n"));
111 do_log(_(" - scan (but don't clear) agi unlinked lists...\n"));
113 set_progress_msg(PROG_FMT_AGI_UNLINKED
, (uint64_t) glob_agcount
);
115 /* first clear the agi unlinked AGI list */
117 for (i
= 0; i
< mp
->m_sb
.sb_agcount
; i
++)
118 process_agi_unlinked(mp
, i
);
121 /* now look at possibly bogus inodes */
122 for (i
= 0; i
< mp
->m_sb
.sb_agcount
; i
++) {
123 check_uncertain_aginodes(mp
, i
);
124 PROG_RPT_INC(prog_rpt_done
[i
], 1);
128 /* ok, now that the tree's ok, let's take a good look */
131 " - process known inodes and perform inode discovery...\n"));
133 set_progress_msg(PROG_FMT_PROCESS_INO
, (uint64_t) mp
->m_sb
.sb_icount
);
140 * process newly discovered inode chunks
142 do_log(_(" - process newly discovered inodes...\n"));
143 set_progress_msg(PROG_FMT_NEW_INODES
, (uint64_t) glob_agcount
);
145 counts
= calloc(sizeof(*counts
), mp
->m_sb
.sb_agcount
);
147 do_abort(_("no memory for uncertain inode counts\n"));
153 * have to loop until no ag has any uncertain
157 memset(counts
, 0, mp
->m_sb
.sb_agcount
* sizeof(*counts
));
159 create_work_queue(&wq
, mp
, scan_threads
);
161 for (i
= 0; i
< mp
->m_sb
.sb_agcount
; i
++)
162 queue_work(&wq
, do_uncertain_aginodes
, i
, &counts
[i
]);
164 destroy_work_queue(&wq
);
166 /* tally up the counts */
167 for (i
= 0; i
< mp
->m_sb
.sb_agcount
; i
++)