android存储nand flash或者emmc一般会划分一个分区用作内部sdcard,系统启动会挂载该分区,一般挂载到/mnt/sdcard/,可读可写。当该分区出错时,出错处理是errors=remount-ro,也就是重新挂载成只读,这时便无法进行往sdcard写入操作。
/dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
sdcard变成只读,一般需要具体查找导致出错的原因,从根本上解决。下策是,直接将errors=remount-ro改为errors=continue,避免出现只读的情况,具体实现如下:
diff --git a/linux-3.4/fs/fat/inode.c b/linux-3.4/fs/fat/inode.c
index d403f76..21459d0 100644
--- a/linux-3.4/fs/fat/inode.c
+++ b/linux-3.4/fs/fat/inode.c
@@ -1007,7 +1007,7 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat,
opts->numtail = 1;
opts->usefree = opts->nocase = 0;
opts->tz_utc = 0;
- opts->errors = FAT_ERRORS_RO;
+ opts->errors = FAT_ERRORS_CONT;
*debug = 0;
if (!options)
@@ -1107,7 +1107,7 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat,
opts->errors = FAT_ERRORS_PANIC;
break;
case Opt_err_ro:
- opts->errors = FAT_ERRORS_RO;
+ opts->errors = FAT_ERRORS_CONT;
break;
/* msdos specific */
如此修改可能引发的后遗症,有待具体测试发现。。。