X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fhfsplus%2Fextents.c;h=1a7480089e82ef918cb71c91a52c4e86b214c2df;hb=12b6c928ddb4b094b3a6b11e22c3debddccf1dfb;hp=3cf272194117ac5d880d100110db460d7e866427;hpb=daddc0d38b3571bed170afa273a49a0eba090c1e;p=linux-2.6.git diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c index 3cf272194..1a7480089 100644 --- a/fs/hfsplus/extents.c +++ b/fs/hfsplus/extents.c @@ -11,16 +11,16 @@ #include #include #include -#include #include "hfsplus_fs.h" #include "hfsplus_raw.h" /* Compare two extents keys, returns 0 on same, pos/neg for difference */ -int hfsplus_ext_cmp_key(hfsplus_btree_key *k1, hfsplus_btree_key *k2) +int hfsplus_ext_cmp_key(const hfsplus_btree_key *k1, + const hfsplus_btree_key *k2) { - u32 k1id, k2id; - u32 k1s, k2s; + __be32 k1id, k2id; + __be32 k1s, k2s; k1id = k1->ext.cnid; k2id = k2->ext.cnid; @@ -37,8 +37,8 @@ int hfsplus_ext_cmp_key(hfsplus_btree_key *k1, hfsplus_btree_key *k2) return be32_to_cpu(k1s) < be32_to_cpu(k2s) ? -1 : 1; } -void hfsplus_ext_build_key(hfsplus_btree_key *key, u32 cnid, - u32 block, u8 type) +static void hfsplus_ext_build_key(hfsplus_btree_key *key, u32 cnid, + u32 block, u8 type) { key->key_len = cpu_to_be16(HFSPLUS_EXT_KEYLEN - 2); key->ext.cnid = cpu_to_be32(cnid); @@ -183,8 +183,8 @@ int hfsplus_get_block(struct inode *inode, sector_t iblock, shift = HFSPLUS_SB(sb).alloc_blksz_shift - sb->s_blocksize_bits; ablock = iblock >> HFSPLUS_SB(sb).fs_shift; - if (iblock >= inode->i_blocks) { - if (iblock > inode->i_blocks || !create) + if (iblock >= HFSPLUS_I(inode).fs_blocks) { + if (iblock > HFSPLUS_I(inode).fs_blocks || !create) return -EIO; if (ablock >= HFSPLUS_I(inode).alloc_blocks) { res = hfsplus_file_extend(inode); @@ -217,7 +217,8 @@ done: if (create) { set_buffer_new(bh_result); HFSPLUS_I(inode).phys_size += sb->s_blocksize; - inode->i_blocks++; + HFSPLUS_I(inode).fs_blocks++; + inode_add_bytes(inode, sb->s_blocksize); mark_inode_dirty(inode); } return 0; @@ -262,8 +263,9 @@ static int hfsplus_add_extent(struct hfsplus_extent *extent, u32 offset, return -EIO; } -int hfsplus_free_extents(struct super_block *sb, struct hfsplus_extent *extent, - u32 offset, u32 block_nr) +static int hfsplus_free_extents(struct super_block *sb, + struct hfsplus_extent *extent, + u32 offset, u32 block_nr) { u32 count, start; int i; @@ -348,10 +350,9 @@ int hfsplus_file_extend(struct inode *inode) if (HFSPLUS_SB(sb).alloc_file->i_size * 8 < HFSPLUS_SB(sb).total_blocks - HFSPLUS_SB(sb).free_blocks + 8) { // extend alloc file - printk("extend alloc file! (%Lu,%u,%u)\n", HFSPLUS_SB(sb).alloc_file->i_size * 8, + printk(KERN_ERR "hfs: extend alloc file! (%Lu,%u,%u)\n", HFSPLUS_SB(sb).alloc_file->i_size * 8, HFSPLUS_SB(sb).total_blocks, HFSPLUS_SB(sb).free_blocks); return -ENOSPC; - //BUG(); } down(&HFSPLUS_I(inode).extents_lock); @@ -459,7 +460,9 @@ void hfsplus_file_truncate(struct inode *inode) page_cache_release(page); mark_inode_dirty(inode); return; - } + } else if (inode->i_size == HFSPLUS_I(inode).phys_size) + return; + blk_cnt = (inode->i_size + HFSPLUS_SB(sb).alloc_blksz - 1) >> HFSPLUS_SB(sb).alloc_blksz_shift; alloc_cnt = HFSPLUS_I(inode).alloc_blocks; if (blk_cnt == alloc_cnt) @@ -497,6 +500,7 @@ void hfsplus_file_truncate(struct inode *inode) HFSPLUS_I(inode).alloc_blocks = blk_cnt; out: HFSPLUS_I(inode).phys_size = inode->i_size; + HFSPLUS_I(inode).fs_blocks = (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; + inode_set_bytes(inode, HFSPLUS_I(inode).fs_blocks << sb->s_blocksize_bits); mark_inode_dirty(inode); - inode->i_blocks = (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; }