kernel source 问题,谢谢!
lolin 2002-07-17 10:11:42 麻烦哪位能帮我讲解一下这个函数,看不明白啊!
/fs/ext2/truncate.c(linux2.3.12)
static int trunc_direct (struct inode * inode)
{
int i, retry = 0;
unsigned long block_to_free = 0, free_count = 0;
int blocks = inode->i_sb->s_blocksize / 512;
int direct_block = DIRECT_BLOCK(inode);
for (i = direct_block ; i < EXT2_NDIR_BLOCKS ; i++) {
u32 * p = inode->u.ext2_i.i_data + i;
int tmp = le32_to_cpu(*p);
if (!tmp)
continue;
*p = 0;
inode->i_blocks -= blocks;
mark_inode_dirty(inode);
/* accumulate blocks to free if they're contiguous */
if (free_count == 0)
goto free_this;
else if (block_to_free == tmp - free_count)
free_count++;
else {
ext2_free_blocks (inode, block_to_free, free_count);
free_this:
block_to_free = tmp;
free_count = 1;
}
}
if (free_count > 0)
ext2_free_blocks (inode, block_to_free, free_count);
return retry;
}
特别是那个for循环的开始、终止条件!
thanks again!