/* set the key of the first byte in the 'block'-th block of file */
- make_cpu_key (&key, inode,
- (loff_t)block * inode->i_sb->s_blocksize + 1, // k_offset
+ make_cpu_key (&key, inode, new_offset,
TYPE_ANY, 3/*key length*/);
- if ((new_offset + inode->i_sb->s_blocksize) >= inode->i_size) {
+ if ((new_offset + inode->i_sb->s_blocksize - 1) > inode->i_size) {
journal_begin(&th, inode->i_sb, jbegin_count) ;
reiserfs_update_inode_transaction(inode) ;
transaction_started = 1 ;
@@ -622,10 +626,13 @@ int reiserfs_get_block (struct inode * i
}
if (indirect_item_found (retval, ih)) {
+ b_blocknr_t unfm_ptr;
+
/* 'block'-th block is in the file already (there is
corresponding cell in some indirect item). But it may be
zero unformatted node pointer (hole) */
- if (!get_block_num(item, pos_in_item)) {
+ unfm_ptr = ( b_blocknr_t ) get_block_num(item, pos_in_item);
+ if (!unfm_ptr) {
/* use allocated block to plug the hole */
reiserfs_prepare_for_journal(inode->i_sb, bh, 1) ;
if (fs_changed (fs_gen, inode->i_sb) && item_moved (&tmp_ih, &path)) {
@@ -634,15 +641,14 @@ int reiserfs_get_block (struct inode * i
}
bh_result->b_state |= (1UL << BH_New);
put_block_num(item, pos_in_item, allocated_block_nr) ;
+ unfm_ptr = allocated_block_nr;
journal_mark_dirty (&th, inode->i_sb, bh);
inode->i_blocks += (inode->i_sb->s_blocksize / 512) ;
reiserfs_update_sd(&th, inode) ;
}
- set_block_dev_mapped(bh_result, get_block_num(item, pos_in_item),inode);
+ set_block_dev_mapped(bh_result, unfm_ptr, inode);
pathrelse (&path);
-#ifdef REISERFS_CHECK
pop_journal_writer(windex) ;
-#endif /* REISERFS_CHECK */
if (transaction_started)
journal_end(&th, inode->i_sb, jbegin_count) ;
@@ -817,8 +823,8 @@ int reiserfs_get_block (struct inode * i
goto failure;
}
if (retval == POSITION_FOUND) {
- reiserfs_warning ("vs-: reiserfs_get_block: "
- "%k should not be found", &key);
+ reiserfs_warning ("vs-825: reiserfs_get_block: "
+ "%k should not be found\n", &key);
retval = -EEXIST;
if (allocated_block_nr)
reiserfs_free_block (&th, allocated_block_nr);