vold: If a filesystem is read/only then restart the fscheck but don't make any changes

Signed-off-by: San Mehat <san@google.com>
This commit is contained in:
San Mehat 2009-05-18 09:55:21 -07:00
parent 414ff7d98a
commit 7edc4f9454
1 changed files with 45 additions and 40 deletions

View File

@ -39,6 +39,7 @@ int vfat_identify(blkdev_t *dev)
int vfat_check(blkdev_t *dev)
{
int rc;
boolean rw = true;
#if VFAT_DEBUG
LOG_VOL("vfat_check(%d:%d):", dev->major, dev->minor);
@ -50,47 +51,51 @@ int vfat_check(blkdev_t *dev)
return 0;
}
#ifdef VERIFY_PASS
char *args[7];
args[0] = FSCK_MSDOS_PATH;
args[1] = "-v";
args[2] = "-V";
args[3] = "-w";
args[4] = "-p";
args[5] = blkdev_get_devpath(dev);
args[6] = NULL;
rc = logwrap(6, args);
free(args[5]);
#else
char *args[6];
args[0] = FSCK_MSDOS_PATH;
args[1] = "-v";
args[2] = "-w";
args[3] = "-p";
args[4] = blkdev_get_devpath(dev);
args[5] = NULL;
rc = logwrap(5, args);
free(args[4]);
#endif
do {
char *args[6];
args[0] = FSCK_MSDOS_PATH;
args[1] = "-v";
if (rw) {
args[2] = "-w";
args[3] = "-p";
args[4] = blkdev_get_devpath(dev);
args[5] = NULL;
rc = logwrap(5, args);
free(args[4]);
} else {
args[2] = "-n";
args[3] = blkdev_get_devpath(dev);
args[4] = NULL;
rc = logwrap(4, args);
free(args[3]);
}
if (rc == 0) {
LOG_VOL("Filesystem check completed OK");
return 0;
} else if (rc == 1) {
LOG_VOL("Filesystem check failed (general failure)");
return -EINVAL;
} else if (rc == 2) {
LOG_VOL("Filesystem check failed (invalid usage)");
return -EIO;
} else if (rc == 4) {
LOG_VOL("Filesystem check completed (errors fixed)");
} else if (rc == 6) {
LOG_VOL("Filesystem read-only - retrying check RO");
rw = false;
continue;
} else if (rc == 8) {
LOG_VOL("Filesystem check failed (not a FAT filesystem)");
return -ENODATA;
} else {
LOG_VOL("Filesystem check failed (unknown exit code %d)", rc);
return -EIO;
}
} while (0);
if (rc == 0) {
LOG_VOL("Filesystem check completed OK");
return 0;
} else if (rc == 1) {
LOG_VOL("Filesystem check failed (general failure)");
return -EINVAL;
} else if (rc == 2) {
LOG_VOL("Filesystem check failed (invalid usage)");
return -EIO;
} else if (rc == 4) {
LOG_VOL("Filesystem check completed (errors fixed)");
} else if (rc == 8) {
LOG_VOL("Filesystem check failed (not a FAT filesystem)");
return -ENODATA;
} else {
LOG_VOL("Filesystem check failed (unknown exit code %d)", rc);
return -EIO;
}
return 0;
}