Large Block Device patch part 6 of 9

From: Peter Chubb (peter@chubb.wattle.id.au)
Date: Fri Aug 23 2002 - 00:56:38 EST


This patch is a bit of a grab-bag; it adds the sector_div() macro
needed to make the previous RAID patch work; and it adds casts to avoid
64-bit division where it's not necessary, and where the dividend
cannot be more than 2^31.

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.513 -> 1.514
# drivers/mtd/devices/blkmtd.c 1.15 -> 1.16
# drivers/block/ll_rw_blk.c 1.99 -> 1.100
# drivers/ieee1394/sbp2.c 1.9 -> 1.10
# drivers/block/floppy.c 1.36 -> 1.37
# drivers/scsi/sd.c 1.52 -> 1.53
# include/linux/blkdev.h 1.60 -> 1.61
# drivers/scsi/sr.c 1.35 -> 1.36
# drivers/mtd/mtdblock.c 1.21 -> 1.22
# drivers/ide/ide-cd.c 1.2 -> 1.3
# drivers/ide/ide-floppy.c 1.1 -> 1.2
# drivers/scsi/sd.h 1.3 -> 1.4
# drivers/block/cciss.c 1.52 -> 1.53
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/08/23 peterc@numbat.chubb.wattle.id.au 1.514
# Fix various devices (cciss, scsi, floppy, ide-cd, sbp, mtd, etc; add sector_div() macro.
# --------------------------------------------
#
diff -Nru a/drivers/block/cciss.c b/drivers/block/cciss.c
--- a/drivers/block/cciss.c Fri Aug 23 15:08:49 2002
+++ b/drivers/block/cciss.c Fri Aug 23 15:08:49 2002
@@ -405,7 +405,7 @@
                 } else {
                         driver_geo.heads = 0xff;
                         driver_geo.sectors = 0x3f;
- driver_geo.cylinders = hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
+ driver_geo.cylinders = (int)hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
                 }
                 driver_geo.start=
                         hba[ctlr]->hd[minor(inode->i_rdev)].start_sect;
@@ -1191,7 +1191,7 @@
                         total_size = 0;
                         block_size = BLOCK_SIZE;
         }
