Hi axel: your patch works well. "no partitions" means ths sdcard has none partitions,deleted all partitions.it can r/w with pc operating system
had this problem happen on your device?can't mount sdcard with "no partitions" 在 2010年8月12日 下午10:51,axel haslam <axelhas...@gmail.com>写道: > i have pushed this patch that helped with our problem. > https://review.source.android.com/#change,16460, let me know > if it helps.. > > Im not sure what you mean with "no partitions".. you have not > partitioned the sdcard? > > > > > <https://review.source.android.com/#change,16460> > > 2010/8/12 邱建波 <qjb.1...@gmail.com> > > hi axelhaslam : >> >> We have a problem with mount too .That is MMC can't mount auto while >> it no partitions. >> when SDcard Inserted ,the state changed and stoped with state >> "Pending" >> >> Have you had this problem? >> >> 2010/7/16 axel haslam <axelhas...@gmail.com> >> >>> We have a problem with froyo in which the MMC does not get >>> automatically mounted upon insertion. >>> >>> This is what i could understand from the code: >>> in DirectVolume.cpp on the function handleDiskAdded, if the number of >>> partitions is not 0, the volume state gets set to "State_Pending" , >>> and the VolumeDiskInserted broadcast is sent.This triggers the onEvent >>> method on MountService, which starts a new thread that sends the >>> command "volume mount" >>> >>> the "volume mount" command, gets handled in Volume.cpp function >>> mountVol() which checks if the state is "State_Idle" if not, returns >>> BUSY, which in turn gets translated to code 405 "OpFailedStorageBusy" >>> which is what we see on MountService. This happens because we have >>> just set the state to "State_Pending". >>> >>> If we force "State_Idle" on handleDiskAdded, instead of going into >>> state_Pending, it fixes our problem. >>> >>> A possible fix for this is setting a flag in the onEvent method on >>> MountService when the disk is inserted, and starting the thread that >>> sends the mount command when we receive the state-change to idle, and >>> the >>> flag is set. >>> >>> In short, we should try to mount when the state has changed to idle, >>> and >>> not on insertion. >>> >>> Here is the patch for this: >>> >>> index 6ceeb95..0adaf19 >>> --- a/services/java/com/android/server/MountService.java >>> +++ b/services/java/com/android/server/MountService.java >>> @@ -136,6 +136,8 @@ class MountService extends IMountService.Stub >>> private static final int RETRY_UNMOUNT_DELAY = 30; // in ms >>> private static final int MAX_UNMOUNT_RETRIES = 4; >>> >>> + /*used to send the mount command after state is idle.*/ >>> + boolean insertionMountPending = false; >>> class UnmountCallBack { >>> String path; >>> int retries; >>> @@ -495,6 +497,26 @@ class MountService extends IMountService.Stub >>> * Format: "NNN Volume <label> <path> state changed >>> * from <old_#> (<old_str>) to <new_#> (<new_str>)" >>> */ >>> + if ((Integer.parseInt(cooked[10]) == VolumeState.Idle) && >>> + insertionMountPending == true) { >>> + /* If the state moves to idle after a insertion >>> + * try to mount the device "Insertion mount" >>> + */ >>> + final String path = cooked[3]; >>> + insertionMountPending = false; >>> + new Thread() { >>> + public void run() { >>> + try { >>> + int rc; >>> + if ((rc = doMountVolume(path)) != >>> StorageResultCode.OperationSucceeded) { >>> + Slog.w(TAG, String.format("Insertion >>> mount failed (%d)", rc)); >>> + } >>> + } catch (Exception ex) { >>> + Slog.w(TAG, "Failed to mount media on >>> insertion", ex); >>> + } >>> + } >>> + }.start(); >>> + } >>> notifyVolumeStateChange( >>> cooked[2], cooked[3], >>> Integer.parseInt(cooked[7]), >>> Integer.parseInt(cooked[10])); >>> @@ -526,18 +548,11 @@ class MountService extends IMountService.Stub >>> } >>> >>> if (code == VoldResponseCode.VolumeDiskInserted) { >>> - new Thread() { >>> - public void run() { >>> - try { >>> - int rc; >>> - if ((rc = doMountVolume(path)) != >>> StorageResultCode.OperationSucceeded) { >>> - Slog.w(TAG, String.format("Insertion >>> mount failed (%d)", rc)); >>> - } >>> - } catch (Exception ex) { >>> - Slog.w(TAG, "Failed to mount media on >>> insertion", ex); >>> - } >>> - } >>> - }.start(); >>> + /* Instead of tring to mount here, wait for >>> + * the state to be Idle before atempting the >>> + * insertion mount, else "insertion mount" may fail. >>> + */ >>> + insertionMountPending = true; >>> } else if (code == VoldResponseCode.VolumeDiskRemoved) { >>> /* >>> * This event gets trumped if we're already in >>> BAD_REMOVAL state >>> >>> -- >>> >>> unsubscribe: >>> android-porting+unsubscr...@googlegroups.com<android-porting%2bunsubscr...@googlegroups.com> >>> website: http://groups.google.com/group/android-porting >>> >> >> >> >> -- >> ------ >> >> Jianbo Qiu (邱建波) >> >> Mobile: 13681184653 >> >> MSN:q173981...@126.com <msn%3aq173981...@126.com> >> >> ------ >> > > -- ------ Jianbo Qiu (邱建波) Mobile: 13681184653 MSN:q173981...@126.com <msn%3aq173981...@126.com> ------ -- unsubscribe: android-porting+unsubscr...@googlegroups.com website: http://groups.google.com/group/android-porting