dprint(DBG_CAT_MOD, "create_cat: %s,%u(%d)\n",
                str->name, cnid, inode->i_nlink);
-       hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       if (err)
+               return err;
 
        hfsplus_cat_build_key(sb, fd.search_key, cnid, NULL);
        entry_size = hfsplus_fill_cat_thread(sb, &entry,
 
        dprint(DBG_CAT_MOD, "delete_cat: %s,%u\n",
                str ? str->name : NULL, cnid);
-       hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       if (err)
+               return err;
 
        if (!str) {
                int len;
        struct hfs_find_data src_fd, dst_fd;
        hfsplus_cat_entry entry;
        int entry_size, type;
-       int err = 0;
+       int err;
 
        dprint(DBG_CAT_MOD, "rename_cat: %u - %lu,%s - %lu,%s\n",
                cnid, src_dir->i_ino, src_name->name,
                dst_dir->i_ino, dst_name->name);
-       hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &src_fd);
+       err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &src_fd);
+       if (err)
+               return err;
        dst_fd = src_fd;
 
        /* find the old dir entry and read the data */
 
        sb = dir->i_sb;
 
        dentry->d_fsdata = NULL;
-       hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       if (err)
+               return ERR_PTR(err);
        hfsplus_cat_build_key(sb, fd.search_key, dir->i_ino, &dentry->d_name);
 again:
        err = hfs_brec_read(&fd, &entry, sizeof(entry));
        if (filp->f_pos >= inode->i_size)
                return 0;
 
-       hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       if (err)
+               return err;
        hfsplus_cat_build_key(sb, fd.search_key, inode->i_ino, NULL);
        err = hfs_brec_find(&fd);
        if (err)
 
        if (HFSPLUS_I(inode)->extent_state & HFSPLUS_EXT_DIRTY) {
                struct hfs_find_data fd;
 
-               hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd);
-               __hfsplus_ext_write_extent(inode, &fd);
-               hfs_find_exit(&fd);
+               if (!hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd)) {
+                       __hfsplus_ext_write_extent(inode, &fd);
+                       hfs_find_exit(&fd);
+               }
        }
 }
 
            block < hip->cached_start + hip->cached_blocks)
                return 0;
 
-       hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd);
-       res = __hfsplus_ext_cache_extent(&fd, inode, block);
-       hfs_find_exit(&fd);
+       res = hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd);
+       if (!res) {
+               res = __hfsplus_ext_cache_extent(&fd, inode, block);
+               hfs_find_exit(&fd);
+       }
        return res;
 }
 
        if (total_blocks == blocks)
                return 0;
 
-       hfs_find_init(HFSPLUS_SB(sb)->ext_tree, &fd);
+       res = hfs_find_init(HFSPLUS_SB(sb)->ext_tree, &fd);
+       if (res)
+               return res;
        do {
                res = __hfsplus_ext_read_extent(&fd, ext_entry, cnid,
                                                total_blocks, type);
                struct page *page;
                void *fsdata;
                u32 size = inode->i_size;
-               int res;
 
                res = pagecache_write_begin(NULL, mapping, size, 0,
                                                AOP_FLAG_UNINTERRUPTIBLE,
                goto out;
 
        mutex_lock(&hip->extents_lock);
-       hfs_find_init(HFSPLUS_SB(sb)->ext_tree, &fd);
+       res = hfs_find_init(HFSPLUS_SB(sb)->ext_tree, &fd);
+       if (res) {
+               mutex_unlock(&hip->extents_lock);
+               /* XXX: We lack error handling of hfsplus_file_truncate() */
+               return;
+       }
        while (1) {
                if (alloc_cnt == hip->first_blocks) {
                        hfsplus_free_extents(sb, hip->first_extents,
 
        hip->flags = 0;
        set_bit(HFSPLUS_I_RSRC, &hip->flags);
 
-       hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
-       err = hfsplus_find_cat(sb, dir->i_ino, &fd);
-       if (!err)
-               err = hfsplus_cat_read_inode(inode, &fd);
-       hfs_find_exit(&fd);
+       err = hfs_find_init(HFSPLUS_SB(sb)->cat_tree, &fd);
+       if (!err) {
+               err = hfsplus_find_cat(sb, dir->i_ino, &fd);
+               if (!err)
+                       err = hfsplus_cat_read_inode(inode, &fd);
+               hfs_find_exit(&fd);
+       }
        if (err) {
                iput(inode);
                return ERR_PTR(err);
 
 
        if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID ||
            inode->i_ino == HFSPLUS_ROOT_CNID) {
-               hfs_find_init(HFSPLUS_SB(inode->i_sb)->cat_tree, &fd);
-               err = hfsplus_find_cat(inode->i_sb, inode->i_ino, &fd);
-               if (!err)
-                       err = hfsplus_cat_read_inode(inode, &fd);
-               hfs_find_exit(&fd);
+               err = hfs_find_init(HFSPLUS_SB(inode->i_sb)->cat_tree, &fd);
+               if (!err) {
+                       err = hfsplus_find_cat(inode->i_sb, inode->i_ino, &fd);
+                       if (!err)
+                               err = hfsplus_cat_read_inode(inode, &fd);
+                       hfs_find_exit(&fd);
+               }
        } else {
                err = hfsplus_system_read_inode(inode);
        }
 
        str.len = sizeof(HFSP_HIDDENDIR_NAME) - 1;
        str.name = HFSP_HIDDENDIR_NAME;
-       hfs_find_init(sbi->cat_tree, &fd);
+       err = hfs_find_init(sbi->cat_tree, &fd);
+       if (err)
+               goto out_put_root;
        hfsplus_cat_build_key(sb, fd.search_key, HFSPLUS_ROOT_CNID, &str);
        if (!hfs_brec_read(&fd, &entry, sizeof(entry))) {
                hfs_find_exit(&fd);