Trying to get rid of as many as possible ioctl_by_bdev callers to reduce
set_fs instances.

Signed-off-by: Christoph Hellwig <[email protected]>
---
 block/partitions/ibm.c | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/block/partitions/ibm.c b/block/partitions/ibm.c
index 14b081af8d61..3ef8bfa3db9d 100644
--- a/block/partitions/ibm.c
+++ b/block/partitions/ibm.c
@@ -282,7 +282,6 @@ static int find_cms1_partitions(struct parsed_partitions 
*state,
        return 1;
 }
 
-
 /*
  * This is the main function, called by check.c
  */
@@ -292,7 +291,7 @@ int ibm_partition(struct parsed_partitions *state)
        int blocksize, res;
        loff_t i_size, offset, size;
        dasd_information2_t *info;
-       struct hd_geometry *geo;
+       struct hd_geometry geo = { 0, };
        char type[5] = {0,};
        char name[7] = {0,};
        sector_t labelsect;
@@ -308,30 +307,30 @@ int ibm_partition(struct parsed_partitions *state)
        info = kmalloc(sizeof(dasd_information2_t), GFP_KERNEL);
        if (info == NULL)
                goto out_exit;
-       geo = kmalloc(sizeof(struct hd_geometry), GFP_KERNEL);
-       if (geo == NULL)
-               goto out_nogeo;
        label = kmalloc(sizeof(union label_t), GFP_KERNEL);
        if (label == NULL)
                goto out_nolab;
-       if (ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0)
+       if (!bdev->bd_disk->fops->getgeo)
+               goto out_freeall;
+       geo.start = get_start_sect(bdev);
+       if (bdev->bd_disk->fops->getgeo(bdev, &geo) != 0)
                goto out_freeall;
        if (ioctl_by_bdev(bdev, BIODASDINFO2, (unsigned long)info) != 0) {
                kfree(info);
                info = NULL;
        }
 
-       if (find_label(state, info, geo, blocksize, &labelsect, name, type,
+       if (find_label(state, info, &geo, blocksize, &labelsect, name, type,
                       label)) {
                if (!strncmp(type, "VOL1", 4)) {
-                       res = find_vol1_partitions(state, geo, blocksize, name,
+                       res = find_vol1_partitions(state, &geo, blocksize, name,
                                                   label);
                } else if (!strncmp(type, "LNX1", 4)) {
-                       res = find_lnx1_partitions(state, geo, blocksize, name,
+                       res = find_lnx1_partitions(state, &geo, blocksize, name,
                                                   label, labelsect, i_size,
                                                   info);
                } else if (!strncmp(type, "CMS1", 4)) {
-                       res = find_cms1_partitions(state, geo, blocksize, name,
+                       res = find_cms1_partitions(state, &geo, blocksize, name,
                                                   label, labelsect);
                }
        } else if (info) {
@@ -356,8 +355,6 @@ int ibm_partition(struct parsed_partitions *state)
 out_freeall:
        kfree(label);
 out_nolab:
-       kfree(geo);
-out_nogeo:
        kfree(info);
 out_exit:
        return res;
-- 
2.11.0

Reply via email to