diff options
author | Zhihao Cheng <chengzhihao1@huawei.com> | 2024-11-11 17:08:05 +0800 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2024-11-11 10:32:46 +0100 |
commit | a251dd9c71006c66a02064210ae103ed7ac59444 (patch) | |
tree | 6417b927c425c7c1e8bd8573a5a9e506036f1cd5 /ubifs-utils/fsck.ubifs/extract_files.c | |
parent | c5ca3893ea854e8d8b5916bc492db8523db70122 (diff) |
fsck.ubifs: Check and handle unreachable files
This is the 9/18 step of fsck. Check and handle unreachable files, the
checking rule is same as rebuild mode which has been implemented in
file_is_reachable, but the methods of handling are different:
1. Move unreachable regular file into disconnected list, let subsequent
steps to handle them with lost+found.
2. Delete unreachable non-regular file.
3. Delete unreachable directory entries.
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'ubifs-utils/fsck.ubifs/extract_files.c')
-rw-r--r-- | ubifs-utils/fsck.ubifs/extract_files.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/ubifs-utils/fsck.ubifs/extract_files.c b/ubifs-utils/fsck.ubifs/extract_files.c index 51b83b8..b24445b 100644 --- a/ubifs-utils/fsck.ubifs/extract_files.c +++ b/ubifs-utils/fsck.ubifs/extract_files.c @@ -1247,6 +1247,15 @@ retry: dent_node = list_entry(path_list.next, struct scanned_dent_node, list); + handle_invalid_file(c, DENTRY_IS_UNREACHABLE, + dent_node->file, dent_node); + if (FSCK(c)->mode != REBUILD_MODE) { + int err = delete_node(c, &dent_node->key, + dent_node->header.lnum, + dent_node->header.offs); + if (err) + return err; + } dbg_fsck("remove unreachable dentry %s, in %s", c->encrypted && !file->ino.is_xattr ? "<encrypted>" : dent_node->name, c->dev_name); @@ -1260,6 +1269,10 @@ retry: } if (!rb_first(&file->dent_nodes)) { + if (S_ISREG(file->ino.mode)) + handle_invalid_file(c, FILE_IS_DISCONNECTED, file, NULL); + else + handle_invalid_file(c, FILE_HAS_NO_DENT, file, NULL); dbg_fsck("file %lu is unreachable, in %s", file->inum, c->dev_name); return false; } |