--- file.c.old 2004-08-02 09:25:15.000000000 +0800 +++ file.c 2004-08-02 15:56:43.000000000 +0800 @@ -1156,14 +1156,35 @@ down(&OCFS_I(inode)->ip_sem); if (!(OCFS_I(inode)->ip_open_flags & OCFS_OIN_OPEN_FOR_DIRECTIO)) { struct buffer_head **bhs = NULL; + struct buffer_head *bhz = NULL; int i; sector_t block; u64 this_last; up(&OCFS_I(inode)->ip_sem); - + LOG_TRACE_ARGS("zeroing %llu blocks from offset %llu\n", num_blocks, block_off); + + block = block_off; + + if(!system_file) { + while (block < (block_off + num_blocks)) { + bhz = sb_getblk(osb->sb, block); + if (!bhz) { + status = -ENOMEM; + LOG_ERROR_STATUS(status); + break; + } + memset(bhz->b_data, 0, + osb->sb->s_blocksize); + mark_buffer_dirty(bhz); + brelse(bhz); + block++; + } + goto skip_zeros; + } + bhs = kmalloc(OCFS_MAX_ZERO_BLOCKS * sizeof(struct buffer_head *), GFP_KERNEL); if (!bhs) { @@ -1174,7 +1195,6 @@ memset(bhs, 0, OCFS_MAX_ZERO_BLOCKS * sizeof(struct buffer_head *)); - block = block_off; while (block < (block_off + num_blocks)) { this_last = block + OCFS_MAX_ZERO_BLOCKS; if (this_last > (block_off + num_blocks))