From 2dfe297ec47559dbe2297a72bea71cf515c03797 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Fri, 17 Sep 2010 18:50:51 -0400 Subject: [PATCH] Fixes for devices with internal FAT file system: Only share a single partition via UMS if a specific partition is specified in vold.fstab (rather than "auto") Do not fail to reformat if MBR cannot be found. Change-Id: I544ca2ee325c308af656ab9f4732c788a964c156 Signed-off-by: Mike Lockwood --- DirectVolume.cpp | 8 ++++++++ DirectVolume.h | 1 + Volume.cpp | 8 +++++++- Volume.h | 1 + VolumeManager.cpp | 9 +-------- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/DirectVolume.cpp b/DirectVolume.cpp index 1f9f084..ce5b892 100644 --- a/DirectVolume.cpp +++ b/DirectVolume.cpp @@ -65,6 +65,14 @@ dev_t DirectVolume::getDiskDevice() { return MKDEV(mDiskMajor, mDiskMinor); } +dev_t DirectVolume::getShareDevice() { + if (mPartIdx != -1) { + return MKDEV(mDiskMajor, mPartIdx); + } else { + return MKDEV(mDiskMajor, mDiskMinor); + } +} + void DirectVolume::handleVolumeShared() { setState(Volume::State_Shared); } diff --git a/DirectVolume.h b/DirectVolume.h index 2a78236..bf50891 100644 --- a/DirectVolume.h +++ b/DirectVolume.h @@ -45,6 +45,7 @@ public: int handleBlockEvent(NetlinkEvent *evt); dev_t getDiskDevice(); + dev_t getShareDevice(); void handleVolumeShared(); void handleVolumeUnshared(); diff --git a/Volume.cpp b/Volume.cpp index 190b64b..1577ba9 100644 --- a/Volume.cpp +++ b/Volume.cpp @@ -144,6 +144,10 @@ dev_t Volume::getDiskDevice() { return MKDEV(0, 0); }; +dev_t Volume::getShareDevice() { + return getDiskDevice(); +} + void Volume::handleVolumeShared() { } @@ -220,7 +224,9 @@ int Volume::formatVol() { if (initializeMbr(devicePath)) { SLOGE("Failed to initialize MBR (%s)", strerror(errno)); - goto err; +// goto err; +// don't treat this as a fatal error +// lets continue on and format the partition } sprintf(devicePath, "/dev/block/vold/%d:%d", diff --git a/Volume.h b/Volume.h index 383c2e4..f81afff 100644 --- a/Volume.h +++ b/Volume.h @@ -71,6 +71,7 @@ public: virtual int handleBlockEvent(NetlinkEvent *evt); virtual dev_t getDiskDevice(); + virtual dev_t getShareDevice(); virtual void handleVolumeShared(); virtual void handleVolumeUnshared(); diff --git a/VolumeManager.cpp b/VolumeManager.cpp index 231b308..b53e7b1 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -1036,7 +1036,7 @@ int VolumeManager::shareVolume(const char *label, const char *method) { return -1; } - dev_t d = v->getDiskDevice(); + dev_t d = v->getShareDevice(); if ((MAJOR(d) == 0) && (MINOR(d) == 0)) { // This volume does not support raw disk access errno = EINVAL; @@ -1084,14 +1084,7 @@ int VolumeManager::unshareVolume(const char *label, const char *method) { return -1; } - dev_t d = v->getDiskDevice(); - int fd; - char nodepath[255]; - snprintf(nodepath, - sizeof(nodepath), "/dev/block/vold/%d:%d", - MAJOR(d), MINOR(d)); - if ((fd = open("/sys/devices/platform/usb_mass_storage/lun0/file", O_WRONLY)) < 0) { SLOGE("Unable to open ums lunfile (%s)", strerror(errno)); return -1;