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: San Mehat <san@google.com>
This commit is contained in:
San Mehat 2009-07-16 09:34:53 -07:00
parent b6e70d8778
commit d8221d9869
1 changed files with 48 additions and 21 deletions

View File

@ -51,28 +51,40 @@ int vfat_check(blkdev_t *dev)
return 0;
}
char *args[5];
args[0] = FSCK_MSDOS_PATH;
args[1] = "-p";
args[2] = "-f";
args[3] = blkdev_get_devpath(dev);
args[4] = NULL;
rc = logwrap(4, args, 1);
free(args[3]);
int pass = 1;
do {
char *args[5];
args[0] = FSCK_MSDOS_PATH;
args[1] = "-p";
args[2] = "-f";
args[3] = blkdev_get_devpath(dev);
args[4] = NULL;
rc = logwrap(4, args, 1);
free(args[3]);
if (rc == 0) {
LOG_VOL("Filesystem check completed OK");
return 0;
} else if (rc == 2) {
LOG_VOL("Filesystem check failed (not a FAT filesystem)");
return -ENODATA;
} else if (rc == -11) {
LOG_VOL("Filesystem check crashed");
return -EIO;
} else {
LOG_VOL("Filesystem check failed (unknown exit code %d)", rc);
return -EIO;
}
if (rc == 0) {
LOG_VOL("Filesystem check completed OK");
return 0;
} 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;
} else {
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);