Add back "unmountable" volume state.

Also automatically unmount when format is requested.

Bug: 19993667
Change-Id: I2c81b7ccc9d69df61d7ae4df1e8224c02f260044
diff --git a/VolumeBase.cpp b/VolumeBase.cpp
index 292a4cd..2590ecf 100644
--- a/VolumeBase.cpp
+++ b/VolumeBase.cpp
@@ -145,8 +145,8 @@
 }
 
 status_t VolumeBase::mount() {
-    if (mState != State::kUnmounted) {
-        LOG(WARNING) << getId() << " mount requires state unmounted";
+    if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
+        LOG(WARNING) << getId() << " mount requires state unmounted or unmountable";
         return -EBUSY;
     }
 
@@ -155,7 +155,7 @@
     if (res == OK) {
         setState(State::kMounted);
     } else {
-        setState(State::kUnmounted);
+        setState(State::kUnmountable);
     }
 
     return res;
@@ -183,8 +183,12 @@
 }
 
 status_t VolumeBase::format() {
-    if (mState != State::kUnmounted) {
-        LOG(WARNING) << getId() << " format requires state unmounted";
+    if (mState == State::kMounted) {
+        unmount();
+    }
+
+    if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
+        LOG(WARNING) << getId() << " format requires state unmounted or unmountable";
         return -EBUSY;
     }
 
diff --git a/VolumeBase.h b/VolumeBase.h
index e3d91ff..465fc61 100644
--- a/VolumeBase.h
+++ b/VolumeBase.h
@@ -63,11 +63,18 @@
     };
 
     enum class State {
+        /* Next states: mounting, formatting */
         kUnmounted = 0,
+        /* Next states: mounted, unmountable */
         kMounting,
+        /* Next states: unmounting */
         kMounted,
+        /* Next states: unmounted */
         kFormatting,
+        /* Next states: unmounted */
         kUnmounting,
+        /* Next states: mounting, formatting */
+        kUnmountable,
     };
 
     const std::string& getId() { return mId; }