return 0;
 }
 
-static u64 ide_disk_set_capacity(ide_drive_t *drive, u64 capacity)
+static void ide_disk_unlock_native_capacity(ide_drive_t *drive)
 {
-       u64 set = min(capacity, drive->probed_capacity);
        u16 *id = drive->id;
        int lba48 = ata_id_lba48_enabled(id);
 
        if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 ||
            ata_id_hpa_enabled(id) == 0)
-               goto out;
+               return;
 
        /*
         * according to the spec the SET MAX ADDRESS command shall be
         * immediately preceded by a READ NATIVE MAX ADDRESS command
         */
-       capacity = ide_disk_hpa_get_native_capacity(drive, lba48);
-       if (capacity == 0)
-               goto out;
-
-       set = ide_disk_hpa_set_capacity(drive, set, lba48);
-       if (set) {
-               /* needed for ->resume to disable HPA */
-               drive->dev_flags |= IDE_DFLAG_NOHPA;
-               return set;
-       }
-out:
-       return drive->capacity64;
+       if (!ide_disk_hpa_get_native_capacity(drive, lba48))
+               return;
+
+       if (ide_disk_hpa_set_capacity(drive, drive->probed_capacity, lba48))
+               drive->dev_flags |= IDE_DFLAG_NOHPA; /* disable HPA on resume */
 }
 
 static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
 }
 
 const struct ide_disk_ops ide_ata_disk_ops = {
-       .check          = ide_disk_check,
-       .set_capacity   = ide_disk_set_capacity,
-       .get_capacity   = ide_disk_get_capacity,
-       .setup          = ide_disk_setup,
-       .flush          = ide_disk_flush,
-       .init_media     = ide_disk_init_media,
-       .set_doorlock   = ide_disk_set_doorlock,
-       .do_request     = ide_do_rw_disk,
-       .ioctl          = ide_disk_ioctl,
+       .check                  = ide_disk_check,
+       .unlock_native_capacity = ide_disk_unlock_native_capacity,
+       .get_capacity           = ide_disk_get_capacity,
+       .setup                  = ide_disk_setup,
+       .flush                  = ide_disk_flush,
+       .init_media             = ide_disk_init_media,
+       .set_doorlock           = ide_disk_set_doorlock,
+       .do_request             = ide_do_rw_disk,
+       .ioctl                  = ide_disk_ioctl,
 };
 
        return ret;
 }
 
-static unsigned long long ide_gd_set_capacity(struct gendisk *disk,
-                                             unsigned long long capacity)
+static void ide_gd_unlock_native_capacity(struct gendisk *disk)
 {
        struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj);
        ide_drive_t *drive = idkp->drive;
        const struct ide_disk_ops *disk_ops = drive->disk_ops;
 
-       if (disk_ops->set_capacity)
-               return disk_ops->set_capacity(drive, capacity);
-
-       return drive->capacity64;
+       if (disk_ops->unlock_native_capacity)
+               disk_ops->unlock_native_capacity(drive);
 }
 
 static int ide_gd_revalidate_disk(struct gendisk *disk)
        .locked_ioctl           = ide_gd_ioctl,
        .getgeo                 = ide_gd_getgeo,
        .media_changed          = ide_gd_media_changed,
-       .set_capacity           = ide_gd_set_capacity,
+       .unlock_native_capacity = ide_gd_unlock_native_capacity,
        .revalidate_disk        = ide_gd_revalidate_disk
 };
 
 
                               "%s: p%d size %llu exceeds device capacity, ",
                               disk->disk_name, p, (unsigned long long) size);
 
-                       if (bdops->set_capacity &&
+                       if (bdops->unlock_native_capacity &&
                            (disk->flags & GENHD_FL_NATIVE_CAPACITY) == 0) {
                                printk(KERN_CONT "enabling native capacity\n");
-                               bdops->set_capacity(disk, ~0ULL);
+                               bdops->unlock_native_capacity(disk);
                                disk->flags |= GENHD_FL_NATIVE_CAPACITY;
                                /* free state and restart */
                                kfree(state);
 
        int (*direct_access) (struct block_device *, sector_t,
                                                void **, unsigned long *);
        int (*media_changed) (struct gendisk *);
-       unsigned long long (*set_capacity) (struct gendisk *,
-                                               unsigned long long);
+       void (*unlock_native_capacity) (struct gendisk *);
        int (*revalidate_disk) (struct gendisk *);
        int (*getgeo)(struct block_device *, struct hd_geometry *);
        struct module *owner;