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 <lockwood@android.com>
diff --git a/DirectVolume.cpp b/DirectVolume.cpp
index 1f9f084..ce5b892 100644
--- a/DirectVolume.cpp
+++ b/DirectVolume.cpp
@@ -65,6 +65,14 @@
     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 @@
 
     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 @@
     return MKDEV(0, 0);
 };
 
+dev_t Volume::getShareDevice() {
+    return getDiskDevice();
+}
+
 void Volume::handleVolumeShared() {
 }
 
@@ -220,7 +224,9 @@
 
     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 @@
 
     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 @@
         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 @@
         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;