Skip to content
Snippets Groups Projects
Commit d8221d98 authored by San Mehat's avatar San Mehat
Browse files

vold: vfat: Run up to 3 passes of the disk checker when the checker

indicates the FS has been modified. Also create LOST.DIR if it doesn't
exist on mount.

Signed-off-by: default avatarSan Mehat <san@google.com>
parent b6e70d87
No related branches found
No related tags found
No related merge requests found
......@@ -51,6 +51,8 @@ int vfat_check(blkdev_t *dev)
return 0;
}
int pass = 1;
do {
char *args[5];
args[0] = FSCK_MSDOS_PATH;
args[1] = "-p";
......@@ -66,6 +68,15 @@ int vfat_check(blkdev_t *dev)
} else if (rc == 2) {
LOG_VOL("Filesystem check failed (not a FAT filesystem)");
return -ENODATA;
} else if (rc == 4) {
if (pass++ <= 3) {
LOG_VOL("Filesystem modified - rechecking (pass %d)",
pass);
continue;
} else {
LOG_VOL("Failing check after too many rechecks");
return -EIO;
}
} else if (rc == -11) {
LOG_VOL("Filesystem check crashed");
return -EIO;
......@@ -73,6 +84,7 @@ int vfat_check(blkdev_t *dev)
LOG_VOL("Filesystem check failed (unknown exit code %d)", rc);
return -EIO;
}
} while (0);
return 0;
}
......@@ -113,6 +125,21 @@ int vfat_mount(blkdev_t *dev, volume_t *vol, boolean safe_mode)
"utf8,uid=1000,gid=1015,fmask=702,dmask=702,shortname=mixed");
}
if (rc == 0) {
char *lost_path;
asprintf(&lost_path, "%s/LOST.DIR", vol->mount_point);
if (access(lost_path, F_OK)) {
/*
* Create a LOST.DIR in the root so we have somewhere to put
* lost cluster chains (fsck_msdos doesn't currently do this)
*/
if (mkdir(lost_path, 0755)) {
LOGE("Unable to create LOST.DIR (%s)", strerror(errno));
}
}
free(lost_path);
}
#if VFAT_DEBUG
LOG_VOL("vfat_mount(%s, %d:%d): mount rc = %d", dev->major,k dev->minor,
vol->mount_point, rc);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment