Commit 3f7705ea authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Linus Torvalds

[PATCH] cciss: Fix warnings (and bug on 1TB discs)

CCISS was producing warnings about shifts being greater than the size of
the type and pointers being of incompatible type.  Turns out this is
because it's calling do_div on a 32-bit quantity.  Upon further
investigation, the sector_t total_size is being assigned to an int, and
then we're calling do_div on that int.  Obviously, sector_div is called for
here, and I took the chance to refactor the code a little.
Signed-off-by: default avatarMatthew Wilcox <matthew@wil.cx>
Acked-by: default avatarMike Miller <mike.miller@hp.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8a7822a6
...@@ -1923,7 +1923,6 @@ static void cciss_geometry_inquiry(int ctlr, int logvol, ...@@ -1923,7 +1923,6 @@ static void cciss_geometry_inquiry(int ctlr, int logvol,
{ {
int return_code; int return_code;
unsigned long t; unsigned long t;
unsigned long rem;
memset(inq_buff, 0, sizeof(InquiryData_struct)); memset(inq_buff, 0, sizeof(InquiryData_struct));
if (withirq) if (withirq)
...@@ -1939,26 +1938,23 @@ static void cciss_geometry_inquiry(int ctlr, int logvol, ...@@ -1939,26 +1938,23 @@ static void cciss_geometry_inquiry(int ctlr, int logvol,
printk(KERN_WARNING printk(KERN_WARNING
"cciss: reading geometry failed, volume " "cciss: reading geometry failed, volume "
"does not support reading geometry\n"); "does not support reading geometry\n");
drv->block_size = block_size;
drv->nr_blocks = total_size;
drv->heads = 255; drv->heads = 255;
drv->sectors = 32; // Sectors per track drv->sectors = 32; // Sectors per track
t = drv->heads * drv->sectors;
drv->cylinders = total_size;
rem = do_div(drv->cylinders, t);
} else { } else {
drv->block_size = block_size;
drv->nr_blocks = total_size;
drv->heads = inq_buff->data_byte[6]; drv->heads = inq_buff->data_byte[6];
drv->sectors = inq_buff->data_byte[7]; drv->sectors = inq_buff->data_byte[7];
drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8; drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8;
drv->cylinders += inq_buff->data_byte[5]; drv->cylinders += inq_buff->data_byte[5];
drv->raid_level = inq_buff->data_byte[8]; drv->raid_level = inq_buff->data_byte[8];
t = drv->heads * drv->sectors; }
if (t > 1) { drv->block_size = block_size;
drv->cylinders = total_size; drv->nr_blocks = total_size;
rem = do_div(drv->cylinders, t); t = drv->heads * drv->sectors;
} if (t > 1) {
unsigned rem = sector_div(total_size, t);
if (rem)
total_size++;
drv->cylinders = total_size;
} }
} else { /* Get geometry failed */ } else { /* Get geometry failed */
printk(KERN_WARNING "cciss: reading geometry failed\n"); printk(KERN_WARNING "cciss: reading geometry failed\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment