summaryrefslogtreecommitdiffstats
path: root/Volume.cpp
diff options
context:
space:
mode:
authorSan Mehat <san@google.com>2010-01-04 10:09:16 -0800
committerSan Mehat <san@google.com>2010-01-04 10:09:16 -0800
commitbf04185c88161f13118b9975cdff7967d49a4fa0 (patch)
treef6f61e9b90eb05f9ac16d55efdeb33bd8187c87d /Volume.cpp
parent79e31bedcaabcca55aaf40a9de61abed11c9a2e0 (diff)
downloadsystem_vold-bf04185c88161f13118b9975cdff7967d49a4fa0.zip
system_vold-bf04185c88161f13118b9975cdff7967d49a4fa0.tar.gz
system_vold-bf04185c88161f13118b9975cdff7967d49a4fa0.tar.bz2
vold2: Refactor FAT support into a separate class
Signed-off-by: San Mehat <san@google.com>
Diffstat (limited to 'Volume.cpp')
-rw-r--r--Volume.cpp166
1 files changed, 6 insertions, 160 deletions
diff --git a/Volume.cpp b/Volume.cpp
index b9f030b..d234c6f 100644
--- a/Volume.cpp
+++ b/Volume.cpp
@@ -39,16 +39,12 @@
#include "Volume.h"
#include "VolumeManager.h"
#include "ResponseCode.h"
+#include "Fat.h"
-extern "C" int logwrap(int argc, const char **argv, int background);
-extern "C" int mount(const char *, const char *, const char *, unsigned long, const void *);
extern "C" void KillProcessesWithOpenFiles(const char *, int, int, int);
extern "C" void dos_partition_dec(void const *pp, struct dos_partition *d);
extern "C" void dos_partition_enc(void *pp, struct dos_partition *d);
-static char FSCK_MSDOS_PATH[] = "/system/bin/fsck_msdos";
-static char MKDOSFS_PATH[] = "/system/bin/newfs_msdos";
-
static const char *stateToStr(int state) {
if (state == Volume::State_Init)
return "Initializing";
@@ -172,7 +168,7 @@ int Volume::formatVol() {
LOGI("Volume %s (%s) being formatted", getLabel(), devicePath);
- if (doFormatVfat(devicePath)) {
+ if (Fat::format(devicePath)) {
LOGE("Failed to format (%s)", strerror(errno));
goto err;
}
@@ -250,7 +246,9 @@ int Volume::mountVol() {
LOGI("%s being considered for volume %s\n", devicePath, getLabel());
errno = 0;
- if ((rc = checkFilesystem(devicePath))) {
+ setState(Volume::State_Checking);
+
+ if ((rc = Fat::check(devicePath))) {
if (errno == ENODATA) {
LOGW("%s does not contain a FAT filesystem\n", devicePath);
continue;
@@ -270,7 +268,7 @@ int Volume::mountVol() {
LOGI("%s checks out - attempting to mount\n", devicePath);
errno = 0;
- if (!(rc = doMountVfat(devicePath, getMountpoint()))) {
+ if (!(rc = Fat::doMount(devicePath, getMountpoint()))) {
LOGI("%s sucessfully mounted for volume %s\n", devicePath,
getLabel());
setState(Volume::State_Mounted);
@@ -299,116 +297,6 @@ out:
return rc;
}
-
-int Volume::doMountVfat(const char *deviceNode, const char *mountPoint)
-{
- int rc;
- unsigned long flags;
-
- flags = MS_NODEV | MS_NOEXEC | MS_NOSUID | MS_DIRSYNC;
-
- /*
- * Note: This is a temporary hack. If the sampling profiler is enabled,
- * we make the SD card world-writable so any process can write snapshots.
- *
- * TODO: Remove this code once we have a drop box in system_server.
- */
- char value[PROPERTY_VALUE_MAX];
- property_get("persist.sampling_profiler", value, "");
- if (value[0] == '1') {
- LOGW("The SD card is world-writable because the"
- " 'persist.sampling_profiler' system property is set to '1'.");
- rc = mount(deviceNode, mountPoint, (const char *) "vfat", (unsigned long) flags,
- (const void *) "utf8,uid=1000,gid=1015,fmask=000,dmask=000,shortname=mixed");
- } else {
- /*
- * The mount masks restrict access so that:
- * 1. The 'system' user cannot access the SD card at all -
- * (protects system_server from grabbing file references)
- * 2. Group users can RWX
- * 3. Others can only RX
- */
- rc = mount(deviceNode, mountPoint, "vfat", flags,
- "utf8,uid=1000,gid=1015,fmask=702,dmask=702,shortname=mixed");
- }
-
- if (rc && errno == EROFS) {
- LOGE("%s appears to be a read only filesystem - retrying mount RO",
- deviceNode);
- flags |= MS_RDONLY;
- rc = mount(deviceNode, mountPoint, "vfat", flags,
- "utf8,uid=1000,gid=1015,fmask=702,dmask=702,shortname=mixed");
- }
-
- if (rc == 0) {
- char *lost_path;
- asprintf(&lost_path, "%s/LOST.DIR", mountPoint);
- 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);
- }
-
- return rc;
-}
-
-int Volume::checkFilesystem(const char *nodepath) {
-
- bool rw = true;
- if (access(FSCK_MSDOS_PATH, X_OK)) {
- LOGW("Skipping fs checks\n");
- return 0;
- }
-
- setState(Volume::State_Checking);
- int pass = 1;
- int rc = 0;
- do {
- const char *args[5];
- args[0] = FSCK_MSDOS_PATH;
- args[1] = "-p";
- args[2] = "-f";
- args[3] = nodepath;
- args[4] = NULL;
-
- rc = logwrap(4, args, 1);
-
- switch(rc) {
- case 0:
- LOGI("Filesystem check completed OK");
- return 0;
-
- case 2:
- LOGE("Filesystem check failed (not a FAT filesystem)");
- errno = ENODATA;
- return -1;
-
- case 4:
- if (pass++ <= 3) {
- LOGW("Filesystem modified - rechecking (pass %d)",
- pass);
- continue;
- }
- LOGE("Failing check after too many rechecks");
- errno = EIO;
- return -1;
-
- default:
- LOGE("Filesystem check failed (unknown exit code %d)", rc);
- errno = EIO;
- return -1;
- }
- } while (0);
-
- return 0;
-}
-
int Volume::unmountVol() {
int i, rc;
@@ -497,45 +385,3 @@ int Volume::initializeMbr(const char *deviceNode) {
close(fd);
return 0;
}
-
-int Volume::doFormatVfat(const char *deviceNode) {
- unsigned int nr_sec;
- int fd;
-
- if ((fd = open(deviceNode, O_RDWR)) < 0) {
- LOGE("Error opening disk file (%s)", strerror(errno));
- return -1;
- }
-
- if (ioctl(fd, BLKGETSIZE, &nr_sec)) {
- LOGE("Unable to get device size (%s)", strerror(errno));
- close(fd);
- return -1;
- }
- close(fd);
-
- const char *args[7];
- int rc;
- args[0] = MKDOSFS_PATH;
- args[1] = "-F";
- if ((nr_sec * 512) <= ((unsigned int) (1024*1024*1024) * 2))
- args[2] = "16";
- else
- args[2] = "32";
-
- args[3] = "-O";
- args[4] = "android";
- args[5] = deviceNode;
- args[6] = NULL;
- rc = logwrap(7, args, 1);
-
- if (rc == 0) {
- LOGI("Filesystem formatted OK");
- return 0;
- } else {
- LOGE("Format failed (unknown exit code %d)", rc);
- errno = EIO;
- return -1;
- }
- return 0;
-}