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

Reply via email to