Skip to content

Commit 5dc5bfe

Browse files
author
Ken Sumrall
committed
Mount/unmount filesystems before running e2fsck
This works around a performance problem in the firmware of some emmc chips. Change-Id: Ia414b4604d11e47ce9cb3f86ac82602e081bb09e
1 parent 55b763f commit 5dc5bfe

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

fs_mgr/fs_mgr.c

+24-3
Original file line numberDiff line numberDiff line change
@@ -358,13 +358,34 @@ static void free_fstab(struct fstab_rec *fstab)
358358
free(fstab);
359359
}
360360

361-
static void check_fs(char *blk_dev, char *type)
361+
static void check_fs(char *blk_dev, char *type, char *target)
362362
{
363363
pid_t pid;
364364
int status;
365+
int ret;
366+
long tmpmnt_flags = MS_NOATIME | MS_NOEXEC | MS_NOSUID;
367+
char *tmpmnt_opts = "nomblk_io_submit,errors=remount-ro";
365368

366369
/* Check for the types of filesystems we know how to check */
367370
if (!strcmp(type, "ext2") || !strcmp(type, "ext3") || !strcmp(type, "ext4")) {
371+
/*
372+
* First try to mount and unmount the filesystem. We do this because
373+
* the kernel is more efficient than e2fsck in running the journal and
374+
* processing orphaned inodes, and on at least one device with a
375+
* performance issue in the emmc firmware, it can take e2fsck 2.5 minutes
376+
* to do what the kernel does in about a second.
377+
*
378+
* After mounting and unmounting the filesystem, run e2fsck, and if an
379+
* error is recorded in the filesystem superblock, e2fsck will do a full
380+
* check. Otherwise, it does nothing. If the kernel cannot mount the
381+
* filesytsem due to an error, e2fsck is still run to do a full check
382+
* fix the filesystem.
383+
*/
384+
ret = mount(blk_dev, target, type, tmpmnt_flags, tmpmnt_opts);
385+
if (! ret) {
386+
umount(target);
387+
}
388+
368389
INFO("Running %s on %s\n", E2FSCK_BIN, blk_dev);
369390
pid = fork();
370391
if (pid > 0) {
@@ -434,7 +455,7 @@ int fs_mgr_mount_all(char *fstab_file)
434455
}
435456

436457
if (fstab[i].fs_mgr_flags & MF_CHECK) {
437-
check_fs(fstab[i].blk_dev, fstab[i].type);
458+
check_fs(fstab[i].blk_dev, fstab[i].type, fstab[i].mnt_point);
438459
}
439460

440461
mret = mount(fstab[i].blk_dev, fstab[i].mnt_point, fstab[i].type,
@@ -500,7 +521,7 @@ int fs_mgr_do_mount(char *fstab_file, char *n_name, char *n_blk_dev, char *tmp_m
500521
}
501522

502523
if (fstab[i].fs_mgr_flags & MF_CHECK) {
503-
check_fs(fstab[i].blk_dev, fstab[i].type);
524+
check_fs(fstab[i].blk_dev, fstab[i].type, fstab[i].mnt_point);
504525
}
505526

506527
/* Now mount it where requested */

0 commit comments

Comments
 (0)