diff options
| author | Zhihao Cheng <chengzhihao1@huawei.com> | 2024-11-11 17:07:58 +0800 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2024-11-11 10:32:46 +0100 | 
| commit | 0fbfbf59714b73a0d0c487c454c22d72b2c78e68 (patch) | |
| tree | 30912f1d80c466390f24fc8cc9f39b3a7d829c27 /ubifs-utils | |
| parent | 585047e6c4136a474f3ff22a0e9e839cc6ede75d (diff) | |
fsck.ubifs: Consolidate log
This is the 4/18 step of fsck. Consolidate log to ensure enough space
in log area. There could be following possible errors:
 1. corrupted scanning data in log area: danger mode with rebuild_fs and
    normal mode with 'yes' answer will turn to rebuild filesystem, other
    modes will exit.
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'ubifs-utils')
| -rw-r--r-- | ubifs-utils/fsck.ubifs/fsck.ubifs.c | 1 | ||||
| -rw-r--r-- | ubifs-utils/fsck.ubifs/load_fs.c | 26 | ||||
| -rw-r--r-- | ubifs-utils/libubifs/log.c | 1 | 
3 files changed, 28 insertions, 0 deletions
| diff --git a/ubifs-utils/fsck.ubifs/fsck.ubifs.c b/ubifs-utils/fsck.ubifs/fsck.ubifs.c index 31c2aa6..83c8a2c 100644 --- a/ubifs-utils/fsck.ubifs/fsck.ubifs.c +++ b/ubifs-utils/fsck.ubifs/fsck.ubifs.c @@ -433,6 +433,7 @@ int main(int argc, char *argv[])  	 * Step 1: Read master & init lpt  	 * Step 2: Replay journal  	 * Step 3: Handle orphan nodes +	 * Step 4: Consolidate log  	 */  	err = ubifs_load_filesystem(c);  	if (err) { diff --git a/ubifs-utils/fsck.ubifs/load_fs.c b/ubifs-utils/fsck.ubifs/load_fs.c index f376383..42b1afa 100644 --- a/ubifs-utils/fsck.ubifs/load_fs.c +++ b/ubifs-utils/fsck.ubifs/load_fs.c @@ -199,6 +199,32 @@ int ubifs_load_filesystem(struct ubifs_info *c)  		goto out_orphans;  	} +	if (!c->ro_mount) { +		int lnum; + +		/* Check for enough log space */ +		lnum = c->lhead_lnum + 1; +		if (lnum >= UBIFS_LOG_LNUM + c->log_lebs) +			lnum = UBIFS_LOG_LNUM; +		if (lnum == c->ltail_lnum) { +			log_out(c, "Consolidate log"); +			err = ubifs_consolidate_log(c); +			if (err) { +				unsigned int reason = get_failure_reason_callback(c); + +				clear_failure_reason_callback(c); +				if (reason & FR_DATA_CORRUPTED) { +					if (fix_problem(c, LOG_CORRUPTED, NULL)) +						FSCK(c)->try_rebuild = true; +				} else { +					ubifs_assert(c, reason == 0); +					exit_code |= FSCK_ERROR; +				} +				goto out_orphans; +			} +		} +	} +  	c->mounting = 0;  	return 0; diff --git a/ubifs-utils/libubifs/log.c b/ubifs-utils/libubifs/log.c index 0d45926..c3dfd98 100644 --- a/ubifs-utils/libubifs/log.c +++ b/ubifs-utils/libubifs/log.c @@ -711,6 +711,7 @@ int ubifs_consolidate_log(struct ubifs_info *c)  	destroy_done_tree(&done_tree);  	vfree(buf);  	if (write_lnum == c->lhead_lnum) { +		set_failure_reason_callback(c, FR_DATA_CORRUPTED);  		ubifs_err(c, "log is too full");  		return -EINVAL;  	} | 
