diff options
-rw-r--r-- | vold/volmgr_vfat.c | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/vold/volmgr_vfat.c b/vold/volmgr_vfat.c index 344a16600..3c546b44b 100644 --- a/vold/volmgr_vfat.c +++ b/vold/volmgr_vfat.c @@ -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; } |