Cannot Factory Reset after Encrypting I encrypted my phone but now want it not encrypted so have to factory reset. However, if I try to do this from the CWM Recovery it says

-- Wiping data... 
Formatting /data...  
Error mounting /data!  
Skipping format... 
Formatting /cache...  
Formatting /sd-ext...  
Formatting /sdcard/.android_secure...
Error mounting /sdcard/.android_secure!
Skipping format... 
Data wipe complete.


When I try to factory reset from the normal GUI it doesn't give me an error but finishes very very quickly and hasn't worked (presumably the output above has happened in the logs).

What can I do?
I have also encrypted the /data partition (on my Samsung I9300) and wanted to reset it for an upgrade. This failed with the error you mentioned, /tmp/recovery.log contains:

ClockworkMod Recovery v6.0.3.2
recovery filesystem table
=========================
  0 /tmp ramdisk (null) (null) 0
  1 /efs ext4 /dev/block/mmcblk0p3 (null) 0
  2 /boot emmc /dev/block/mmcblk0p5 (null) 0
  3 /recovery emmc /dev/block/mmcblk0p6 (null) 0
  4 /cache ext4 /dev/block/mmcblk0p8 (null) 0
  5 /system ext4 /dev/block/mmcblk0p9 (null) 0
  6 /data ext4 /dev/block/mmcblk0p12 (null) -16384
  7 /preload ext4 /dev/block/mmcblk0p10 (null) 0
  8 /modem emmc /dev/block/mmcblk0p7 (null) 0
  9 /sdcard datamedia /dev/null (null) 0
  10 /external_sd ext4 /dev/block/mmcblk1p1 (null) 0
&lt;snip&gt;
-- Wiping data...
Formatting /data...
I:Formatting unknown device.
W:failed to mount /dev/block/mmcblk0p12 (Invalid argument)
Error mounting /data!
Skipping format...


DISCLAIMER: I am not responsibility for anything that goes wrong, including (but not limited to) user error.

If you wish to wipe the /data partition completely (including media like photos), follow the below instructions:


Boot into recovery.
Run adb shell in a terminal (Linux) or Command Prompt ("CMD", Windows). After a few seconds, you should see a line containing ~ #.
WARNING. Triple-check the command that you are entering here. White space and capitalization are important. Make any mistake here and you may accidentally wipe your whole flash memory including recovery images.
NOTE: if you want to encrypt your partition later, you have to leave 16KiB unallocated space on the end of the partition.
In the adb shell, run the command mke2fs -t ext4 /dev/block/mmcblk0p12. Substitute /dev/block/mmcblk0p12 and ext4 according to the recovery filesystem table (for /data). Output when running the command:

~ # mke2fs -t ext4 /dev/block/mmcblk0p12 
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
755904 inodes, 3022848 blocks
151142 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3095396352
93 block groups
32768 blocks per group, 32768 fragments per group
8128 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

(Optional) Install new firmware (E.g. CM 10.1).
Reboot.
(Optional) In order to encrypt the partition while clearing your whole data partition, run vdc cryptfs enablecrypto wipe PIN_OR_PASSWORD (before Android 5.0) or vdc cryptfs enablecrypto wipe password PASSWORD_IN_HEX (since Android 5.0, see this post for details).
Reconfigure device, choose language, enter name, install apps, etc.




Technical details below.

The factory reset menu item activates erase_volume("/data") in recovery.c which calls format_volume("/data").

format_volume is defined in roots.c:



int format_volume(const char* volume) {
    // &lt;snip&gt;
    // check to see if /data is being formatted, and if it is /data/media
    // Note: the /sdcard check is redundant probably, just being safe
    if (strstr(volume, "/data") == volume &amp;&amp; is_data_media() &amp;&amp; !handle_data_media) {
        return format_unknown_device(NULL, volume, NULL);
    }


Since the volume name indeed starts with /data, and the recovery filesystem table contains an entry for type datamedia and handle_data_media is initially zero, format format_unknown_device is called. That function is defined in extendedcommands.c as follows:



int format_unknown_device(const char *device, const char* path, const char *fs_type)
{
    LOGI("Formatting unknown device.\n");

    if (fs_type != NULL &amp;&amp; get_flash_type(fs_type) != UNSUPPORTED)
        return erase_raw_partition(fs_type, device);

    // if this is SDEXT:, don't worry about it if it does not exist.
    if (0 == strcmp(path, "/sd-ext"))
    {    
        // &lt;snip&gt;
    }    

    if (NULL != fs_type) {
        // &lt;snip&gt;
    }    

    if (0 != ensure_path_mounted(path))
    {
        ui_print("Error mounting %s!\n", path);
        ui_print("Skipping format...\n");
        return 0;
    }


fs_type is NULL and the path is /data. That means that the code path ends up at ensure_path_mounted(path) which is the place where this function fails. Looking at the name, ensure_path_mounted attempts to mount the partition by name which of course fails since the encrypted partition is not supported in CWM. Therefore, CWM refuses to "format" the partition (actually, all it does is erasing all files except for /data/media after mounting).

Therefore the goal is to format /data with ext4 (see recovery filesystem table) or mount the encrypted data partition somehow. I could not easily find the tools for mounting encrypted partitions, so I decided to go the easy way and just format the partition.