]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/hfsplus/btree.c
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfashe...
[linux-2.6-omap-h63xx.git] / fs / hfsplus / btree.c
index a9b9e872e29a6296ecd4d327bd8f2653beeb7a3e..bb5433608a42efdf3c6ec0ef9b809c614a11b686 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/slab.h>
 #include <linux/pagemap.h>
+#include <linux/log2.h>
 
 #include "hfsplus_fs.h"
 #include "hfsplus_raw.h"
@@ -21,6 +22,7 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id)
        struct hfs_btree *tree;
        struct hfs_btree_header_rec *head;
        struct address_space *mapping;
+       struct inode *inode;
        struct page *page;
        unsigned int size;
 
@@ -32,9 +34,10 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id)
        spin_lock_init(&tree->hash_lock);
        tree->sb = sb;
        tree->cnid = id;
-       tree->inode = iget(sb, id);
-       if (!tree->inode)
+       inode = hfsplus_iget(sb, id);
+       if (IS_ERR(inode))
                goto free_tree;
+       tree->inode = inode;
 
        mapping = tree->inode->i_mapping;
        page = read_mapping_page(mapping, 0, NULL);
@@ -61,15 +64,17 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id)
                if ((HFSPLUS_SB(sb).flags & HFSPLUS_SB_HFSX) &&
                    (head->key_type == HFSPLUS_KEY_BINARY))
                        tree->keycmp = hfsplus_cat_bin_cmp_key;
-               else
+               else {
                        tree->keycmp = hfsplus_cat_case_cmp_key;
+                       HFSPLUS_SB(sb).flags |= HFSPLUS_SB_CASEFOLD;
+               }
        } else {
                printk(KERN_ERR "hfs: unknown B*Tree requested\n");
                goto fail_page;
        }
 
        size = tree->node_size;
-       if (!size || size & (size - 1))
+       if (!is_power_of_2(size))
                goto fail_page;
        if (!tree->node_count)
                goto fail_page;