DISABLE -> REMOVED : CONFIG_SQUASHFS
[linux-2.6.git] / fs / hfsplus / extents.c
index 51d4b12..1a74800 100644 (file)
 #include <linux/errno.h>
 #include <linux/fs.h>
 #include <linux/pagemap.h>
-#include <linux/version.h>
 
 #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)
 {
        __be32 k1id, k2id;
        __be32 k1s, k2s;
@@ -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;
 }