|
很久没来论坛了,听J大他们说,不点您再进一步开发fbinst,我估计是底层的东西,我也许帮不上什么忙。
上次我和J大还有群里的几个网友发现fbinst一个重大的bug,在Chenall修改的版本里面,可能没有修正这个BUG,
虽然这个不是底层的内容,但我想还是有必要修正一下,下面是修正后的部分代码:
- int
- check_space (uchar4 *start, uchar4 size, uchar4 *count,
- uchar4 begin, uchar4 end, int is_ext)
- {
- /* 下面一段代码比较难看懂,拆分一下:
- 1、begin >= fb_pri_size,就是begin在扩展区的时候,其实只有一种情况:
- 不管is_ext = 0 还是 1,都只能在扩展区判断空间大小,这个时候,如果
- (end - begin >= *count) 也就是说,碎片的空间(或者尾部空间)大于
- 等于文件大小,就满足存放条件。
- 2、如果(end <= fb_pri_size),也就是说,最后一个文件在主分区,这个时候如果
- is_ext = 0 并且 (end - begin >= *count),也就是说主分区内有大于等于
- 该文件大小的空间,就分配给他。如果没有返回失败信息 0 ,以便循环继续执行。
- 3、如果在碎片中找不到适合的空间,那么这个时候begin等于最后一个文件的下一个位置,
- end等于ud区的总大小,这个时候分两种情况:
- 1)begin在主分区,再如果指定导入主分区,主分区 - begin 的空间可以容纳文件,满足条件,
- *start = begin; 如果指定导入扩展区后主分区导入失败,这个时候整个扩展区是空的,
- 且大小可以容纳文件,就从扩展区开始的地方写入该文件,*start = fb_pri_size;
- 2)begin在扩展区,begin >= fb_pri_size,如果扩展区剩余的空间满足要求,就分配空间,
- (end - begin >= *count),*start = begin;
-
- BUG分析:如果 begin >= fb_pri_size ,就是说begin已经在扩展区了,而这个时候
- count = (size + 509) / 510 ,count的值一般情况下是大于真实值的,应该改为
- *count = (size + 511) >> 9; 再进行 (end - begin) 和 *count 的对比.
- 否则造成,刚删除的文件,再导入,不会占用原来的位置,而是占用更大的位置或者
- 排到最后。
-
- plantsoot @ 2012-1-31
- */
-
- if (begin >= fb_pri_size) // 修复bug语句,2012-2-1
- {
- *count = (size + 511) >> 9;
- } // 修复bug结束
- if ((begin >= fb_pri_size) || (end <= fb_pri_size)) // 如果开始扇区在扩展区,或者end在主分区
- {
- // 如果 开始扇区位于扩展区或者未指定导入扩展区,并且空闲区域大于等于文件大小
- if (((begin >= fb_pri_size) || (! is_ext)) && (end - begin >= *count))
- {
- *start = begin; // 那么可以存放文件,返回该空闲空间的起始扇区
- return 1;
- }
- }
- else //((begin < fb_pri_size) and (end > fb_pri_size))
- { /* 如果未指定导入到扩展区,并且begin在主分区内,当前文件的起始扇区在扩展区
- * 这个时候不能按 end - begin >= *count 来算,为什么呢?因为文件存放不可以跨区,
- * 要么主分区,要么扩展区。如果主分区剩余的空间大于等于文件大小,begin位置赋值给start */
- if ((! is_ext) && (fb_pri_size - begin >= *count))
- {
- *start = begin;
- return 1;
- }
-
- //如果指定了扩展区,begin在主分区内,当前文件的起始扇区在扩展区
- *count = (size + 511) >> 9; // 扩展区扇区有效大小是512字节
- if (end - fb_pri_size >= *count) // 扩展区第一个文件和主分区之间如果有足够大的空间
- {
- *start = fb_pri_size;
- return 1;
- }
- }
- return 0;
- }
复制代码
注释写的不是很严谨,见谅。 |
|