这其实是差不多2年之前发现的一个bug,
但是看了一下最新的代码
这个bug任然没有被修复掉。
-
int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs)
-
{
-
int i, err = 0;
-
for (i = 0; i <</span> nr_bhs; i++)
-
write_dirty_buffer(bhs[i], WRITE);
这算是一个比较明显的错误吧,因为从这个名字可以看出来这段代码是用来sync一些buffer head包含的数据的。
但是却错误的使用了WRITE flag,而不是WRITE_SYNC。
之所以发现这个错误,是因为之前在做camera暴力测试的时候,发现应用老是ANR。fat文件系统的挂载中包含了dirsync flag。
其结果就是上层应用在创建文件的时候,一直在等待函数返回,而文件相关的metadata由于dirsync的原因,
必须立即同步到SD卡中(注意这儿不是写缓冲了)。由于是做camera的暴力测试,会有大量的数据写入。
但是由于这边错误的WRITE flag导致,这些metadata的write请求混在data的写请求中。一直在block 调度层中等待调度。
阅读(1988) | 评论(0) | 转发(0) |