- printk(KERN_INFO " blocks= %d block_size= %d\n",
+ printk(KERN_INFO " blocks= %u block_size= %d\n",
                                         total_size, block_size);
         /* Execute the command to read the disk geometry */
         memset(inq_buff, 0, sizeof(InquiryData_struct));
diff -Nru a/drivers/block/floppy.c b/drivers/block/floppy.c
--- a/drivers/block/floppy.c Fri Aug 23 15:08:49 2002
+++ b/drivers/block/floppy.c Fri Aug 23 15:08:49 2002
@@ -489,7 +489,7 @@
  */
 static struct floppy_struct user_params[N_DRIVE];
 
-static int floppy_sizes[256];
+static sector_t floppy_sizes[256];
 
 /*
  * The driver is trying to determine the correct media format
@@ -2664,8 +2664,10 @@
 
         max_sector = _floppy->sect * _floppy->head;
 
- TRACK = CURRENT->sector / max_sector;
- fsector_t = CURRENT->sector % max_sector;
+ /* There can't be more than 2^16 (minimum max int) sectors on
+ a floppy, for goodness sake! */
+ TRACK = (int)CURRENT->sector / max_sector;
+ fsector_t = (int)CURRENT->sector % max_sector;
         if (_floppy->track && TRACK >= _floppy->track) {
                 if (CURRENT->current_nr_sectors & 1) {
                         current_count_sectors = 1;
diff -Nru a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
--- a/drivers/block/ll_rw_blk.c Fri Aug 23 15:08:49 2002
+++ b/drivers/block/ll_rw_blk.c Fri Aug 23 15:08:49 2002
@@ -70,10 +70,10 @@
  *
  * if (!blk_size[MAJOR]) then no minor size checking is done.
  */
-int * blk_size[MAX_BLKDEV];
+sector_t * blk_size[MAX_BLKDEV];
 
 /*
- * How many reqeusts do we allocate per queue,
+ * How many requests do we allocate per queue,
  * and how many do we "batch" on freeing them?
  */
 int queue_nr_requests, batch_requests;
diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
--- a/drivers/ide/ide-cd.c Fri Aug 23 15:08:49 2002
+++ b/drivers/ide/ide-cd.c Fri Aug 23 15:08:49 2002
@@ -2784,11 +2784,13 @@
 static int ll_10byte_cmd_build(request_queue_t *q, struct request *rq)
 {
         int hard_sect = queue_hardsect_size(q);
- sector_t block = rq->hard_sector / (hard_sect >> 9);
+ unsigned block = (long)rq->hard_sector / (hard_sect >> 9);
         unsigned long blocks = rq->hard_nr_sectors / (hard_sect >> 9);
 
         if (!(rq->flags & REQ_CMD))
                 return 0;
+
+ BUG_ON(sizeof(rq->hard_sector) > 4 && (rq->hard_sector >> 32));
 
         if (rq->hard_nr_sectors != rq->nr_sectors) {
                 printk(KERN_ERR "ide-cd: hard_nr_sectors differs from nr_sectors! %lu %lu\n",
diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
--- a/drivers/ide/ide-floppy.c Fri Aug 23 15:08:49 2002
+++ b/drivers/ide/ide-floppy.c Fri Aug 23 15:08:49 2002
@@ -1379,7 +1379,7 @@
                 return ide_stopped;
         }
         if (rq->flags & REQ_CMD) {
- if ((rq->sector % floppy->bs_factor) ||
+ if (((long)rq->sector % floppy->bs_factor) ||
                     (rq->nr_sectors % floppy->bs_factor)) {
                         printk("%s: unsupported r/w request size\n",
                                 drive->name);
diff -Nru a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
--- a/drivers/ieee1394/sbp2.c Fri Aug 23 15:08:49 2002
+++ b/drivers/ieee1394/sbp2.c Fri Aug 23 15:08:49 2002
@@ -3105,12 +3105,13 @@
 
         heads = 64;
         sectors = 32;
- cylinders = disk->capacity / (heads * sectors);
+ cylinders = (int)disk->capacity / (heads * sectors);
+
 
         if (cylinders > 1024) {
                 heads = 255;
                 sectors = 63;
- cylinders = disk->capacity / (heads * sectors);
+ cylinders = (int)disk->capacity / (heads * sectors);
         }
 
         geom[0] = heads;
diff -Nru a/drivers/mtd/devices/blkmtd.c b/drivers/mtd/devices/blkmtd.c
--- a/drivers/mtd/devices/blkmtd.c Fri Aug 23 15:08:49 2002
+++ b/drivers/mtd/devices/blkmtd.c Fri Aug 23 15:08:49 2002
@@ -163,9 +163,10 @@
 static int blkmtd_readpage(mtd_raw_dev_data_t *rawdevice, struct page *page)
 {
   int err;
- int sectornr, sectors, i;
+ sector_t sectornr;
+ int sectors, i;
   struct kiobuf *iobuf;
- unsigned long *blocks;
+ sector_t *blocks;
 
   if(!rawdevice) {
     printk("blkmtd: readpage: PANIC file->private_data == NULL\n");
@@ -224,7 +225,7 @@
 
   /* Pre 2.4.4 doesn't have space for the block list in the kiobuf */
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,4)
- blocks = kmalloc(KIO_MAX_SECTORS * sizeof(unsigned long));
+ blocks = kmalloc(KIO_MAX_SECTORS * sizeof(*blocks));
   if(blocks == NULL) {
     printk("blkmtd: cant allocate iobuf blocks\n");
     free_kiovec(1, &iobuf);
@@ -240,7 +241,7 @@
   iobuf->length = PAGE_SIZE;
   iobuf->locked = 1;
   iobuf->maplist[0] = page;
- sectornr = page->index << (PAGE_SHIFT - rawdevice->sector_bits);
+ sectornr = (sector_t)page->index << (PAGE_SHIFT - rawdevice->sector_bits);
   sectors = 1 << (PAGE_SHIFT - rawdevice->sector_bits);
   if(rawdevice->partial_last_page && page->index == rawdevice->partial_last_page) {
     DEBUG(3, "blkmtd: handling partial last page\n");
diff -Nru a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c
--- a/drivers/mtd/mtdblock.c Fri Aug 23 15:08:49 2002
+++ b/drivers/mtd/mtdblock.c Fri Aug 23 15:08:49 2002
@@ -46,7 +46,7 @@
 
 static spinlock_t mtdblks_lock;
 
-static int mtd_sizes[MAX_MTD_DEVICES];
+static sector_t mtd_sizes[MAX_MTD_DEVICES];
 
 /*
  * Cache stuff...
diff -Nru a/drivers/scsi/sd.c b/drivers/scsi/sd.c
--- a/drivers/scsi/sd.c Fri Aug 23 15:08:49 2002
+++ b/drivers/scsi/sd.c Fri Aug 23 15:08:49 2002
@@ -298,7 +298,8 @@
  **/
 static int sd_init_command(Scsi_Cmnd * SCpnt)
 {
- int dsk_nr, part_nr, block, this_count;
+ int dsk_nr, part_nr, this_count;
+ sector_t block;
         Scsi_Device *sdp;
 #if CONFIG_SCSI_LOGGING
         char nbuff[6];
@@ -611,8 +612,8 @@
         int result = SCpnt->result;
         int this_count = SCpnt->bufflen >> 9;
         int good_sectors = (result == 0 ? this_count : 0);
- int block_sectors = 1;
- long error_sector;
+ sector_t block_sectors = 1;
+ sector_t error_sector;
 #if CONFIG_SCSI_LOGGING
         char nbuff[6];
 
@@ -947,7 +948,7 @@
                     SRpnt->sr_sense_buffer[2] == NOT_READY)
                         sdp->changed = 1;
 
- /* Either no media are present but the drive didnt tell us,
+ /* Either no media are present but the drive didn't tell us,
                    or they are present but the read capacity command fails */
                 /* sdkp->media_present = 0; -- not always correct */
                 sdkp->capacity = 0x200000; /* 1 GB - random */
@@ -955,7 +956,7 @@
                 return;
         }
 
- sdkp->capacity = 1 + ((buffer[0] << 24) |
+ sdkp->capacity = 1 + (((sector_t)buffer[0] << 24) |
                               (buffer[1] << 16) |
                               (buffer[2] << 8) |
                               buffer[3]);
diff -Nru a/drivers/scsi/sd.h b/drivers/scsi/sd.h
--- a/drivers/scsi/sd.h Fri Aug 23 15:08:49 2002
+++ b/drivers/scsi/sd.h Fri Aug 23 15:08:49 2002
@@ -23,7 +23,7 @@
 extern struct hd_struct *sd;
 
 typedef struct scsi_disk {
- unsigned capacity; /* size in 512-byte sectors */
+ sector_t capacity; /* size in 512-byte sectors */
         Scsi_Device *device;
         unsigned char media_present;
         unsigned char write_prot;
diff -Nru a/drivers/scsi/sr.c b/drivers/scsi/sr.c
--- a/drivers/scsi/sr.c Fri Aug 23 15:08:49 2002
+++ b/drivers/scsi/sr.c Fri Aug 23 15:08:49 2002
@@ -88,7 +88,7 @@
 };
 
 Scsi_CD *scsi_CDs;
-static int *sr_sizes;
+static sector_t *sr_sizes;
 
 static int sr_open(struct cdrom_device_info *, int);
 void get_sectorsize(int);
@@ -324,7 +324,7 @@
         /*
          * request doesn't start on hw block boundary, add scatter pads
          */
- if ((SCpnt->request->sector % (s_size >> 9)) || (SCpnt->request_bufflen % s_size)) {
+ if (((unsigned int)SCpnt->request->sector % (s_size >> 9)) || (SCpnt->request_bufflen % s_size)) {
                 printk("sr: unaligned transfer\n");
                 return 0;
         }
@@ -340,7 +340,7 @@
         SCpnt->cmnd[1] = (SCpnt->device->scsi_level <= SCSI_2) ?
                          ((SCpnt->lun << 5) & 0xe0) : 0;
 
- block = SCpnt->request->sector / (s_size >> 9);
+ block = (unsigned int)SCpnt->request->sector / (s_size >> 9);
 
         if (this_count > 0xffff)
                 this_count = 0xffff;
@@ -715,10 +715,10 @@
                 goto cleanup_dev;
         memset(scsi_CDs, 0, sr_template.dev_max * sizeof(Scsi_CD));
 
- sr_sizes = kmalloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC);
+ sr_sizes = kmalloc(sr_template.dev_max * sizeof(sr_sizes[0]), GFP_ATOMIC);
         if (!sr_sizes)
                 goto cleanup_cds;
- memset(sr_sizes, 0, sr_template.dev_max * sizeof(int));
+ memset(sr_sizes, 0, sr_template.dev_max * sizeof(sr_sizes[0]));
         return 0;
 
 cleanup_cds:
diff -Nru a/include/linux/blkdev.h b/include/linux/blkdev.h
--- a/include/linux/blkdev.h Fri Aug 23 15:08:49 2002
+++ b/include/linux/blkdev.h Fri Aug 23 15:08:49 2002
@@ -404,4 +404,20 @@
         page_cache_release(p.v);
 }
 
+#ifdef CONFIG_LBD
+# include <asm/div64.h>
+# define sector_div(a, b) do_div(a, b)
+#else
+# define sector_div(n, b)( \
+{ \
+ int _res; \
+ _res = (n) % (b); \
+ (n) /= (b); \
+ _res; \
+} \
+)
+#endif
+
+
+
 #endif
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Aug 23 2002 - 22:00:26 EST