mirror of https://github.com/vitalif/e2fsprogs
e2fsck: check for an encrypted lost+found directory
The /lost+found directory must not be encrypted, since e2fsck won't have any keys. If we find an encrypted lost+found directory, we should delete the directory and recreate it. Signed-off-by: Theodore Ts'o <tytso@mit.edu>debian
parent
b97bccecfe
commit
4ecd63d786
|
@ -100,7 +100,8 @@ void e2fsck_pass3(e2fsck_t ctx)
|
||||||
|
|
||||||
iter = e2fsck_dir_info_iter_begin(ctx);
|
iter = e2fsck_dir_info_iter_begin(ctx);
|
||||||
while ((dir = e2fsck_dir_info_iter(ctx, iter)) != 0) {
|
while ((dir = e2fsck_dir_info_iter(ctx, iter)) != 0) {
|
||||||
if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
|
if (ctx->flags & E2F_FLAG_SIGNAL_MASK ||
|
||||||
|
ctx->flags & E2F_FLAG_RESTART)
|
||||||
goto abort_exit;
|
goto abort_exit;
|
||||||
if (ctx->progress && (ctx->progress)(ctx, 3, count++, maxdirs))
|
if (ctx->progress && (ctx->progress)(ctx, 3, count++, maxdirs))
|
||||||
goto abort_exit;
|
goto abort_exit;
|
||||||
|
@ -415,6 +416,12 @@ ext2_ino_t e2fsck_get_lost_and_found(e2fsck_t ctx, int fix)
|
||||||
goto unlink;
|
goto unlink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fix && (inode.i_flags & EXT4_ENCRYPT_FL)) {
|
||||||
|
if (!fix_problem(ctx, PR_3_LPF_ENCRYPTED, &pctx))
|
||||||
|
return 0;
|
||||||
|
goto unlink;
|
||||||
|
}
|
||||||
|
|
||||||
if (ext2fs_check_directory(fs, ino) == 0) {
|
if (ext2fs_check_directory(fs, ino) == 0) {
|
||||||
ctx->lost_and_found = ino;
|
ctx->lost_and_found = ino;
|
||||||
return ino;
|
return ino;
|
||||||
|
@ -437,6 +444,15 @@ unlink:
|
||||||
}
|
}
|
||||||
(void) e2fsck_dir_info_set_parent(ctx, ino, 0);
|
(void) e2fsck_dir_info_set_parent(ctx, ino, 0);
|
||||||
e2fsck_adjust_inode_count(ctx, ino, -1);
|
e2fsck_adjust_inode_count(ctx, ino, -1);
|
||||||
|
/*
|
||||||
|
* If the old lost+found was a directory, we've just
|
||||||
|
* disconnected it from the directory tree, which
|
||||||
|
* means we need to restart the directory tree scan.
|
||||||
|
* The simplest way to do this is restart the whole
|
||||||
|
* e2fsck operation.
|
||||||
|
*/
|
||||||
|
if (LINUX_S_ISDIR(inode.i_mode))
|
||||||
|
ctx->flags |= E2F_FLAG_RESTART;
|
||||||
} else if (retval != EXT2_ET_FILE_NOT_FOUND) {
|
} else if (retval != EXT2_ET_FILE_NOT_FOUND) {
|
||||||
pctx.errcode = retval;
|
pctx.errcode = retval;
|
||||||
fix_problem(ctx, PR_3_ERR_FIND_LPF, &pctx);
|
fix_problem(ctx, PR_3_ERR_FIND_LPF, &pctx);
|
||||||
|
|
|
@ -1750,6 +1750,11 @@ static struct e2fsck_problem problem_table[] = {
|
||||||
N_("Insufficient space to recover lost files!\nMove data off the @f and re-run e2fsck.\n\n"),
|
N_("Insufficient space to recover lost files!\nMove data off the @f and re-run e2fsck.\n\n"),
|
||||||
PROMPT_NONE, 0 },
|
PROMPT_NONE, 0 },
|
||||||
|
|
||||||
|
/* Lost+found is encrypted */
|
||||||
|
{ PR_3_LPF_ENCRYPTED,
|
||||||
|
N_("/@l is encrypted\n"),
|
||||||
|
PROMPT_CLEAR, 0 },
|
||||||
|
|
||||||
/* Pass 3A Directory Optimization */
|
/* Pass 3A Directory Optimization */
|
||||||
|
|
||||||
/* Pass 3A: Optimizing directories */
|
/* Pass 3A: Optimizing directories */
|
||||||
|
|
|
@ -1048,6 +1048,9 @@ struct problem_context {
|
||||||
/* Insufficient space to recover lost files */
|
/* Insufficient space to recover lost files */
|
||||||
#define PR_3_NO_SPACE_TO_RECOVER 0x03001A
|
#define PR_3_NO_SPACE_TO_RECOVER 0x03001A
|
||||||
|
|
||||||
|
/* Lost+found is encrypted */
|
||||||
|
#define PR_3_LPF_ENCRYPTED 0x03001B
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pass 3a --- rehashing diretories
|
* Pass 3a --- rehashing diretories
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
Pass 1: Checking inodes, blocks, and sizes
|
||||||
|
Pass 2: Checking directory structure
|
||||||
|
Pass 3: Checking directory connectivity
|
||||||
|
Unconnected directory inode 12 (/???)
|
||||||
|
Connect to /lost+found? yes
|
||||||
|
|
||||||
|
/lost+found is encrypted
|
||||||
|
Clear? yes
|
||||||
|
|
||||||
|
/lost+found not found. Create? yes
|
||||||
|
|
||||||
|
Restarting e2fsck from the beginning...
|
||||||
|
Pass 1: Checking inodes, blocks, and sizes
|
||||||
|
Pass 2: Checking directory structure
|
||||||
|
Pass 3: Checking directory connectivity
|
||||||
|
Unconnected directory inode 11 (/???)
|
||||||
|
Connect to /lost+found? yes
|
||||||
|
|
||||||
|
Pass 3A: Optimizing directories
|
||||||
|
Pass 4: Checking reference counts
|
||||||
|
Inode 12 ref count is 3, should be 2. Fix? yes
|
||||||
|
|
||||||
|
Pass 5: Checking group summary information
|
||||||
|
|
||||||
|
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
|
||||||
|
test_filesys: 13/64 files (0.0% non-contiguous), 13/100 blocks
|
||||||
|
Exit status is 1
|
|
@ -0,0 +1,7 @@
|
||||||
|
Pass 1: Checking inodes, blocks, and sizes
|
||||||
|
Pass 2: Checking directory structure
|
||||||
|
Pass 3: Checking directory connectivity
|
||||||
|
Pass 4: Checking reference counts
|
||||||
|
Pass 5: Checking group summary information
|
||||||
|
test_filesys: 13/64 files (0.0% non-contiguous), 13/100 blocks
|
||||||
|
Exit status is 0
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
encrypted lost+found directory
|
Loading…
Reference in New Issue