Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus
[pandora-kernel.git] / fs / hfsplus / part_tbl.c
index 40ad88c..eb355d8 100644 (file)
@@ -88,11 +88,12 @@ static int hfs_parse_old_pmap(struct super_block *sb, struct old_pmap *pm,
        return -ENOENT;
 }
 
-static int hfs_parse_new_pmap(struct super_block *sb, struct new_pmap *pm,
-               sector_t *part_start, sector_t *part_size)
+static int hfs_parse_new_pmap(struct super_block *sb, void *buf,
+               struct new_pmap *pm, sector_t *part_start, sector_t *part_size)
 {
        struct hfsplus_sb_info *sbi = HFSPLUS_SB(sb);
        int size = be32_to_cpu(pm->pmMapBlkCnt);
+       int buf_size = hfsplus_min_io_size(sb);
        int res;
        int i = 0;
 
@@ -107,11 +108,14 @@ static int hfs_parse_new_pmap(struct super_block *sb, struct new_pmap *pm,
                if (++i >= size)
                        return -ENOENT;
 
-               res = hfsplus_submit_bio(sb->s_bdev,
-                                        *part_start + HFS_PMAP_BLK + i,
-                                        pm, READ);
-               if (res)
-                       return res;
+               pm = (struct new_pmap *)((u8 *)pm + HFSPLUS_SECTOR_SIZE);
+               if ((u8 *)pm - (u8 *)buf >= buf_size) {
+                       res = hfsplus_submit_bio(sb,
+                                                *part_start + HFS_PMAP_BLK + i,
+                                                buf, (void **)&pm, READ);
+                       if (res)
+                               return res;
+               }
        } while (pm->pmSig == cpu_to_be16(HFS_NEW_PMAP_MAGIC));
 
        return -ENOENT;
@@ -124,15 +128,15 @@ static int hfs_parse_new_pmap(struct super_block *sb, struct new_pmap *pm,
 int hfs_part_find(struct super_block *sb,
                sector_t *part_start, sector_t *part_size)
 {
-       void *data;
+       void *buf, *data;
        int res;
 
-       data = kmalloc(HFSPLUS_SECTOR_SIZE, GFP_KERNEL);
-       if (!data)
+       buf = kmalloc(hfsplus_min_io_size(sb), GFP_KERNEL);
+       if (!buf)
                return -ENOMEM;
 
-       res = hfsplus_submit_bio(sb->s_bdev, *part_start + HFS_PMAP_BLK,
-                                data, READ);
+       res = hfsplus_submit_bio(sb, *part_start + HFS_PMAP_BLK,
+                                buf, &data, READ);
        if (res)
                goto out;
 
@@ -141,13 +145,13 @@ int hfs_part_find(struct super_block *sb,
                res = hfs_parse_old_pmap(sb, data, part_start, part_size);
                break;
        case HFS_NEW_PMAP_MAGIC:
-               res = hfs_parse_new_pmap(sb, data, part_start, part_size);
+               res = hfs_parse_new_pmap(sb, buf, data, part_start, part_size);
                break;
        default:
                res = -ENOENT;
                break;
        }
 out:
-       kfree(data);
+       kfree(buf);
        return res;
 }