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 邱建波 <[email protected]>

> 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 <[email protected]>
>
>> 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: 
>> [email protected]<android-porting%[email protected]>
>> website: http://groups.google.com/group/android-porting
>>
>
>
>
> --
> ------
>
> Jianbo Qiu (邱建波)
>
> Mobile: 13681184653
>
> MSN:[email protected] <msn%[email protected]>
>
> ------
>

-- 
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting

Reply via email to