# 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	v2.4.20 -> 1.781  
#	drivers/block/ps2esdi.c	1.19    -> 1.20   
#	drivers/scsi/megaraid.c	1.19    -> 1.20   
#	drivers/ide/ide-probe.c	1.12    -> 1.13   
#	drivers/block/cciss.h	1.7     -> 1.8    
#	  drivers/md/raid1.c	1.15    -> 1.16   
#	drivers/ide/ide-disk.c	1.11    -> 1.12   
#	  drivers/scsi/ips.c	1.17    -> 1.18   
#	fs/partitions/atari.h	1.2     -> 1.3    
#	drivers/scsi/ide-scsi.c	1.6     -> 1.7    
#	  drivers/scsi/ppa.c	1.6     -> 1.7    
#	include/asm-i386/types.h	1.3     -> 1.4    
#	drivers/scsi/scsicam.c	1.2     -> 1.3    
#	drivers/mtd/devices/blkmtd.c	1.4     -> 1.5    
#	drivers/scsi/aacraid/linit.c	1.3     -> 1.4    
#	fs/reiserfs/journal.c	1.24    -> 1.25   
#	include/linux/raid/md_k.h	1.9     -> 1.10   
#	drivers/scsi/aha152x.c	1.13    -> 1.14   
#	    drivers/md/lvm.c	1.17    -> 1.18   
#	drivers/block/blkpg.c	1.9     -> 1.10   
#	fs/partitions/msdos.c	1.10    -> 1.11   
#	fs/partitions/acorn.c	1.3     -> 1.4    
#	  drivers/char/raw.c	1.7     -> 1.8    
#	include/linux/raid/md.h	1.4     -> 1.5    
#	     fs/ext2/inode.c	1.16    -> 1.17   
#	     fs/jbd/revoke.c	1.4     -> 1.5    
#	drivers/block/ll_rw_blk.c	1.40    -> 1.41   
#	drivers/scsi/ibmmca.c	1.4     -> 1.5    
#	fs/partitions/ultrix.c	1.2     -> 1.3    
#	        mm/page_io.c	1.9     -> 1.10   
#	drivers/ieee1394/sbp2.c	1.12    -> 1.13   
#	drivers/block/cpqarray.c	1.25    -> 1.26   
#	include/linux/genhd.h	1.12    -> 1.13   
#	drivers/block/floppy.c	1.12    -> 1.13   
#	       fs/bfs/file.c	1.2     -> 1.3    
#	    fs/jbd/journal.c	1.8     -> 1.9    
#	drivers/ide/ide-tape.c	1.10    -> 1.11   
#	 fs/partitions/osf.h	1.2     -> 1.3    
#	drivers/scsi/in2000.c	1.4     -> 1.5    
#	 fs/partitions/sgi.c	1.2     -> 1.3    
#	 include/linux/ide.h	1.6     -> 1.7    
#	      fs/ufs/inode.c	1.5     -> 1.6    
#	 fs/partitions/mac.c	1.3     -> 1.4    
#	   drivers/scsi/sd.c	1.22    -> 1.23   
#	 fs/partitions/osf.c	1.3     -> 1.4    
#	include/linux/blkdev.h	1.22    -> 1.23   
#	drivers/ide/pdc4030.c	1.4     -> 1.5    
#	 drivers/block/nbd.c	1.13    -> 1.14   
#	fs/freevxfs/vxfs_kcompat.h	1.2     -> 1.3    
#	drivers/ide/ide-floppy.c	1.11    -> 1.12   
#	   drivers/scsi/sr.c	1.14    -> 1.15   
#	include/linux/msdos_fs.h	1.4     -> 1.5    
#	 drivers/scsi/scsi.h	1.8     -> 1.9    
#	  include/linux/fs.h	1.69    -> 1.70   
#	drivers/block/Config.in	1.8     -> 1.9    
#	drivers/scsi/ini9100u.c	1.4     -> 1.5    
#	       fs/fat/file.c	1.3     -> 1.4    
#	drivers/scsi/Makefile	1.15    -> 1.16   
#	include/linux/iobuf.h	1.3     -> 1.4    
#	  drivers/block/xd.c	1.13    -> 1.14   
#	     fs/sysv/itree.c	1.2     -> 1.3    
#	drivers/scsi/dpt_i2o.c	1.8     -> 1.9    
#	 fs/partitions/sgi.h	1.2     -> 1.3    
#	     drivers/md/md.c	1.33    -> 1.34   
#	drivers/scsi/advansys.c	1.8     -> 1.9    
#	fs/freevxfs/vxfs_subr.c	1.5     -> 1.6    
#	drivers/scsi/inia100.c	1.4     -> 1.5    
#	 fs/partitions/ldm.h	1.6     -> 1.7    
#	       fs/fat/misc.c	1.3     -> 1.4    
#	    init/do_mounts.c	1.34    -> 1.35   
#	     fs/adfs/inode.c	1.4     -> 1.5    
#	      fs/jfs/inode.c	1.7     -> 1.8    
#	     fs/qnx4/inode.c	1.9     -> 1.10   
#	 fs/reiserfs/inode.c	1.39    -> 1.40   
#	include/linux/types.h	1.2     -> 1.4    
#	       fs/hfs/file.c	1.4     -> 1.5    
#	     fs/jbd/commit.c	1.5     -> 1.6    
#	fs/partitions/atari.c	1.2     -> 1.3    
#	include/asm-ppc/types.h	1.4     -> 1.5    
#	 fs/partitions/sun.c	1.3     -> 1.4    
#	fs/partitions/check.c	1.16    -> 1.17   
#	 fs/partitions/ldm.c	1.6     -> 1.7    
#	fs/partitions/check.h	1.2     -> 1.3    
#	drivers/mtd/mtdblock.c	1.8     -> 1.9    
#	drivers/scsi/3w-xxxx.c	1.15    -> 1.16   
#	drivers/scsi/atp870u.c	1.8     -> 1.9    
#	      fs/efs/inode.c	1.3     -> 1.4    
#	include/scsi/scsicam.h	1.1     -> 1.2    
#	drivers/scsi/aic7xxx_old.c	1.14    -> 1.15   
#	include/linux/raid/linear.h	1.1     -> 1.2    
#	 drivers/md/linear.c	1.3     -> 1.4    
#	drivers/scsi/aic7xxx/aic7xxx_osm.c	1.17    -> 1.19   
#	 fs/partitions/efi.h	1.2     -> 1.3    
#	 fs/partitions/sun.h	1.2     -> 1.3    
#	        fs/hfs/hfs.h	1.2     -> 1.3    
#	drivers/ide/ide-cd.c	1.17    -> 1.18   
#	fs/partitions/ultrix.h	1.2     -> 1.3    
#	      fs/hpfs/file.c	1.2     -> 1.3    
#	      fs/fat/inode.c	1.13    -> 1.14   
#	 fs/reiserfs/super.c	1.27    -> 1.28   
#	drivers/ide/ataraid.c	1.4     -> 1.5    
#	drivers/md/multipath.c	1.4     -> 1.5    
#	drivers/block/genhd.c	1.24    -> 1.25   
#	      fs/affs/file.c	1.8     -> 1.9    
#	fs/partitions/amiga.c	1.2     -> 1.3    
#	      fs/hfs/inode.c	1.4     -> 1.5    
#	drivers/scsi/qlogicfas.c	1.7     -> 1.8    
#	include/linux/loop.h	1.5     -> 1.6    
#	fs/intermezzo/journal_ext3.c	1.2     -> 1.3    
#	include/linux/qnx4_fs.h	1.1     -> 1.2    
#	    fs/ext3/ialloc.c	1.4     -> 1.5    
#	drivers/scsi/scsi_lib.c	1.15    -> 1.16   
#	 fs/partitions/efi.c	1.2     -> 1.3    
#	      fs/block_dev.c	1.31    -> 1.32   
#	 drivers/scsi/scsi.c	1.17    -> 1.18   
#	  fs/befs/linuxvfs.c	1.1     -> 1.2    
#	      fs/udf/inode.c	1.8     -> 1.9    
#	    fs/minix/inode.c	1.8     -> 1.9    
#	  drivers/md/raid0.c	1.3     -> 1.4    
#	         fs/buffer.c	1.76    -> 1.77   
#	drivers/block/loop.c	1.24    -> 1.26   
#	       fs/efs/file.c	1.1     -> 1.2    
#	   drivers/scsi/sd.h	1.2     -> 1.3    
#	   fs/hpfs/hpfs_fn.h	1.3     -> 1.4    
#	fs/partitions/msdos.h	1.2     -> 1.3    
#	  drivers/block/rd.c	1.30    -> 1.31   
#	fs/reiserfs/prints.c	1.12    -> 1.13   
#	include/linux/iso_fs.h	1.4     -> 1.5    
#	 drivers/scsi/gdth.c	1.8     -> 1.9    
#	fs/partitions/acorn.h	1.2     -> 1.3    
#	fs/minix/itree_common.c	1.5     -> 1.6    
#	drivers/block/cpqarray.h	1.5     -> 1.6    
#	     fs/ext3/inode.c	1.10    -> 1.11   
#	drivers/block/umem.c	1.5     -> 1.6    
#	     fs/affs/super.c	1.9     -> 1.10   
#	fs/partitions/amiga.h	1.2     -> 1.3    
#	drivers/message/i2o/i2o_block.c	1.17    -> 1.18   
#	drivers/md/lvm-snap.c	1.11    -> 1.12   
#	 fs/partitions/mac.h	1.3     -> 1.4    
#	drivers/block/DAC960.c	1.17    -> 1.18   
#	drivers/block/DAC960.h	1.5     -> 1.6    
#	 drivers/scsi/t128.c	1.3     -> 1.4    
#	Documentation/Configure.help	1.141   -> 1.142  
#	      fs/adfs/adfs.h	1.1     -> 1.2    
#	drivers/scsi/BusLogic.c	1.4     -> 1.5    
#	    fs/isofs/inode.c	1.9     -> 1.10   
#	drivers/block/cciss.c	1.26    -> 1.27   
#	   drivers/ide/ide.c	1.23    -> 1.24   
#	drivers/scsi/wd7000.c	1.4     -> 1.5    
#	          fs/inode.c	1.35    -> 1.36   
#	  drivers/scsi/imm.c	1.5     -> 1.6    
#	drivers/scsi/qla1280.c	1.6     -> 1.7    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/11/29	marcelo@freak.distro.conectiva	1.779
#   Changed Makefile to 2.4.20
# --------------------------------------------
# 03/04/01	peterc@wombat.disy.cse.unsw.edu.au	1.780
# 2.4.20-lbd-1.patch
# --------------------------------------------
# 03/04/07	peterc@wombat.disy.cse.unsw.edu.au	1.781
# Patch from Eric Sandeen (sandeen@sgi.com): reinstate compute_loop_size() for better
#     interaction with other third-party patches; add HAVE_SECTOR_T definition;
#     fix adaptec SCSI driver problem
# --------------------------------------------
#
diff -Nru a/Documentation/Configure.help b/Documentation/Configure.help
--- a/Documentation/Configure.help	Mon Apr  7 13:52:18 2003
+++ b/Documentation/Configure.help	Mon Apr  7 13:52:18 2003
@@ -564,6 +564,11 @@
 
   If unsure, say N.
 
+Large disc support
+CONFIG_LBD
+  If you have mass-storage devices bigger than 2TB and want to access them,
+  say Y here, and your kernel will use 64-bit sector offsets throughout.
+
 ATA/IDE/MFM/RLL support
 CONFIG_IDE
   If you say Y here, your kernel will be able to manage low cost mass
diff -Nru a/drivers/block/Config.in b/drivers/block/Config.in
--- a/drivers/block/Config.in	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/Config.in	Mon Apr  7 13:52:18 2003
@@ -50,4 +50,5 @@
 
 bool 'Per partition statistics in /proc/partitions' CONFIG_BLK_STATS
 
+bool 'Support for discs bigger than 2TB?' CONFIG_LBD
 endmenu
diff -Nru a/drivers/block/DAC960.c b/drivers/block/DAC960.c
--- a/drivers/block/DAC960.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/DAC960.c	Mon Apr  7 13:52:18 2003
@@ -5479,12 +5479,17 @@
 	Controller->GenericDiskInfo.part[MINOR(Inode->i_rdev)].start_sect;
       return (copy_to_user(UserGeometry, &Geometry,
 			   sizeof(DiskGeometry_T)) ? -EFAULT : 0);
-    case BLKGETSIZE:
+    case BLKGETSIZE: {
       /* Get Device Size. */
-      if ((unsigned long *) Argument == NULL) return -EINVAL;
-      return put_user(Controller->GenericDiskInfo.part[MINOR(Inode->i_rdev)]
-						 .nr_sects,
-		      (unsigned long *) Argument);
+	    unsigned long sz;
+	    if ((unsigned long *) Argument == NULL) return -EINVAL;
+	    sz = Controller->GenericDiskInfo.part[MINOR(Inode->i_rdev)]
+		    .nr_sects;
+	    if ((sector_t)sz !=  Controller->GenericDiskInfo.part[MINOR(Inode->i_rdev)]
+		.nr_sects)
+		    return -EFBIG;
+	    return put_user(sz, (unsigned long *) Argument);
+    }
     case BLKGETSIZE64:
       if ((u64 *) Argument == NULL) return -EINVAL;
       return put_user((u64) Controller->GenericDiskInfo
diff -Nru a/drivers/block/DAC960.h b/drivers/block/DAC960.h
--- a/drivers/block/DAC960.h	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/DAC960.h	Mon Apr  7 13:52:18 2003
@@ -2473,7 +2473,7 @@
     } V2;
   } FW;
   DiskPartition_T DiskPartitions[DAC960_MinorCount];
-  int PartitionSizes[DAC960_MinorCount];
+  sector_t PartitionSizes[DAC960_MinorCount];
   int BlockSizes[DAC960_MinorCount];
   int MaxSectorsPerRequest[DAC960_MinorCount];
   unsigned char ProgressBuffer[DAC960_ProgressBufferSize];
diff -Nru a/drivers/block/blkpg.c b/drivers/block/blkpg.c
--- a/drivers/block/blkpg.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/block/blkpg.c	Mon Apr  7 13:52:17 2003
@@ -65,8 +65,9 @@
  */
 int add_partition(kdev_t dev, struct blkpg_partition *p) {
 	struct gendisk *g;
-	long long ppstart, pplength;
-	long pstart, plength;
+	long long ppstart;
+	long long pplength;
+	sector_t pstart, plength;
 	int i, drive, first_minor, end_minor, minor;
 
 	/* convert bytes to sectors, check for fit in a hd_struct */
@@ -246,10 +247,12 @@
 			if (g)
 				ullval = g->part[MINOR(dev)].nr_sects;
 
-			if (cmd == BLKGETSIZE)
+			if (cmd == BLKGETSIZE) {
+				if ((unsigned long)ullval != ullval)
+					return -EFBIG;
 				return put_user((unsigned long)ullval, (unsigned long *)arg);
-			else
-				return put_user(ullval << 9, (u64 *)arg);
+			}
+			return put_user(ullval << 9, (u64 *)arg);
 #if 0
 		case BLKRRPART: /* Re-read partition tables */
 			if (!capable(CAP_SYS_ADMIN)) 
diff -Nru a/drivers/block/cciss.c b/drivers/block/cciss.c
--- a/drivers/block/cciss.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/cciss.c	Mon Apr  7 13:52:18 2003
@@ -430,7 +430,7 @@
 			driver_geo.heads = 0xff;
 			driver_geo.sectors = 0x3f;
 			driver_geo.cylinders = 
-				hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
+				(int)hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
 		}
 		driver_geo.start=
 			hba[ctlr]->hd[MINOR(inode->i_rdev)].start_sect;
@@ -450,7 +450,7 @@
 			driver_geo.heads = 0xff;
 			driver_geo.sectors = 0x3f;
 			driver_geo.cylinders = 
-				hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
+				(int)hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
 		}
 		driver_geo.start= 
 		hba[ctlr]->hd[MINOR(inode->i_rdev)].start_sect;
@@ -459,16 +459,12 @@
 			return  -EFAULT;
 		return(0);
 	}
-	case BLKGETSIZE:
-		put_user(hba[ctlr]->hd[MINOR(inode->i_rdev)].nr_sects, (unsigned long *)arg);
-		return 0;
-	case BLKGETSIZE64:
-		put_user((u64)hba[ctlr]->hd[MINOR(inode->i_rdev)].nr_sects << 9, (u64*)arg);
-		return 0;
 	case BLKRRPART:
 		if(!capable(CAP_SYS_ADMIN))
 			return -EPERM;
 		return revalidate_logvol(inode->i_rdev, 1);
+	case BLKGETSIZE64:
+	case BLKGETSIZE:
 	case BLKFLSBUF:
 	case BLKBSZSET:
 	case BLKBSZGET:
diff -Nru a/drivers/block/cciss.h b/drivers/block/cciss.h
--- a/drivers/block/cciss.h	Mon Apr  7 13:52:17 2003
+++ b/drivers/block/cciss.h	Mon Apr  7 13:52:17 2003
@@ -82,7 +82,7 @@
 	struct gendisk   gendisk;
 	   // indexed by minor numbers
 	struct hd_struct hd[256];
-	int              sizes[256];
+	sector_t         sizes[256];
 	int              blocksizes[256];
 	int              hardsizes[256];
 #ifdef CONFIG_CISS_SCSI_TAPE
diff -Nru a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
--- a/drivers/block/cpqarray.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/cpqarray.c	Mon Apr  7 13:52:18 2003
@@ -1287,12 +1287,6 @@
 
 	case IDAGETDRVINFO:
 		return copy_to_user(&io->c.drv,&hba[ctlr]->drv[dsk],sizeof(drv_info_t));
-	case BLKGETSIZE:
-		if (!arg) return -EINVAL;
-		return put_user(hba[ctlr]->hd[MINOR(inode->i_rdev)].nr_sects, 
-			(unsigned long *)arg);
-	case BLKGETSIZE64:
-		return put_user((u64)(hba[ctlr]->hd[MINOR(inode->i_rdev)].nr_sects) << 9, (u64*)arg);
 	case BLKRRPART:
 		return revalidate_logvol(inode->i_rdev, 1);
 	case IDAPASSTHRU:
@@ -1360,6 +1354,8 @@
 		return(0);
 	}
 
+	case BLKGETSIZE:
+	case BLKGETSIZE64:
 	case BLKFLSBUF:
 	case BLKBSZSET:
 	case BLKBSZGET:
diff -Nru a/drivers/block/cpqarray.h b/drivers/block/cpqarray.h
--- a/drivers/block/cpqarray.h	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/cpqarray.h	Mon Apr  7 13:52:18 2003
@@ -123,7 +123,7 @@
 	struct gendisk gendisk;
 	// Index by Minor Numbers
 	struct hd_struct	hd[256];
-	int			sizes[256];
+	sector_t		sizes[256];
 	int			blocksizes[256];
 	int			hardsizes[256];
 };
diff -Nru a/drivers/block/floppy.c b/drivers/block/floppy.c
--- a/drivers/block/floppy.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/floppy.c	Mon Apr  7 13:52:18 2003
@@ -480,7 +480,7 @@
  */
 static struct floppy_struct user_params[N_DRIVE];
 
-static int floppy_sizes[256];
+static sector_t floppy_sizes[256];
 static int floppy_blocksizes[256];
 
 /*
@@ -582,7 +582,7 @@
 static struct floppy_struct *_floppy = floppy_type;
 static unsigned char current_drive;
 static long current_count_sectors;
-static unsigned char sector_t; /* sector in track */
+static unsigned char sector; /* sector in track */
 static unsigned char in_sector_offset;	/* offset within physical sector,
 					 * expressed in units of 512 bytes */
 
@@ -2383,7 +2383,7 @@
 		printk("rt=%d t=%d\n", R_TRACK, TRACK);
 		printk("heads=%d eoc=%d\n", heads, eoc);
 		printk("spt=%d st=%d ss=%d\n", SECT_PER_TRACK,
-		       sector_t, ssize);
+		       sector, ssize);
 		printk("in_sector_offset=%d\n", in_sector_offset);
 	}
 #endif
@@ -2430,7 +2430,7 @@
 	} else if (CT(COMMAND) == FD_READ){
 		buffer_track = raw_cmd->track;
 		buffer_drive = current_drive;
-		INFBOUND(buffer_max, nr_sectors + sector_t);
+		INFBOUND(buffer_max, nr_sectors + sector);
 	}
 	cont->redo();
 }
@@ -2459,13 +2459,13 @@
 /* Compute the maximal transfer size */
 static int transfer_size(int ssize, int max_sector, int max_size)
 {
-	SUPBOUND(max_sector, sector_t + max_size);
+	SUPBOUND(max_sector, sector + max_size);
 
 	/* alignment */
 	max_sector -= (max_sector % _floppy->sect) % ssize;
 
 	/* transfer size, beginning not aligned */
-	current_count_sectors = max_sector - sector_t ;
+	current_count_sectors = max_sector - sector ;
 
 	return max_sector;
 }
@@ -2485,8 +2485,8 @@
 				   CURRENT->nr_sectors);
 
 	if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
-	    buffer_max > sector_t + CURRENT->nr_sectors)
-		current_count_sectors = minimum(buffer_max - sector_t,
+	    buffer_max > sector + CURRENT->nr_sectors)
+		current_count_sectors = minimum(buffer_max - sector,
 						CURRENT->nr_sectors);
 
 	remaining = current_count_sectors << 9;
@@ -2506,7 +2506,7 @@
 
 	buffer_max = maximum(max_sector, buffer_max);
 
-	dma_buffer = floppy_track_buffer + ((sector_t - buffer_min) << 9);
+	dma_buffer = floppy_track_buffer + ((sector - buffer_min) << 9);
 
 	bh = CURRENT->bh;
 	size = CURRENT->current_nr_sectors << 9;
@@ -2520,8 +2520,8 @@
 		    dma_buffer < floppy_track_buffer){
 			DPRINT("buffer overrun in copy buffer %d\n",
 				(int) ((floppy_track_buffer - dma_buffer) >>9));
-			printk("sector_t=%d buffer_min=%d\n",
-			       sector_t, buffer_min);
+			printk("sector=%d buffer_min=%d\n",
+			       sector, buffer_min);
 			printk("current_count_sectors=%ld\n",
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
@@ -2614,7 +2614,7 @@
 
 static int make_raw_rw_request(void)
 {
-	int aligned_sector_t;
+	int aligned_sector;
 	int max_sector, max_size, tracksize, ssize;
 
 	if(max_buffer_sectors == 0) {
@@ -2641,8 +2641,8 @@
 
 	max_sector = _floppy->sect * _floppy->head;
 
-	TRACK = CURRENT->sector / max_sector;
-	sector_t = CURRENT->sector % max_sector;
+	TRACK = (long)CURRENT->sector / max_sector;
+	sector = (long)CURRENT->sector % max_sector;
 	if (_floppy->track && TRACK >= _floppy->track) {
 		if (CURRENT->current_nr_sectors & 1) {
 			current_count_sectors = 1;
@@ -2650,17 +2650,17 @@
 		} else
 			return 0;
 	}
-	HEAD = sector_t / _floppy->sect;
+	HEAD = sector / _floppy->sect;
 
 	if (((_floppy->stretch & FD_SWAPSIDES) || TESTF(FD_NEED_TWADDLE)) &&
-	    sector_t < _floppy->sect)
+	    sector < _floppy->sect)
 		max_sector = _floppy->sect;
 
 	/* 2M disks have phantom sectors on the first track */
 	if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)){
 		max_sector = 2 * _floppy->sect / 3;
-		if (sector_t >= max_sector){
-			current_count_sectors = minimum(_floppy->sect - sector_t,
+		if (sector >= max_sector){
+			current_count_sectors = minimum(_floppy->sect - sector,
 							CURRENT->nr_sectors);
 			return 1;
 		}
@@ -2682,7 +2682,7 @@
 	GAP = _floppy->gap;
 	CODE2SIZE;
 	SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
-	SECTOR = ((sector_t % _floppy->sect) << 2 >> SIZECODE) + 1;
+	SECTOR = ((sector % _floppy->sect) << 2 >> SIZECODE) + 1;
 
 	/* tracksize describes the size which can be filled up with sectors
 	 * of size ssize.
@@ -2690,11 +2690,11 @@
 	tracksize = _floppy->sect - _floppy->sect % ssize;
 	if (tracksize < _floppy->sect){
 		SECT_PER_TRACK ++;
-		if (tracksize <= sector_t % _floppy->sect)
+		if (tracksize <= sector % _floppy->sect)
 			SECTOR--;
 
 		/* if we are beyond tracksize, fill up using smaller sectors */
-		while (tracksize <= sector_t % _floppy->sect){
+		while (tracksize <= sector % _floppy->sect){
 			while(tracksize + ssize > _floppy->sect){
 				SIZECODE--;
 				ssize >>= 1;
@@ -2710,12 +2710,12 @@
 		max_sector = _floppy->sect;
 	}
 
-	in_sector_offset = (sector_t % _floppy->sect) % ssize;
-	aligned_sector_t = sector_t - in_sector_offset;
+	in_sector_offset = (sector % _floppy->sect) % ssize;
+	aligned_sector = sector - in_sector_offset;
 	max_size = CURRENT->nr_sectors;
 	if ((raw_cmd->track == buffer_track) && 
 	    (current_drive == buffer_drive) &&
-	    (sector_t >= buffer_min) && (sector_t < buffer_max)) {
+	    (sector >= buffer_min) && (sector < buffer_max)) {
 		/* data already in track buffer */
 		if (CT(COMMAND) == FD_READ) {
 			copy_buffer(1, max_sector, buffer_max);
@@ -2723,8 +2723,8 @@
 		}
 	} else if (in_sector_offset || CURRENT->nr_sectors < ssize){
 		if (CT(COMMAND) == FD_WRITE){
-			if (sector_t + CURRENT->nr_sectors > ssize &&
-			    sector_t + CURRENT->nr_sectors < ssize + ssize)
+			if (sector + CURRENT->nr_sectors > ssize &&
+			    sector + CURRENT->nr_sectors < ssize + ssize)
 				max_size = ssize + ssize;
 			else
 				max_size = ssize;
@@ -2737,7 +2737,7 @@
 		int direct, indirect;
 
 		indirect= transfer_size(ssize,max_sector,max_buffer_sectors*2) -
-			sector_t;
+			sector;
 
 		/*
 		 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
@@ -2752,7 +2752,7 @@
 		if (CROSS_64KB(CURRENT->buffer, max_size << 9))
 			max_size = (K_64 - 
 				    ((unsigned long)CURRENT->buffer) % K_64)>>9;
-		direct = transfer_size(ssize,max_sector,max_size) - sector_t;
+		direct = transfer_size(ssize,max_sector,max_size) - sector;
 		/*
 		 * We try to read tracks, but if we get too many errors, we
 		 * go back to reading just one sector at a time.
@@ -2771,8 +2771,8 @@
 			raw_cmd->length = current_count_sectors << 9;
 			if (raw_cmd->length == 0){
 				DPRINT("zero dma transfer attempted from make_raw_request\n");
-				DPRINT("indirect=%d direct=%d sector_t=%d",
-					indirect, direct, sector_t);
+				DPRINT("indirect=%d direct=%d sector=%d",
+					indirect, direct, sector);
 				return 0;
 			}
 /*			check_dma_crossing(raw_cmd->kernel_data, 
@@ -2790,19 +2790,19 @@
 	/* claim buffer track if needed */
 	if (buffer_track != raw_cmd->track ||  /* bad track */
 	    buffer_drive !=current_drive || /* bad drive */
-	    sector_t > buffer_max ||
-	    sector_t < buffer_min ||
+	    sector > buffer_max ||
+	    sector < buffer_min ||
 	    ((CT(COMMAND) == FD_READ ||
 	      (!in_sector_offset && CURRENT->nr_sectors >= ssize))&&
 	     max_sector > 2 * max_buffer_sectors + buffer_min &&
-	     max_size + sector_t > 2 * max_buffer_sectors + buffer_min)
+	     max_size + sector > 2 * max_buffer_sectors + buffer_min)
 	    /* not enough space */){
 		buffer_track = -1;
 		buffer_drive = current_drive;
-		buffer_max = buffer_min = aligned_sector_t;
+		buffer_max = buffer_min = aligned_sector;
 	}
 	raw_cmd->kernel_data = floppy_track_buffer + 
-		((aligned_sector_t-buffer_min)<<9);
+		((aligned_sector-buffer_min)<<9);
 
 	if (CT(COMMAND) == FD_WRITE){
 		/* copy write buffer to track buffer.
@@ -2818,7 +2818,7 @@
 		copy_buffer(ssize, max_sector, 2*max_buffer_sectors+buffer_min);
 	} else
 		transfer_size(ssize, max_sector,
-			      2*max_buffer_sectors+buffer_min-aligned_sector_t);
+			      2*max_buffer_sectors+buffer_min-aligned_sector);
 
 	/* round up current_count_sectors to get dma xfer size */
 	raw_cmd->length = in_sector_offset+current_count_sectors;
@@ -2830,8 +2830,8 @@
 	if ((raw_cmd->length < current_count_sectors << 9) ||
 	    (raw_cmd->kernel_data != CURRENT->buffer &&
 	     CT(COMMAND) == FD_WRITE &&
-	     (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
-	      aligned_sector_t < buffer_min)) ||
+	     (aligned_sector + (raw_cmd->length >> 9) > buffer_max ||
+	      aligned_sector < buffer_min)) ||
 	    raw_cmd->length % (128 << SIZECODE) ||
 	    raw_cmd->length <= 0 || current_count_sectors <= 0){
 		DPRINT("fractionary current count b=%lx s=%lx\n",
@@ -2842,7 +2842,7 @@
 				       floppy_track_buffer) >> 9),
 			       current_count_sectors);
 		printk("st=%d ast=%d mse=%d msi=%d\n",
-		       sector_t, aligned_sector_t, max_sector, max_size);
+		       sector, aligned_sector, max_sector, max_size);
 		printk("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
 		printk("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
 		       COMMAND, SECTOR, HEAD, TRACK);
@@ -2860,8 +2860,8 @@
 		    raw_cmd->kernel_data + raw_cmd->length >
 		    floppy_track_buffer + (max_buffer_sectors  << 10)){
 			DPRINT("buffer overrun in schedule dma\n");
-			printk("sector_t=%d buffer_min=%d current_count=%ld\n",
-			       sector_t, buffer_min,
+			printk("sector=%d buffer_min=%d current_count=%ld\n",
+			       sector, buffer_min,
 			       raw_cmd->length >> 9);
 			printk("current_count_sectors=%ld\n",
 			       current_count_sectors);
@@ -2983,7 +2983,7 @@
 
 	if (usage_count == 0) {
 		printk("warning: usage count=0, CURRENT=%p exiting\n", CURRENT);
-		printk("sect=%ld cmd=%d\n", CURRENT->sector, CURRENT->cmd);
+		printk("sect=%llu cmd=%d\n", (unsigned long long)CURRENT->sector, CURRENT->cmd);
 		return;
 	}
 	if (fdc_busy){
diff -Nru a/drivers/block/genhd.c b/drivers/block/genhd.c
--- a/drivers/block/genhd.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/genhd.c	Mon Apr  7 13:52:18 2003
@@ -200,9 +200,9 @@
 			struct hd_struct *hd = &gp->part[n];
 
 			disk_round_stats(hd);
-			seq_printf(s, "%4d  %4d %10d %s "
+			seq_printf(s, "%4d  %4d %10llu %s "
 				      "%d %d %d %d %d %d %d %d %d %d %d\n",
-				      gp->major, n, gp->sizes[n],
+				      gp->major, n, (unsigned long long)gp->sizes[n],
 				      disk_name(gp, n, buf),
 				      hd->rd_ios, hd->rd_merges,
 #define MSEC(x) ((x) * 1000 / HZ)
@@ -212,8 +212,8 @@
 				      hd->ios_in_flight, MSEC(hd->io_ticks),
 				      MSEC(hd->aveq));
 #else
-			seq_printf(s, "%4d  %4d %10d %s\n",
-				   gp->major, n, gp->sizes[n],
+			seq_printf(s, "%4d  %4d %10llu %s\n",
+				   gp->major, n, (unsigned long long)gp->sizes[n],
 				   disk_name(gp, n, buf));
 #endif /* CONFIG_BLK_STATS */
 		}
diff -Nru a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c
--- a/drivers/block/ll_rw_blk.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/block/ll_rw_blk.c	Mon Apr  7 13:52:17 2003
@@ -83,10 +83,10 @@
  *
  * if (!blk_size[MAJOR]) then no minor size checking is done.
  */
-int * blk_size[MAX_BLKDEV];
+sector_t * blk_size[MAX_BLKDEV];
 
 /*
- * blksize_size contains the size of all block-devices:
+ * blksize_size contains the block size of all block-devices:
  *
  * blksize_size[MAJOR][MINOR]
  *
@@ -902,7 +902,8 @@
 static int __make_request(request_queue_t * q, int rw,
 				  struct buffer_head * bh)
 {
-	unsigned int sector, count;
+	sector_t sector;
+	unsigned count;
 	int max_segments = MAX_SEGMENTS;
 	struct request * req, *freereq = NULL;
 	int rw_ahead, max_sectors, el_ret;
@@ -1077,7 +1078,7 @@
 }
 
 /**
- * generic_make_request: hand a buffer head to it's device driver for I/O
+ * generic_make_request: hand a buffer head to its device driver for I/O
  * @rw:  READ, WRITE, or READA - what sort of I/O is desired.
  * @bh:  The buffer head describing the location in memory and on the device.
  *
@@ -1113,7 +1114,7 @@
 void generic_make_request (int rw, struct buffer_head * bh)
 {
 	int major = MAJOR(bh->b_rdev);
-	int minorsize = 0;
+	sector_t minorsize = 0;
 	request_queue_t *q;
 
 	if (!bh->b_end_io)
@@ -1123,8 +1124,8 @@
 	if (blk_size[major])
 		minorsize = blk_size[major][MINOR(bh->b_rdev)];
 	if (minorsize) {
-		unsigned long maxsector = (minorsize << 1) + 1;
-		unsigned long sector = bh->b_rsector;
+		sector_t maxsector = (minorsize << 1) + 1;
+		sector_t sector = bh->b_rsector;
 		unsigned int count = bh->b_size >> 9;
 
 		if (maxsector < count || maxsector - count < sector) {
@@ -1136,9 +1137,10 @@
 			   when mounting a device. */
 			printk(KERN_INFO
 			       "attempt to access beyond end of device\n");
-			printk(KERN_INFO "%s: rw=%d, want=%ld, limit=%d\n",
+			printk(KERN_INFO "%s: rw=%d, want=%llu, limit=%llu\n",
 			       kdevname(bh->b_rdev), rw,
-			       (sector + count)>>1, minorsize);
+			       (unsigned long long)((sector + count)>>1), 
+			       (unsigned long long)minorsize);
 
 			/* Yecch again */
 			bh->b_end_io(bh, 0);
@@ -1159,8 +1161,8 @@
 		if (!q) {
 			printk(KERN_ERR
 			       "generic_make_request: Trying to access "
-			       "nonexistent block-device %s (%ld)\n",
-			       kdevname(bh->b_rdev), bh->b_rsector);
+			       "nonexistent block-device %s (%llu)\n",
+			       kdevname(bh->b_rdev), (unsigned long long)bh->b_rsector);
 			buffer_IO_error(bh);
 			break;
 		}
@@ -1346,8 +1348,8 @@
 
 	req->errors = 0;
 	if (!uptodate)
-		printk("end_request: I/O error, dev %s (%s), sector %lu\n",
-			kdevname(req->rq_dev), name, req->sector);
+		printk("end_request: I/O error, dev %s (%s), sector %llu\n",
+			kdevname(req->rq_dev), name, (unsigned long long)req->sector);
 
 	if ((bh = req->bh) != NULL) {
 		nsect = bh->b_size >> 9;
diff -Nru a/drivers/block/loop.c b/drivers/block/loop.c
--- a/drivers/block/loop.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/loop.c	Mon Apr  7 13:52:18 2003
@@ -80,7 +80,7 @@
 
 static int max_loop = 8;
 static struct loop_device *loop_dev;
-static int *loop_sizes;
+static sector_t *loop_sizes;
 static int *loop_blksizes;
 static devfs_handle_t devfs_handle;      /*  For the directory */
 
@@ -88,7 +88,7 @@
  * Transfer functions
  */
 static int transfer_none(struct loop_device *lo, int cmd, char *raw_buf,
-			 char *loop_buf, int size, int real_block)
+			 char *loop_buf, int size, sector_t real_block)
 {
 	if (raw_buf != loop_buf) {
 		if (cmd == READ)
@@ -101,7 +101,7 @@
 }
 
 static int transfer_xor(struct loop_device *lo, int cmd, char *raw_buf,
-			char *loop_buf, int size, int real_block)
+			char *loop_buf, int size, sector_t real_block)
 {
 	char	*in, *out, *key;
 	int	i, keysize;
@@ -154,21 +154,53 @@
 
 #define MAX_DISK_SIZE 1024*1024*1024
 
-static int compute_loop_size(struct loop_device *lo, struct dentry * lo_dentry, kdev_t lodev)
+static int
+compute_loop_size(struct loop_device *lo, 
+		  struct dentry *lo_dentry, 
+		  kdev_t lodev, 
+		  sector_t *size)
 {
+
+	sector_t x;
+	loff_t filesize;
+
 	if (S_ISREG(lo_dentry->d_inode->i_mode))
-		return (lo_dentry->d_inode->i_size - lo->lo_offset) >> BLOCK_SIZE_BITS;
-	if (blk_size[MAJOR(lodev)])
-		return blk_size[MAJOR(lodev)][MINOR(lodev)] -
-                                (lo->lo_offset >> BLOCK_SIZE_BITS);
-	return MAX_DISK_SIZE;
+		filesize = lo_dentry->d_inode->i_size;
+	else if (blk_size[MAJOR(lodev)])
+		filesize = blk_size[MAJOR(lodev)][MINOR(lodev)] << BLOCK_SIZE_BITS;
+	else
+		filesize = MAX_DISK_SIZE; /* a wild guess */
+
+	printk("file size = %llu\n", filesize);
+	/*
+	 * Unfortunately, if we want to do I/O on the device,
+	 * the number of 512-byte sectors has to fit into a sector_t.
+	 */
+	filesize = (filesize - lo->lo_offset) >> 9;
+	x = (sector_t)filesize;
+	if ((loff_t)x != filesize)
+		return -EFBIG;
+	/*
+	 * Convert sectors to blocks
+	 */
+	filesize >>= (BLOCK_SIZE_BITS - 9);
+
+	printk("loop%d size is %llu blocks\n",
+	       MINOR(lodev), filesize);
+	*size = (sector_t)filesize;
+	return 0;	
+
 }
 
-static void figure_loop_size(struct loop_device *lo)
-{
-	loop_sizes[lo->lo_number] = compute_loop_size(lo,
-					lo->lo_backing_file->f_dentry,
-					lo->lo_device);
+static int figure_loop_size(struct loop_device *lo)
+{
+	int error;
+
+	error = compute_loop_size(lo,
+			lo->lo_backing_file->f_dentry,
+			lo->lo_device,
+			&loop_sizes[lo->lo_number]);
+	return error;
 }
 
 static int lo_send(struct loop_device *lo, struct buffer_head *bh, int bsize,
@@ -189,7 +221,7 @@
 	len = bh->b_size;
 	data = bh->b_data;
 	while (len > 0) {
-		int IV = index * (PAGE_CACHE_SIZE/bsize) + offset/bsize;
+		sector_t IV = (sector_t)index * (PAGE_CACHE_SIZE/bsize) + offset/bsize;
 		int transfer_result;
 
 		size = PAGE_CACHE_SIZE - offset;
@@ -247,7 +279,7 @@
 	unsigned long count = desc->count;
 	struct lo_read_data *p = (struct lo_read_data*)desc->buf;
 	struct loop_device *lo = p->lo;
-	int IV = page->index * (PAGE_CACHE_SIZE/p->bsize) + offset/p->bsize;
+	sector_t IV = (sector_t)page->index * (PAGE_CACHE_SIZE/p->bsize) + offset/p->bsize;
 
 	if (size > count)
 		size = count;
@@ -255,7 +287,7 @@
 	kaddr = kmap(page);
 	if (lo_do_transfer(lo, READ, kaddr + offset, p->data, size, IV)) {
 		size = 0;
-		printk(KERN_ERR "loop: transfer error block %ld\n",page->index);
+		printk(KERN_ERR "loop: transfer error block %lu\n",page->index);
 		desc->error = -EINVAL;
 	}
 	kunmap(page);
@@ -299,15 +331,29 @@
 	return bs;
 }
 
-static inline unsigned long loop_get_iv(struct loop_device *lo,
-					unsigned long sector)
+static inline int loop_get_bs_shift(struct loop_device *lo)
 {
 	int bs = loop_get_bs(lo);
+	int i;
+	/*
+	 * Assume power-of-two block size
+	 */
+	for (i = -1; bs; i++)
+		bs >>= 1;
+	return i;
+}
+
+static inline unsigned long loop_get_iv(struct loop_device *lo,
+					sector_t sector)
+{
+	int bs = loop_get_bs_shift(lo);
 	unsigned long offset, IV;
 
-	IV = sector / (bs >> 9) + lo->lo_offset / bs;
-	offset = ((sector % (bs >> 9)) << 9) + lo->lo_offset % bs;
-	if (offset >= bs)
+	IV = (sector >> (bs - 9)) + (lo->lo_offset >> bs);
+
+	offset = ((sector & ((1 << (bs-9)) - 1))<<9) + (lo->lo_offset & ((1 << bs)-1));
+
+	if (offset >= (1 << bs))
 		IV++;
 
 	return IV;
@@ -540,7 +586,7 @@
 		bh->b_end_io(bh, !ret);
 	} else {
 		struct buffer_head *rbh = bh->b_private;
-		unsigned long IV = loop_get_iv(lo, rbh->b_rsector);
+		sector_t IV = loop_get_iv(lo, rbh->b_rsector);
 
 		ret = lo_do_transfer(lo, READ, bh->b_data, rbh->b_data,
 				     bh->b_size, IV);
@@ -678,7 +724,11 @@
 	lo->lo_backing_file = file;
 	lo->transfer = NULL;
 	lo->ioctl = NULL;
-	figure_loop_size(lo);
+	if (figure_loop_size(lo)) {
+		error = -EFBIG;
+		fput(file);
+		goto out_putf;
+	}
 	lo->old_gfp_mask = inode->i_mapping->gfp_mask;
 	inode->i_mapping->gfp_mask = GFP_NOIO;
 
@@ -779,6 +829,7 @@
 {
 	struct loop_info info; 
 	int err;
+	loff_t offset;
 	unsigned int type;
 
 	if (lo->lo_encrypt_key_size && lo->lo_key_owner != current->uid && 
@@ -798,10 +849,18 @@
 	err = loop_release_xfer(lo);
 	if (!err) 
 		err = loop_init_xfer(lo, type, &info);
+
+	offset = lo->lo_offset;
+	if (offset != info.lo_offset) {
+		lo->lo_offset = info.lo_offset;
+		if (figure_loop_size(lo)){
+			err = -EFBIG;
+			lo->lo_offset = offset;
+		}
+	}
 	if (err)
 		return err;	
 
-	lo->lo_offset = info.lo_offset;
 	strncpy(lo->lo_name, info.lo_name, LO_NAME_SIZE);
 
 	lo->transfer = xfer_funcs[type]->transfer;
@@ -814,7 +873,6 @@
 		       info.lo_encrypt_key_size);
 		lo->lo_key_owner = current->uid; 
 	}	
-	figure_loop_size(lo);
 	return 0;
 }
 
@@ -876,12 +934,19 @@
 		err = loop_get_status(lo, (struct loop_info *) arg);
 		break;
 	case BLKGETSIZE:
+	{
+		unsigned long val;
 		if (lo->lo_state != Lo_bound) {
 			err = -ENXIO;
 			break;
 		}
-		err = put_user((unsigned long)loop_sizes[lo->lo_number] << 1, (unsigned long *) arg);
+		val = loop_sizes[lo->lo_number] << 1;
+		if ((sector_t) val != (loop_sizes[lo->lo_number] << 1))
+			err = -EFBIG;
+		else
+			err = put_user(val, (unsigned long *) arg);
 		break;
+	}
 	case BLKGETSIZE64:
 		if (lo->lo_state != Lo_bound) {
 			err = -ENXIO;
@@ -1024,11 +1089,11 @@
 	if (!loop_dev)
 		return -ENOMEM;
 
-	loop_sizes = kmalloc(max_loop * sizeof(int), GFP_KERNEL);
+	loop_sizes = kmalloc(max_loop * sizeof(loop_sizes[0]), GFP_KERNEL);
 	if (!loop_sizes)
 		goto out_sizes;
 
-	loop_blksizes = kmalloc(max_loop * sizeof(int), GFP_KERNEL);
+	loop_blksizes = kmalloc(max_loop * sizeof(loop_blksizes[0]), GFP_KERNEL);
 	if (!loop_blksizes)
 		goto out_blksizes;
 
@@ -1044,8 +1109,8 @@
 		spin_lock_init(&lo->lo_lock);
 	}
 
-	memset(loop_sizes, 0, max_loop * sizeof(int));
-	memset(loop_blksizes, 0, max_loop * sizeof(int));
+	memset(loop_sizes, 0, max_loop * sizeof(loop_sizes[0]));
+	memset(loop_blksizes, 0, max_loop * sizeof(loop_blksizes[0]));
 	blk_size[MAJOR_NR] = loop_sizes;
 	blksize_size[MAJOR_NR] = loop_blksizes;
 	for (i = 0; i < max_loop; i++)
diff -Nru a/drivers/block/nbd.c b/drivers/block/nbd.c
--- a/drivers/block/nbd.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/nbd.c	Mon Apr  7 13:52:18 2003
@@ -57,7 +57,7 @@
 
 static int nbd_blksizes[MAX_NBD];
 static int nbd_blksize_bits[MAX_NBD];
-static int nbd_sizes[MAX_NBD];
+static sector_t nbd_sizes[MAX_NBD];
 static u64 nbd_bytesizes[MAX_NBD];
 
 static struct nbd_device nbd_dev[MAX_NBD];
diff -Nru a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c
--- a/drivers/block/ps2esdi.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/block/ps2esdi.c	Mon Apr  7 13:52:17 2003
@@ -116,7 +116,7 @@
 static int no_int_yet;
 static int access_count[MAX_HD];
 static char ps2esdi_valid[MAX_HD];
-static int ps2esdi_sizes[MAX_HD << 6];
+static sector_t ps2esdi_sizes[MAX_HD << 6];
 static int ps2esdi_blocksizes[MAX_HD << 6];
 static int ps2esdi_maxsect[MAX_HD << 6];
 static int ps2esdi_drives;
@@ -517,7 +517,7 @@
 	/* is request is valid */ 
 	else {
 		printk("Grrr. error. ps2esdi_drives: %d, %lu %lu\n", ps2esdi_drives,
-		       CURRENT->sector, ps2esdi[MINOR(CURRENT->rq_dev)].nr_sects);
+		       (unsigned long)CURRENT->sector, (unsigned long)ps2esdi[MINOR(CURRENT->rq_dev)].nr_sects);
 		end_request(FAIL);
 	}
 
diff -Nru a/drivers/block/rd.c b/drivers/block/rd.c
--- a/drivers/block/rd.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/rd.c	Mon Apr  7 13:52:18 2003
@@ -75,7 +75,7 @@
 static unsigned long rd_length[NUM_RAMDISKS];	/* Size of RAM disks in bytes   */
 static int rd_hardsec[NUM_RAMDISKS];		/* Size of real blocks in bytes */
 static int rd_blocksizes[NUM_RAMDISKS];		/* Size of 1024 byte blocks :)  */
-static int rd_kbsize[NUM_RAMDISKS];		/* Size in blocks of 1024 bytes */
+static sector_t rd_kbsize[NUM_RAMDISKS];		/* Size in blocks of 1024 bytes */
 static devfs_handle_t devfs_handle;
 static struct block_device *rd_bdev[NUM_RAMDISKS];/* Protected device data */
 
diff -Nru a/drivers/block/umem.c b/drivers/block/umem.c
--- a/drivers/block/umem.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/umem.c	Mon Apr  7 13:52:18 2003
@@ -160,7 +160,7 @@
 
 static int              mm_hardsect  [MM_MAXCARDS << MM_SHIFT];
 static int              mm_blocksizes[MM_MAXCARDS << MM_SHIFT];
-static int              mm_sizes[MM_MAXCARDS << MM_SHIFT];
+static sector_t         mm_sizes[MM_MAXCARDS << MM_SHIFT];
 static struct hd_struct mm_partitions[MM_MAXCARDS << MM_SHIFT];
 
 static int num_cards = 0;
diff -Nru a/drivers/block/xd.c b/drivers/block/xd.c
--- a/drivers/block/xd.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/block/xd.c	Mon Apr  7 13:52:18 2003
@@ -121,7 +121,7 @@
 };
 
 static struct hd_struct xd_struct[XD_MAXDRIVES << 6];
-static int xd_sizes[XD_MAXDRIVES << 6], xd_access[XD_MAXDRIVES];
+static sector_t xd_sizes[XD_MAXDRIVES << 6], xd_access[XD_MAXDRIVES];
 static int xd_blocksizes[XD_MAXDRIVES << 6];
 static int xd_maxsect[XD_MAXDRIVES << 6];
 
diff -Nru a/drivers/char/raw.c b/drivers/char/raw.c
--- a/drivers/char/raw.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/char/raw.c	Mon Apr  7 13:52:17 2003
@@ -294,7 +294,8 @@
 	struct kiobuf * iobuf;
 	int		new_iobuf;
 	int		err = 0;
-	unsigned long	blocknr, blocks;
+	sector_t	blocknr;
+	unsigned long	blocks;
 	size_t		transferred;
 	int		iosize;
 	int		i;
diff -Nru a/drivers/ide/ataraid.c b/drivers/ide/ataraid.c
--- a/drivers/ide/ataraid.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/ide/ataraid.c	Mon Apr  7 13:52:18 2003
@@ -47,7 +47,7 @@
 
 
 struct gendisk ataraid_gendisk;
-static int ataraid_gendisk_sizes[256];
+static sector_t ataraid_gendisk_sizes[256];
 static int ataraid_readahead[256];
 
 static struct block_device_operations ataraid_fops = {
diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
--- a/drivers/ide/ide-cd.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/ide/ide-cd.c	Mon Apr  7 13:52:18 2003
@@ -1060,8 +1060,8 @@
 	   paranoid and check. */
 	if (rq->current_nr_sectors < (rq->bh->b_size >> SECTOR_BITS) &&
 	    (rq->sector % SECTORS_PER_FRAME) != 0) {
-		printk ("%s: cdrom_read_from_buffer: buffer botch (%ld)\n",
-			drive->name, rq->sector);
+		printk ("%s: cdrom_read_from_buffer: buffer botch (%llu)\n",
+			drive->name, (unsigned long long)rq->sector);
 		cdrom_end_request (0, drive);
 		return -1;
 	}
@@ -1689,8 +1689,9 @@
  * cdrom driver request routine.
  */
 static ide_startstop_t
-ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block)
+ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, sector_t sect)
 {
+	unsigned long block = (unsigned long)sect;
 	ide_startstop_t action;
 	struct cdrom_info *info = drive->driver_data;
 
@@ -2934,14 +2935,14 @@
 }
 
 static
-unsigned long ide_cdrom_capacity (ide_drive_t *drive)
+sector_t ide_cdrom_capacity (ide_drive_t *drive)
 {
 	unsigned long capacity;
 
 	if (cdrom_read_capacity(drive, &capacity, NULL))
 		return 0;
 
-	return capacity * SECTORS_PER_FRAME;
+	return (sector_t)capacity * SECTORS_PER_FRAME;
 }
 
 static
diff -Nru a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
--- a/drivers/ide/ide-disk.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/ide/ide-disk.c	Mon Apr  7 13:52:17 2003
@@ -352,7 +352,7 @@
  * using LBA if supported, or CHS otherwise, to address sectors.
  * It also takes care of issuing special DRIVE_CMDs.
  */
-static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
+static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block)
 {
 	if (rq->cmd == READ)
 		goto good_command;
@@ -556,7 +556,7 @@
  * using LBA if supported, or CHS otherwise, to address sectors.
  * It also takes care of issuing special DRIVE_CMDs.
  */
-static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
+static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block)
 {
 	if (IDE_CONTROL_REG)
 		OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
@@ -582,10 +582,13 @@
 			tasklets[5] = (task_ioreg_t) (block>>8);
 			tasklets[6] = (task_ioreg_t) (block>>16);
 			tasklets[7] = (task_ioreg_t) (block>>24);
+#ifndef CONFIG_LBD
 			tasklets[8] = (task_ioreg_t) 0;
 			tasklets[9] = (task_ioreg_t) 0;
-//			tasklets[8] = (task_ioreg_t) (block>>32);
-//			tasklets[9] = (task_ioreg_t) (block>>40);
+#else
+			tasklets[8] = (task_ioreg_t) (block>>32);
+			tasklets[9] = (task_ioreg_t) (block>>40);
+#endif
 #ifdef DEBUG
 			printk("%s: %sing: LBAsect=%lu, sectors=%ld, buffer=0x%08lx, LBAsect=0x%012lx\n",
 				drive->name,
@@ -613,9 +616,9 @@
 			OUT_BYTE(0x00|drive->select.all,IDE_SELECT_REG);
 		} else {
 #ifdef DEBUG
-			printk("%s: %sing: LBAsect=%ld, sectors=%ld, buffer=0x%08lx\n",
+			printk("%s: %sing: LBAsect=%llu, sectors=%ld, buffer=0x%08lx\n",
 				drive->name, (rq->cmd==READ)?"read":"writ",
-				block, rq->nr_sectors, (unsigned long) rq->buffer);
+				(unsigned long long)block, rq->nr_sectors, (unsigned long) rq->buffer);
 #endif
 			OUT_BYTE(0x00, IDE_FEATURE_REG);
 			OUT_BYTE((rq->nr_sectors==256)?0x00:rq->nr_sectors,IDE_NSECTOR_REG);
@@ -626,8 +629,8 @@
 		}
 	} else {
 		unsigned int sect,head,cyl,track;
-		track = block / drive->sect;
-		sect  = block % drive->sect + 1;
+		track = (unsigned)block / drive->sect;
+		sect  = (unsigned)block % drive->sect + 1;
 		OUT_BYTE(sect,IDE_SECTOR_REG);
 		head  = track % drive->head;
 		cyl   = track / drive->head;
@@ -966,7 +969,7 @@
 	/* Determine capacity, and use LBA if the drive properly supports it */
 	} else if ((id->capability & 2) && lba_capacity_is_ok(id)) {
 		capacity = id->lba_capacity;
-		drive->cyl = capacity / (drive->head * drive->sect);
+		drive->cyl = (unsigned long)capacity / (drive->head * drive->sect);
 		drive->select.b.lba = 1;
 	}
 
@@ -996,7 +999,7 @@
 	}
 }
 
-static unsigned long idedisk_capacity (ide_drive_t *drive)
+static sector_t idedisk_capacity (ide_drive_t *drive)
 {
 	if (drive->id->cfs_enable_2 & 0x0400)
 		return (drive->capacity48 - drive->sect0);
@@ -1326,7 +1329,7 @@
 	int i;
 	
 	struct hd_driveid *id = drive->id;
-	unsigned long capacity;
+	sector_t capacity;
 	
 	idedisk_add_settings(drive);
 
@@ -1334,7 +1337,7 @@
 		return;
 
 	/*
-	 * CompactFlash cards and their brethern look just like hard drives
+	 * CompactFlash cards and their brethren look just like hard drives
 	 * to us, but they are removable and don't have a doorlock mechanism.
 	 */
 	if (drive->removable && !drive_is_flashcard(drive)) {
@@ -1374,7 +1377,7 @@
 	if (drive->head > 16 && id->heads && id->heads <= 16) {
 		drive->cyl  = id->cyls;
 		drive->head = id->heads;
-		drive->sect = id->sectors;
+ 		drive->sect = id->sectors;
 	}
 
 	/* calculate drive capacity, and select LBA if possible */
@@ -1387,12 +1390,18 @@
 	capacity = idedisk_capacity (drive);
 	if ((capacity >= (drive->bios_cyl * drive->bios_sect * drive->bios_head)) &&
 	    (!drive->forced_geom) && drive->bios_sect && drive->bios_head)
-		drive->bios_cyl = (capacity / drive->bios_sect) / drive->bios_head;
-	printk (KERN_INFO "%s: %ld sectors", drive->name, capacity);
+		drive->bios_cyl = ((unsigned long)capacity / drive->bios_sect) / drive->bios_head;
+	printk (KERN_INFO "%s: %llu sectors", drive->name, (unsigned long long)capacity);
 
 	/* Give size in megabytes (MB), not mebibytes (MiB). */
 	/* We compute the exact rounded value, avoiding overflow. */
-	printk (" (%ld MB)", (capacity - capacity/625 + 974)/1950);
+	{
+		sector_t x = capacity;
+		sector_div(x, 625);
+		x = capacity - x + 974;
+		sector_div(x, 1950);
+		printk (" (%llu MB)", (unsigned long long)x);
+	}
 
 	/* Only print cache size when it was specified */
 	if (id->buf_size)
diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
--- a/drivers/ide/ide-floppy.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/ide/ide-floppy.c	Mon Apr  7 13:52:18 2003
@@ -1294,14 +1294,16 @@
 /*
  *	idefloppy_do_request is our request handling function.	
  */
-static ide_startstop_t idefloppy_do_request (ide_drive_t *drive, struct request *rq, unsigned long block)
+static ide_startstop_t idefloppy_do_request (ide_drive_t *drive, struct request *rq, sector_t block)
 {
 	idefloppy_floppy_t *floppy = drive->driver_data;
 	idefloppy_pc_t *pc;
 
 #if IDEFLOPPY_DEBUG_LOG
 	printk (KERN_INFO "rq_status: %d, rq_dev: %u, cmd: %d, errors: %d\n",rq->rq_status,(unsigned int) rq->rq_dev,rq->cmd,rq->errors);
-	printk (KERN_INFO "sector: %ld, nr_sectors: %ld, current_nr_sectors: %ld\n",rq->sector,rq->nr_sectors,rq->current_nr_sectors);
+	printk (KERN_INFO "sector: %llu, nr_sectors: %ld, current_nr_sectors: %ld\n",
+		(unsigned long long)rq->sector,rq->nr_sectors,
+		rq->current_nr_sectors);
 #endif /* IDEFLOPPY_DEBUG_LOG */
 
 	if (rq->errors >= ERROR_MAX) {
@@ -1316,13 +1318,13 @@
 	switch (rq->cmd) {
 		case READ:
 		case WRITE:
-			if (rq->sector % floppy->bs_factor || rq->nr_sectors % floppy->bs_factor) {
+			if ((unsigned long)rq->sector % floppy->bs_factor || rq->nr_sectors % floppy->bs_factor) {
 				printk ("%s: unsupported r/w request size\n", drive->name);
 				idefloppy_end_request (0, HWGROUP(drive));
 				return ide_stopped;
 			}
 			pc = idefloppy_next_pc_storage (drive);
-			idefloppy_create_rw_cmd (floppy, pc, rq, block);
+			idefloppy_create_rw_cmd (floppy, pc, rq, (unsigned long)block);
 			break;
 		case IDEFLOPPY_PC_RQ:
 			pc = (idefloppy_pc_t *) rq->buffer;
@@ -1859,12 +1861,12 @@
 /*
  *	Return the current floppy capacity to ide.c.
  */
-static unsigned long idefloppy_capacity (ide_drive_t *drive)
+static sector_t idefloppy_capacity (ide_drive_t *drive)
 {
 	idefloppy_floppy_t *floppy = drive->driver_data;
 	unsigned long capacity = floppy->blocks * floppy->bs_factor;
 
-	return capacity;
+	return (sector_t)capacity;
 }
 
 /*
diff -Nru a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
--- a/drivers/ide/ide-probe.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/ide/ide-probe.c	Mon Apr  7 13:52:17 2003
@@ -786,23 +786,23 @@
 	if (!gd)
 		goto err_kmalloc_gd;
 	memset (gd, 0, sizeof(struct gendisk));
-	gd->sizes = kmalloc (minors * sizeof(int), GFP_KERNEL);
+	gd->sizes = kmalloc (minors * sizeof(gd->sizes[0]), GFP_KERNEL);
 	if (!gd->sizes)
 		goto err_kmalloc_gd_sizes;
-	gd->part  = kmalloc (minors * sizeof(struct hd_struct), GFP_KERNEL);
+	gd->part  = kmalloc (minors * sizeof(gd->part[0]), GFP_KERNEL);
 	if (!gd->part)
 		goto err_kmalloc_gd_part;
-	bs        = kmalloc (minors*sizeof(int), GFP_KERNEL);
+	bs        = kmalloc (minors*sizeof(bs[0]), GFP_KERNEL);
 	if (!bs)
 		goto err_kmalloc_bs;
-	max_sect  = kmalloc (minors*sizeof(int), GFP_KERNEL);
+	max_sect  = kmalloc (minors*sizeof(max_sect[0]), GFP_KERNEL);
 	if (!max_sect)
 		goto err_kmalloc_max_sect;
-	max_ra    = kmalloc (minors*sizeof(int), GFP_KERNEL);
+	max_ra    = kmalloc (minors*sizeof(max_ra[0]), GFP_KERNEL);
 	if (!max_ra)
 		goto err_kmalloc_max_ra;
 
-	memset(gd->part, 0, minors * sizeof(struct hd_struct));
+	memset(gd->part, 0, minors * sizeof(gd->part[0]));
 
 	/* cdroms and msdos f/s are examples of non-1024 blocksizes */
 	blksize_size[hwif->major] = bs;
diff -Nru a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
--- a/drivers/ide/ide-tape.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/ide/ide-tape.c	Mon Apr  7 13:52:18 2003
@@ -2609,7 +2609,7 @@
 /*
  *	idetape_do_request is our request handling function.	
  */
-static ide_startstop_t idetape_do_request (ide_drive_t *drive, struct request *rq, unsigned long block)
+static ide_startstop_t idetape_do_request (ide_drive_t *drive, struct request *rq, sector_t block)
 {
 	idetape_tape_t *tape = drive->driver_data;
 	idetape_pc_t *pc;
@@ -2620,7 +2620,7 @@
 	if (tape->debug_level >= 5)
 		printk (KERN_INFO "ide-tape: rq_status: %d, rq_dev: %u, cmd: %d, errors: %d\n",rq->rq_status,(unsigned int) rq->rq_dev,rq->cmd,rq->errors);
 	if (tape->debug_level >= 2)
-		printk (KERN_INFO "ide-tape: sector: %ld, nr_sectors: %ld, current_nr_sectors: %ld\n",rq->sector,rq->nr_sectors,rq->current_nr_sectors);
+		printk (KERN_INFO "ide-tape: sector: %llu, nr_sectors: %ld, current_nr_sectors: %ld\n", (unsigned long long)rq->sector,rq->nr_sectors,rq->current_nr_sectors);
 #endif /* IDETAPE_DEBUG_LOG */
 
 	if (!IDETAPE_RQ_CMD (rq->cmd)) {
diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c
--- a/drivers/ide/ide.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/ide/ide.c	Mon Apr  7 13:52:18 2003
@@ -1010,7 +1010,8 @@
 					}
 				}
 				if (HWGROUP(drive) && HWGROUP(drive)->rq)
-					printk(", sector=%ld", HWGROUP(drive)->rq->sector);
+					printk(", sector=%llu", 
+					       (unsigned long long)HWGROUP(drive)->rq->sector);
 			}
 		}
 #endif	/* FANCY_STATUS_DUMPS */
@@ -1344,7 +1345,7 @@
 static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq)
 {
 	ide_startstop_t startstop;
-	unsigned long block, blockend;
+	sector_t block, blockend;
 	unsigned int minor = MINOR(rq->rq_dev), unit = minor >> PARTN_BITS;
 	ide_hwif_t *hwif = HWIF(drive);
 
@@ -1372,8 +1373,8 @@
 	if ((rq->cmd == READ || rq->cmd == WRITE) &&
 	    (drive->media == ide_disk || drive->media == ide_floppy)) {
 		if ((blockend < block) || (blockend > drive->part[minor&PARTN_MASK].nr_sects)) {
-			printk("%s%c: bad access: block=%ld, count=%ld\n", drive->name,
-			 (minor&PARTN_MASK)?'0'+(minor&PARTN_MASK):' ', block, rq->nr_sectors);
+			printk("%s%c: bad access: block=%llu, count=%ld\n", drive->name,
+			 (minor&PARTN_MASK)?'0'+(minor&PARTN_MASK):' ', (unsigned long long)block, rq->nr_sectors);
 			goto kill_rq;
 		}
 		block += drive->part[minor&PARTN_MASK].start_sect + drive->sect0;
@@ -3745,7 +3746,7 @@
 	return 0;
 }
 
-static ide_startstop_t default_do_request(ide_drive_t *drive, struct request *rq, unsigned long block)
+static ide_startstop_t default_do_request(ide_drive_t *drive, struct request *rq, sector_t block)
 {
 	ide_end_request(0, HWGROUP(drive));
 	return ide_stopped;
@@ -3781,9 +3782,9 @@
 {
 }
 
-static unsigned long default_capacity (ide_drive_t *drive)
+static sector_t default_capacity (ide_drive_t *drive)
 {
-	return 0x7fffffff;
+	return (sector_t)0x7fffffff;
 }
 
 static ide_startstop_t default_special (ide_drive_t *drive)
diff -Nru a/drivers/ide/pdc4030.c b/drivers/ide/pdc4030.c
--- a/drivers/ide/pdc4030.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/ide/pdc4030.c	Mon Apr  7 13:52:18 2003
@@ -336,9 +336,9 @@
 	sectors_avail -= nsect;
 	ide_input_data(drive, rq->buffer, nsect * SECTOR_WORDS);
 #ifdef DEBUG_READ
-	printk(KERN_DEBUG "%s:  promise_read: sectors(%ld-%ld), "
-	       "buf=0x%08lx, rem=%ld\n", drive->name, rq->sector,
-	       rq->sector+nsect-1, (unsigned long) rq->buffer,
+	printk(KERN_DEBUG "%s:  promise_read: sectors(%llu-%llu), "
+	       "buf=0x%08lx, rem=%ld\n", drive->name, (unsigned long long)rq->sector,
+	       (unsigned long long)(rq->sector+nsect-1), (unsigned long) rq->buffer,
 	       rq->nr_sectors-nsect);
 #endif
 	rq->sector += nsect;
@@ -460,9 +460,9 @@
 	struct request *rq = &hwgroup->wrq;
 
 #ifdef DEBUG_WRITE
-	printk(KERN_DEBUG "%s: promise_write: sectors(%ld-%ld), "
-	       "buffer=%p\n", drive->name, rq->sector,
-	       rq->sector + rq->nr_sectors - 1, rq->buffer);
+	printk(KERN_DEBUG "%s: promise_write: sectors(%llu-%llu), "
+	       "buffer=%p\n", drive->name, (unsigned long long)rq->sector,
+	       (unsigned long long)rq->sector + rq->nr_sectors - 1, rq->buffer);
 #endif
 
 	/*
diff -Nru a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
--- a/drivers/ieee1394/sbp2.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/ieee1394/sbp2.c	Mon Apr  7 13:52:18 2003
@@ -3160,12 +3160,12 @@
 
 	heads = 64;
 	sectors = 32;
-	cylinders = disk->capacity / (heads * sectors);
+	cylinders = (unsigned int)disk->capacity / (heads * sectors);
 
 	if (cylinders > 1024) {
 		heads = 255;
 		sectors = 63;
-		cylinders = disk->capacity / (heads * sectors);
+		cylinders = (unsigned int)disk->capacity / (heads * sectors);
 	}
 
 	geom[0] = heads;
diff -Nru a/drivers/md/linear.c b/drivers/md/linear.c
--- a/drivers/md/linear.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/md/linear.c	Mon Apr  7 13:52:18 2003
@@ -32,8 +32,9 @@
 	linear_conf_t *conf;
 	struct linear_hash *table;
 	mdk_rdev_t *rdev;
-	int size, i, j, nb_zone;
-	unsigned int curr_offset;
+	s64 size;
+	int i, j, nb_zone;
+	sector_t curr_offset;
 
 	MOD_INC_USE_COUNT;
 
@@ -54,10 +55,16 @@
 	curr_offset = 0;
 	ITERATE_RDEV_ORDERED(mddev,rdev,j) {
 		dev_info_t *disk = conf->disks + j;
+		long x;
 
 		disk->dev = rdev->dev;
 		disk->size = rdev->size;
 		disk->offset = curr_offset;
+		x = disk->size;
+		if (unlikely((sector_t)x != disk->size)) {
+			printk("linear: Array members must be smaller than 2TB, aborting\n");
+			goto out;
+		}
 
 		curr_offset += disk->size;
 
@@ -65,10 +72,14 @@
 			conf->smallest = disk;
 	}
 
-	nb_zone = conf->nr_zones =
-		md_size[mdidx(mddev)] / conf->smallest->size +
-		((md_size[mdidx(mddev)] % conf->smallest->size) ? 1 : 0);
-  
+
+
+	{
+		sector_t sz = md_size[mdidx(mddev)];
+		unsigned round = sector_div(sz, (long)conf->smallest->size);
+		nb_zone = conf->nr_zones = sz + (round != 0);
+	}
+
 	conf->hash_table = kmalloc (sizeof (struct linear_hash) * nb_zone,
 					GFP_KERNEL);
 	if (!conf->hash_table)
@@ -87,7 +98,6 @@
 			table[-1].dev1 = disk;
 		}
 		size += disk->size;
-
 		while (size>0) {
 			table->dev0 = disk;
 			table->dev1 = NULL;
@@ -125,15 +135,21 @@
         linear_conf_t *conf = mddev_to_conf(mddev);
         struct linear_hash *hash;
         dev_info_t *tmp_dev;
-        long block;
+        sector_t block;
+	sector_t hashindex;
 
 	block = bh->b_rsector >> 1;
-	hash = conf->hash_table + (block / conf->smallest->size);
+
+	BUG_ON((sector_t)block != ((sector_t)bh->b_rsector >> 1));
+	
+	hashindex = block;
+	sector_div(hashindex, (long)conf->smallest->size);
+	hash = conf->hash_table + hashindex;
   
 	if (block >= (hash->dev0->size + hash->dev0->offset)) {
 		if (!hash->dev1) {
-			printk ("linear_make_request : hash->dev1==NULL for block %ld\n",
-						block);
+			printk ("linear_make_request : hash->dev1==NULL for block %llu\n",
+						(unsigned long long)block);
 			buffer_IO_error(bh);
 			return 0;
 		}
@@ -143,7 +159,11 @@
     
 	if (block >= (tmp_dev->size + tmp_dev->offset)
 				|| block < tmp_dev->offset) {
-		printk ("linear_make_request: Block %ld out of bounds on dev %s size %ld offset %ld\n", block, kdevname(tmp_dev->dev), tmp_dev->size, tmp_dev->offset);
+		printk ("linear_make_request: Block %llu out of bounds on dev %s size %ld offset %ld\n", 
+			(unsigned long long)block, 
+			kdevname(tmp_dev->dev), 
+			(long)tmp_dev->size, 
+			(long)tmp_dev->offset);
 		buffer_IO_error(bh);
 		return 0;
 	}
diff -Nru a/drivers/md/lvm-snap.c b/drivers/md/lvm-snap.c
--- a/drivers/md/lvm-snap.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/md/lvm-snap.c	Mon Apr  7 13:52:18 2003
@@ -71,7 +71,7 @@
 
 
 static inline int __brw_kiovec(int rw, int nr, struct kiobuf *iovec[],
-			       kdev_t dev, unsigned long b[], int size,
+			       kdev_t dev, sector_t b[], int size,
 			       lv_t *lv) {
 	return brw_kiovec(rw, nr, iovec, dev, b, size);
 }
@@ -218,8 +218,8 @@
 	       reason);
 }
 
-static inline int lvm_snapshot_prepare_blocks(unsigned long *blocks,
-					       unsigned long start,
+static inline int lvm_snapshot_prepare_blocks(sector_t *blocks,
+					       sector_t start,
 					       int nr_sectors,
 					       int blocksize)
 {
@@ -231,7 +231,7 @@
 		return 0;
 
 	nr_blocks = nr_sectors / sectors_per_block;
-	start /= sectors_per_block;
+	sector_div(start, sectors_per_block);
 
 	for (i = 0; i < nr_blocks; i++)
 		blocks[i] = start++;
@@ -356,7 +356,7 @@
 	unsigned long phys_start;
 	int idx = lv_snap->lv_remap_ptr, chunk_size = lv_snap->lv_chunk_size;
 	struct kiobuf * iobuf = lv_snap->lv_iobuf;
-	unsigned long *blocks = iobuf->blocks;
+	sector_t *blocks = iobuf->blocks;
 	int blksize_snap, blksize_org, min_blksize, max_blksize;
 	int max_sectors, nr_sectors;
 
@@ -621,7 +621,7 @@
 	uint pvn;
 	ulong snap_pe_start, COW_table_sector_offset,
 	      COW_entries_per_pe, COW_chunks_per_pe, COW_entries_per_block;
-	ulong blocks[1];
+	sector_t blocks[1];
 	kdev_t snap_phys_dev;
 	lv_block_exception_t *be;
 	struct kiobuf *COW_table_iobuf = lv_snap->lv_COW_table_iobuf;
diff -Nru a/drivers/md/lvm.c b/drivers/md/lvm.c
--- a/drivers/md/lvm.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/md/lvm.c	Mon Apr  7 13:52:17 2003
@@ -417,7 +417,7 @@
 static struct hd_struct lvm_hd_struct[MAX_LV];
 static int lvm_blocksizes[MAX_LV];
 static int lvm_hardsectsizes[MAX_LV];
-static int lvm_size[MAX_LV];
+static sector_t lvm_size[MAX_LV];
 
 static struct gendisk lvm_gendisk =
 {
diff -Nru a/drivers/md/md.c b/drivers/md/md.c
--- a/drivers/md/md.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/md/md.c	Mon Apr  7 13:52:18 2003
@@ -109,7 +109,7 @@
 static int md_maxreadahead[MAX_MD_DEVS];
 static mdk_thread_t *md_recovery_thread;
 
-int md_size[MAX_MD_DEVS];
+sector_t md_size[MAX_MD_DEVS];
 
 static struct block_device_operations md_fops;
 static devfs_handle_t devfs_handle;
@@ -282,10 +282,10 @@
 	return dname->name;
 }
 
-static unsigned int calc_dev_sboffset(kdev_t dev, mddev_t *mddev,
+static sector_t calc_dev_sboffset(kdev_t dev, mddev_t *mddev,
 						int persistent)
 {
-	unsigned int size = 0;
+	sector_t size = 0;
 
 	if (blk_size[MAJOR(dev)])
 		size = blk_size[MAJOR(dev)][MINOR(dev)];
@@ -294,9 +294,9 @@
 	return size;
 }
 
-static unsigned int calc_dev_size(kdev_t dev, mddev_t *mddev, int persistent)
+static sector_t calc_dev_size(kdev_t dev, mddev_t *mddev, int persistent)
 {
-	unsigned int size;
+	sector_t size;
 
 	size = calc_dev_sboffset(dev, mddev, persistent);
 	if (!mddev->sb) {
@@ -304,13 +304,13 @@
 		return size;
 	}
 	if (mddev->sb->chunk_size)
-		size &= ~(mddev->sb->chunk_size/1024 - 1);
+		size &= ~((sector_t)mddev->sb->chunk_size/1024 - 1);
 	return size;
 }
 
 static unsigned int zoned_raid_size(mddev_t *mddev)
 {
-	unsigned int mask;
+	sector_t mask;
 	mdk_rdev_t * rdev;
 	struct md_list_head *tmp;
 
@@ -321,7 +321,7 @@
 	/*
 	 * do size and offset calculations.
 	 */
-	mask = ~(mddev->sb->chunk_size/1024 - 1);
+	mask = ~((sector_t)mddev->sb->chunk_size/1024 - 1);
 
 	ITERATE_RDEV(mddev,rdev,tmp) {
 		rdev->size &= mask;
@@ -331,7 +331,7 @@
 }
 
 /*
- * We check wether all devices are numbered from 0 to nb_dev-1. The
+ * We check whether all devices are numbered from 0 to nb_dev-1. The
  * order is guaranteed even after device name changes.
  *
  * Some personalities (raid0, linear) use this. Personalities that
@@ -474,7 +474,7 @@
 	struct buffer_head *bh = NULL;
 	kdev_t dev = rdev->dev;
 	mdp_super_t *sb;
-	unsigned long sb_offset;
+	sector_t sb_offset;
 
 	if (!rdev->sb) {
 		MD_BUG();
@@ -784,7 +784,7 @@
 {
 	printk(KERN_INFO "md: rdev %s: O:%s, SZ:%08ld F:%d DN:%d ",
 		partition_name(rdev->dev), partition_name(rdev->old_dev),
-		rdev->size, rdev->faulty, rdev->desc_nr);
+		(long)rdev->size, rdev->faulty, rdev->desc_nr);
 	if (rdev->sb) {
 		printk(KERN_INFO "md: rdev superblock:\n");
 		print_sb(rdev->sb);
@@ -892,7 +892,7 @@
 {
 	struct buffer_head *bh;
 	kdev_t dev;
-	unsigned long sb_offset, size;
+	sector_t sb_offset, size;
 	mdp_super_t *sb;
 
 	if (!rdev->sb) {
@@ -911,8 +911,8 @@
 	dev = rdev->dev;
 	sb_offset = calc_dev_sboffset(dev, rdev->mddev, 1);
 	if (rdev->sb_offset != sb_offset) {
-		printk(KERN_INFO "%s's sb offset has changed from %ld to %ld, skipping\n",
-		       partition_name(dev), rdev->sb_offset, sb_offset);
+		printk(KERN_INFO "%s's sb offset has changed from %llu to %llu, skipping\n",
+		       partition_name(dev), (unsigned long long)rdev->sb_offset, (unsigned long long)sb_offset);
 		goto skip;
 	}
 	/*
@@ -922,12 +922,13 @@
 	 */
 	size = calc_dev_size(dev, rdev->mddev, 1);
 	if (size != rdev->size) {
-		printk(KERN_INFO "%s's size has changed from %ld to %ld since import, skipping\n",
-		       partition_name(dev), rdev->size, size);
+		printk(KERN_INFO "%s's size has changed from %llu to %llu since import, skipping\n",
+		       partition_name(dev), (unsigned long long)rdev->size, 
+		       (unsigned long long)size);
 		goto skip;
 	}
 
-	printk(KERN_INFO "(write) %s's sb offset: %ld\n", partition_name(dev), sb_offset);
+	printk(KERN_INFO "(write) %s's sb offset: %llu\n", partition_name(dev), (unsigned long long)sb_offset);
 	fsync_dev(dev);
 	set_blocksize(dev, MD_SB_BYTES);
 	bh = getblk(dev, sb_offset / MD_SB_BLOCKS, MD_SB_BYTES);
@@ -1071,7 +1072,7 @@
 {
 	int err;
 	mdk_rdev_t *rdev;
-	unsigned int size;
+	sector_t size;
 
 	if (find_rdev_all(newdev))
 		return -EEXIST;
@@ -1538,9 +1539,9 @@
 		rdev->size = calc_dev_size(rdev->dev, mddev, persistent);
 		if (rdev->size < sb->chunk_size / 1024) {
 			printk(KERN_WARNING
-				"md: Dev %s smaller than chunk_size: %ldk < %dk\n",
+				"md: Dev %s smaller than chunk_size: %lluk < %dk\n",
 				partition_name(rdev->dev),
-				rdev->size, sb->chunk_size / 1024);
+				(unsigned long long)rdev->size, sb->chunk_size / 1024);
 			return -EINVAL;
 		}
 	}
@@ -2180,7 +2181,8 @@
 
 static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
 {
-	int err, size, persistent;
+	int err, persistent;
+	sector_t size;
 	mdk_rdev_t *rdev;
 	unsigned int nr;
 	kdev_t dev;
@@ -2611,20 +2613,7 @@
 #endif
 
 		case BLKGETSIZE:	/* Return device size */
-			if (!arg) {
-				err = -EINVAL;
-				MD_BUG();
-				goto abort;
-			}
-			err = md_put_user(md_hd_struct[minor].nr_sects,
-						(unsigned long *) arg);
-			goto done;
-
 		case BLKGETSIZE64:	/* Return device size */
-			err = md_put_user((u64)md_hd_struct[minor].nr_sects << 9,
-						(u64 *) arg);
-			goto done;
-
 		case BLKRAGET:
 		case BLKRASET:
 		case BLKFLSBUF:
@@ -2861,7 +2850,7 @@
 
 		default:
 			printk(KERN_WARNING "md: %s(pid %d) used obsolete MD ioctl, "
-			       "upgrade your software to use new ictls.\n",
+			       "upgrade your software to use new ioctls.\n",
 			       current->comm, current->pid);
 			err = -EINVAL;
 			goto abort_unlock;
@@ -3161,7 +3150,8 @@
 static int md_status_read_proc(char *page, char **start, off_t off,
 			int count, int *eof, void *data)
 {
-	int sz = 0, j, size;
+	int sz = 0, j;
+	sector_t size;
 	struct md_list_head *tmp, *tmp2;
 	mdk_rdev_t *rdev;
 	mddev_t *mddev;
@@ -3202,10 +3192,10 @@
 
 		if (mddev->nb_dev) {
 			if (mddev->pers)
-				sz += sprintf(page + sz, "\n      %d blocks",
-						 md_size[mdidx(mddev)]);
+				sz += sprintf(page + sz, "\n      %llu blocks",
+						 (unsigned long long)md_size[mdidx(mddev)]);
 			else
-				sz += sprintf(page + sz, "\n      %d blocks", size);
+				sz += sprintf(page + sz, "\n      %llu blocks", (unsigned long long)size);
 		}
 
 		if (!mddev->pers) {
diff -Nru a/drivers/md/multipath.c b/drivers/md/multipath.c
--- a/drivers/md/multipath.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/md/multipath.c	Mon Apr  7 13:52:18 2003
@@ -216,8 +216,8 @@
 	/*
 	 * oops, IO error:
 	 */
-	printk(KERN_ERR "multipath: %s: rescheduling block %lu\n", 
-		 partition_name(bh->b_dev), bh->b_blocknr);
+	printk(KERN_ERR "multipath: %s: rescheduling block %llu\n", 
+		 partition_name(bh->b_dev), (unsigned long long)bh->b_blocknr);
 	multipath_reschedule_retry(mp_bh);
 	return;
 }
@@ -670,10 +670,10 @@
 
 
 #define IO_ERROR KERN_ALERT \
-"multipath: %s: unrecoverable IO read error for block %lu\n"
+"multipath: %s: unrecoverable IO read error for block %llu\n"
 
 #define REDIRECT_SECTOR KERN_ERR \
-"multipath: %s: redirecting sector %lu to another IO path\n"
+"multipath: %s: redirecting sector %llu to another IO path\n"
 
 /*
  * This is a kernel thread which:
@@ -708,11 +708,11 @@
 		
 		multipath_map (mddev, &bh->b_dev);
 		if (bh->b_dev == dev) {
-			printk (IO_ERROR, partition_name(bh->b_dev), bh->b_blocknr);
+			printk (IO_ERROR, partition_name(bh->b_dev), (unsigned long long)bh->b_blocknr);
 			multipath_end_bh_io(mp_bh, 0);
 		} else {
 			printk (REDIRECT_SECTOR,
-				partition_name(bh->b_dev), bh->b_blocknr);
+				partition_name(bh->b_dev), (unsigned long long)bh->b_blocknr);
 			bh->b_rdev = bh->b_dev;
 			bh->b_rsector = bh->b_blocknr;
 			generic_make_request (mp_bh->cmd, bh);
diff -Nru a/drivers/md/raid0.c b/drivers/md/raid0.c
--- a/drivers/md/raid0.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/md/raid0.c	Mon Apr  7 13:52:18 2003
@@ -41,7 +41,10 @@
 		printk("raid0: looking at %s\n", partition_name(rdev1->dev));
 		c = 0;
 		ITERATE_RDEV_ORDERED(mddev,rdev2,j2) {
-			printk("raid0:   comparing %s(%ld) with %s(%ld)\n", partition_name(rdev1->dev), rdev1->size, partition_name(rdev2->dev), rdev2->size);
+			printk("raid0:   comparing %s(%llu) with %s(%llu)\n", partition_name(rdev1->dev),
+			       (unsigned long long)rdev1->size, 
+			       partition_name(rdev2->dev), 
+			       (unsigned long long)rdev2->size);
 			if (rdev2 == rdev1) {
 				printk("raid0:   END\n");
 				break;
@@ -95,7 +98,7 @@
 				c++;
 				if (!smallest || (rdev->size <smallest->size)) {
 					smallest = rdev;
-					printk("  (%ld) is smallest!.\n", rdev->size);
+					printk("  (%llu) is smallest!.\n", (unsigned long long)rdev->size);
 				}
 			} else
 				printk(" nope.\n");
@@ -120,7 +123,8 @@
 
 static int raid0_run (mddev_t *mddev)
 {
-	unsigned long cur=0, i=0, size, zone0_size, nb_zone;
+	unsigned long cur=0, i=0, zone0_size, nb_zone;
+	sector_t size;
 	raid0_conf_t *conf;
 
 	MOD_INC_USE_COUNT;
@@ -138,13 +142,18 @@
 	if (create_strip_zones (mddev)) 
 		goto out_free_conf;
 
-	printk("raid0 : md_size is %d blocks.\n", md_size[mdidx(mddev)]);
+	printk("raid0 : md_size is %llu blocks.\n", (unsigned long long)md_size[mdidx(mddev)]);
 	printk("raid0 : conf->smallest->size is %ld blocks.\n", conf->smallest->size);
-	nb_zone = md_size[mdidx(mddev)]/conf->smallest->size +
-			(md_size[mdidx(mddev)] % conf->smallest->size ? 1 : 0);
-	printk("raid0 : nb_zone is %ld.\n", nb_zone);
-	conf->nr_zones = nb_zone;
 
+	{
+#if __GNUC__ < 3 /* work around bug in gcc 2.9[56] */
+		volatile 
+#endif
+			sector_t sz = md_size[mdidx(mddev)];
+		unsigned round = sector_div(sz, conf->smallest->size);
+		conf->nr_zones = nb_zone =  sz + (round != 0);
+	}
+	printk("raid0 : nb_zone is %ld.\n", nb_zone);
 	printk("raid0 : Allocating %ld bytes for hash.\n",
 				nb_zone*sizeof(struct raid0_hash));
 
diff -Nru a/drivers/md/raid1.c b/drivers/md/raid1.c
--- a/drivers/md/raid1.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/md/raid1.c	Mon Apr  7 13:52:17 2003
@@ -441,8 +441,8 @@
 		/*
 		 * oops, read error:
 		 */
-		printk(KERN_ERR "raid1: %s: rescheduling block %lu\n", 
-			 partition_name(bh->b_dev), bh->b_blocknr);
+		printk(KERN_ERR "raid1: %s: rescheduling block %llu\n", 
+			 partition_name(bh->b_dev), (unsigned long long)bh->b_blocknr);
 		raid1_reschedule_retry(r1_bh);
 		return;
 	}
@@ -1137,10 +1137,10 @@
 
 
 #define IO_ERROR KERN_ALERT \
-"raid1: %s: unrecoverable I/O read error for block %lu\n"
+"raid1: %s: unrecoverable I/O read error for block %llu\n"
 
 #define REDIRECT_SECTOR KERN_ERR \
-"raid1: %s: redirecting sector %lu to another mirror\n"
+"raid1: %s: redirecting sector %llu to another mirror\n"
 
 /*
  * This is a kernel thread which:
@@ -1251,7 +1251,7 @@
 				 * as reconstruct is about to be aborted
 				 */
 
-				printk (IO_ERROR, partition_name(bh->b_dev), bh->b_blocknr);
+				printk (IO_ERROR, partition_name(bh->b_dev), (unsigned long long)bh->b_blocknr);
 				md_done_sync(mddev, bh->b_size>>9, 0);
 			}
 
@@ -1261,11 +1261,11 @@
 			dev = bh->b_dev;
 			raid1_map (mddev, &bh->b_dev);
 			if (bh->b_dev == dev) {
-				printk (IO_ERROR, partition_name(bh->b_dev), bh->b_blocknr);
+				printk (IO_ERROR, partition_name(bh->b_dev), (unsigned long long)bh->b_blocknr);
 				raid1_end_bh_io(r1_bh, 0);
 			} else {
 				printk (REDIRECT_SECTOR,
-					partition_name(bh->b_dev), bh->b_blocknr);
+					partition_name(bh->b_dev), (unsigned long long)bh->b_blocknr);
 				bh->b_rdev = bh->b_dev;
 				bh->b_rsector = bh->b_blocknr;
 				generic_make_request (r1_bh->cmd, bh);
diff -Nru a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c
--- a/drivers/message/i2o/i2o_block.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/message/i2o/i2o_block.c	Mon Apr  7 13:52:18 2003
@@ -125,7 +125,7 @@
 
 static int i2ob_blksizes[MAX_I2OB<<4];
 static int i2ob_hardsizes[MAX_I2OB<<4];
-static int i2ob_sizes[MAX_I2OB<<4];
+static sector_t i2ob_sizes[MAX_I2OB<<4];
 static int i2ob_media_change_flag[MAX_I2OB];
 static u32 i2ob_max_sectors[MAX_I2OB<<4];
 
diff -Nru a/drivers/mtd/devices/blkmtd.c b/drivers/mtd/devices/blkmtd.c
--- a/drivers/mtd/devices/blkmtd.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/mtd/devices/blkmtd.c	Mon Apr  7 13:52:17 2003
@@ -167,7 +167,7 @@
   int sectornr, sectors, i;
   struct kiobuf *iobuf;
   kdev_t dev;
-  unsigned long *blocks;
+  sector_t *blocks;
 
   if(!rawdevice) {
     printk("blkmtd: readpage: PANIC file->private_data == NULL\n");
@@ -227,7 +227,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);
diff -Nru a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c
--- a/drivers/mtd/mtdblock.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/mtd/mtdblock.c	Mon Apr  7 13:52:18 2003
@@ -57,7 +57,7 @@
 
 static spinlock_t mtdblks_lock;
 
-static int mtd_sizes[MAX_MTD_DEVICES];
+static sector_t mtd_sizes[MAX_MTD_DEVICES];
 static int mtd_blksizes[MAX_MTD_DEVICES];
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,14)
diff -Nru a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
--- a/drivers/scsi/3w-xxxx.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/3w-xxxx.c	Mon Apr  7 13:52:18 2003
@@ -2256,12 +2256,12 @@
 
 	heads = 64;
 	sectors = 32;
-	cylinders = disk->capacity / (heads * sectors);
+	cylinders = (long)disk->capacity / (heads * sectors);
 
 	if (disk->capacity >= 0x200000) {
 		heads = 255;
 		sectors = 63;
-		cylinders = disk->capacity / (heads * sectors);
+		cylinders = (long)disk->capacity / (heads * sectors);
 	}
 
 	dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_biosparam(): heads = %d, sectors = %d, cylinders = %d\n", heads, sectors, cylinders);
diff -Nru a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
--- a/drivers/scsi/BusLogic.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/BusLogic.c	Mon Apr  7 13:52:18 2003
@@ -4127,7 +4127,7 @@
       DiskParameters->Sectors = 32;
     }
   DiskParameters->Cylinders =
-    Disk->capacity / (DiskParameters->Heads * DiskParameters->Sectors);
+    (unsigned long)Disk->capacity / (DiskParameters->Heads * DiskParameters->Sectors);
   /*
     Attempt to read the first 1024 bytes from the disk device.
   */
@@ -4175,7 +4175,7 @@
 	  PartitionEntryEndSector = FirstPartitionEntry->end_sector & 0x3F;
 	}
       DiskParameters->Cylinders =
-	Disk->capacity / (DiskParameters->Heads * DiskParameters->Sectors);
+	(unsigned long)Disk->capacity / (DiskParameters->Heads * DiskParameters->Sectors);
       if (PartitionNumber < 4 &&
 	  PartitionEntryEndSector == DiskParameters->Sectors)
 	{
diff -Nru a/drivers/scsi/Makefile b/drivers/scsi/Makefile
--- a/drivers/scsi/Makefile	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/Makefile	Mon Apr  7 13:52:18 2003
@@ -176,42 +176,41 @@
 cpqfc.o: $(cpqfc-objs)
 	$(LD) -r -o $@ $(cpqfc-objs)
 
-53c8xx_d.h: 53c7,8xx.scr script_asm.pl
+53c8xx_u.h 53c8xx_d.h: 53c7,8xx.scr script_asm.pl
 	ln -sf 53c7,8xx.scr fake8.c
 	$(CPP) $(CPPFLAGS) -traditional -DCHIP=810 fake8.c | grep -v '^#' | $(PERL) script_asm.pl 
+	rm -f 53c8xx_d.h 53c8xx_u.h
 	mv script.h 53c8xx_d.h
 	mv scriptu.h 53c8xx_u.h
 	rm fake8.c
 
-53c8xx_u.h: 53c8xx_d.h
 
 53c7,8xx.o: 53c8xx_u.h
 
-53c7xx_d.h: 53c7xx.scr script_asm.pl
+53c7xx_u.h 53c7xx_d.h: 53c7xx.scr script_asm.pl
 	ln -sf 53c7xx.scr fake7.c
 	$(CPP) $(CPPFLAGS) -traditional -DCHIP=710 fake7.c | grep -v '^#' | $(PERL) -s script_asm.pl -ncr710
+	rm -f 53c7xx_d.h 53c7xx_u.h
 	mv script.h 53c7xx_d.h
 	mv scriptu.h 53c7xx_u.h
 	rm fake7.c
 
-53c7xx_u.h: 53c7xx_d.h
 
 53c7xx.o : 53c7xx_d.h
 
-sim710_d.h: sim710.scr script_asm.pl
+sim710_u.h sim710_d.h: sim710.scr script_asm.pl
 	ln -sf sim710.scr fake7.c
 	$(CPP) $(CPPFLAGS) -traditional -DCHIP=710 fake7.c | grep -v '^#' | $(PERL) -s script_asm.pl -ncr710
+	rm -f sim710_d.h sim710_u.h
 	mv script.h sim710_d.h
 	mv scriptu.h sim710_u.h
 	rm fake7.c
 
-sim710_u.h: sim710_d.h
-
 sim710.o : sim710_d.h
 
 53c700_d.h: 53c700.scr script_asm.pl
 	$(PERL) -s script_asm.pl -ncr7x0_family < 53c700.scr
-	rm -f scriptu.h
+	rm -f scriptu.h 53c700_d.h
 	mv script.h 53c700_d.h
 
 53c700.o: 53c700_d.h
diff -Nru a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
--- a/drivers/scsi/aacraid/linit.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/aacraid/linit.c	Mon Apr  7 13:52:17 2003
@@ -443,7 +443,7 @@
 		param->sectors = 32;
 	}
 
-	param->cylinders = disk->capacity/(param->heads * param->sectors);
+	param->cylinders = (unsigned long)disk->capacity/(param->heads * param->sectors);
 
 	/*
 	 *	Read the first 1024 bytes from the disk device
@@ -498,7 +498,7 @@
 			end_sec = first->end_sector & 0x3f;
 		}
 
-		param->cylinders = disk->capacity / (param->heads * param->sectors);
+		param->cylinders = (unsigned long)disk->capacity / (param->heads * param->sectors);
 
 		if(num < 4 && end_sec == param->sectors)
 		{
diff -Nru a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
--- a/drivers/scsi/advansys.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/advansys.c	Mon Apr  7 13:52:18 2003
@@ -6219,7 +6219,7 @@
                 ip[1] = 32;
         }
     }
-    ip[2] = dp->capacity / (ip[0] * ip[1]);
+    ip[2] = (long)dp->capacity / (ip[0] * ip[1]);
     ASC_DBG(1, "advansys_biosparam: end\n");
     return 0;
 }
diff -Nru a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c
--- a/drivers/scsi/aha152x.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/aha152x.c	Mon Apr  7 13:52:17 2003
@@ -1848,7 +1848,7 @@
 	/* try default translation */
 	info_array[0] = 64;
 	info_array[1] = 32;
-	info_array[2] = disk->capacity / (64 * 32);
+	info_array[2] = (long)disk->capacity / (64 * 32);
 
 	/* for disks >1GB do some guessing */
 	if (info_array[2] >= 1024) {
@@ -1863,7 +1863,7 @@
 				       "         using extended translation.\n");
 				info_array[0] = 255;
 				info_array[1] = 63;
-				info_array[2] = disk->capacity / (255 * 63);
+				info_array[2] = (long)disk->capacity / (255 * 63);
 			} else {
 				printk(KERN_NOTICE
 				       "aha152x: unable to verify geometry for disk with >1GB.\n"
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c	Mon Apr  7 13:52:18 2003
@@ -2924,6 +2924,7 @@
 	int	extended;
 	struct	ahc_softc *ahc;
 	struct	buffer_head *bh;
+	sector_t capacity;
 
 	ahc = *((struct ahc_softc **)disk->device->host->hostdata);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,17)
@@ -2941,7 +2942,7 @@
 	}
 	heads = 64;
 	sectors = 32;
-	cylinders = disk->capacity / (heads * sectors);
+	cylinders = (unsigned long)disk->capacity / (heads * sectors);
 
 	if (aic7xxx_extended != 0)
 		extended = 1;
@@ -2952,7 +2953,7 @@
 	if (extended && cylinders >= 1024) {
 		heads = 255;
 		sectors = 63;
-		cylinders = disk->capacity / (heads * sectors);
+		cylinders = (unsigned long)disk->capacity / (heads * sectors);
 	}
 	geom[0] = heads;
 	geom[1] = sectors;
diff -Nru a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c
--- a/drivers/scsi/aic7xxx_old.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/aic7xxx_old.c	Mon Apr  7 13:52:18 2003
@@ -11752,13 +11752,13 @@
   
   heads = 64;
   sectors = 32;
-  cylinders = disk->capacity / (heads * sectors);
+  cylinders = (long)disk->capacity / (heads * sectors);
 
   if ((p->flags & AHC_EXTEND_TRANS_A) && (cylinders > 1024))
   {
     heads = 255;
     sectors = 63;
-    cylinders = disk->capacity / (heads * sectors);
+    cylinders = (long)disk->capacity / (heads * sectors);
   }
 
   geom[0] = heads;
diff -Nru a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
--- a/drivers/scsi/atp870u.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/atp870u.c	Mon Apr  7 13:52:18 2003
@@ -2850,12 +2850,12 @@
 
 	heads = 64;
 	sectors = 32;
-	cylinders = disk->capacity / (heads * sectors);
+	cylinders = (long)disk->capacity / (heads * sectors);
 
 	if (cylinders > 1024) {
 		heads = 255;
 		sectors = 63;
-		cylinders = disk->capacity / (heads * sectors);
+		cylinders = (long)disk->capacity / (heads * sectors);
 	}
 	ip[0] = heads;
 	ip[1] = sectors;
diff -Nru a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
--- a/drivers/scsi/dpt_i2o.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/dpt_i2o.c	Mon Apr  7 13:52:18 2003
@@ -481,7 +481,7 @@
 		heads = 255;
 		sectors = 63;
 	}
-	cylinders = disk->capacity / (heads * sectors);
+	cylinders = (unsigned long)disk->capacity / (heads * sectors);
 
 	// Special case if CDROM
 	if(disk->device->type == 5) {  // CDROM
diff -Nru a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
--- a/drivers/scsi/gdth.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/gdth.c	Mon Apr  7 13:52:18 2003
@@ -4533,7 +4533,7 @@
     } else {
         ip[0] = ha->hdr[t].heads;
         ip[1] = ha->hdr[t].secs;
-        ip[2] = disk->capacity / ip[0] / ip[1];
+        ip[2] = (unsigned long)disk->capacity / ip[0] / ip[1];
     }
 
     TRACE2(("gdth_bios_param(): %d heads, %d secs, %d cyls\n",
diff -Nru a/drivers/scsi/ibmmca.c b/drivers/scsi/ibmmca.c
--- a/drivers/scsi/ibmmca.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/ibmmca.c	Mon Apr  7 13:52:17 2003
@@ -2386,15 +2386,15 @@
 {
    info[0] = 64;
    info[1] = 32;
-   info[2] = disk->capacity / (info[0] * info[1]);
+   info[2] = (long)disk->capacity / (info[0] * info[1]);
    if (info[2] >= 1024) {
       info[0] = 128;
       info[1] = 63;
-      info[2] = disk->capacity / (info[0] * info[1]);
+      info[2] = (long)disk->capacity / (info[0] * info[1]);
       if (info[2] >= 1024) {
 	 info[0] = 255;
 	 info[1] = 63;
-	 info[2] = disk->capacity / (info[0] * info[1]);
+	 info[2] = (long)disk->capacity / (info[0] * info[1]);
 	 if (info[2] >= 1024)
 	   info[2] = 1023;
       }
diff -Nru a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
--- a/drivers/scsi/ide-scsi.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/ide-scsi.c	Mon Apr  7 13:52:17 2003
@@ -454,11 +454,12 @@
 /*
  *	idescsi_do_request is our request handling function.
  */
-static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *rq, unsigned long block)
+static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *rq, sector_t block)
 {
 #if IDESCSI_DEBUG_LOG
 	printk (KERN_INFO "rq_status: %d, rq_dev: %u, cmd: %d, errors: %d\n",rq->rq_status,(unsigned int) rq->rq_dev,rq->cmd,rq->errors);
-	printk (KERN_INFO "sector: %ld, nr_sectors: %ld, current_nr_sectors: %ld\n",rq->sector,rq->nr_sectors,rq->current_nr_sectors);
+	printk (KERN_INFO "sector: %llu, nr_sectors: %ld, current_nr_sectors: %ld\n",
+		(unsigned long long)rq->sector,rq->nr_sectors,rq->current_nr_sectors);
 #endif /* IDESCSI_DEBUG_LOG */
 
 	if (rq->cmd == IDESCSI_PC_RQ) {
diff -Nru a/drivers/scsi/imm.c b/drivers/scsi/imm.c
--- a/drivers/scsi/imm.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/imm.c	Mon Apr  7 13:52:18 2003
@@ -1129,11 +1129,11 @@
 {
     ip[0] = 0x40;
     ip[1] = 0x20;
-    ip[2] = (disk->capacity + 1) / (ip[0] * ip[1]);
+    ip[2] = ((long)disk->capacity + 1) / (ip[0] * ip[1]);
     if (ip[2] > 1024) {
 	ip[0] = 0xff;
 	ip[1] = 0x3f;
-	ip[2] = (disk->capacity + 1) / (ip[0] * ip[1]);
+	ip[2] = ((long)disk->capacity + 1) / (ip[0] * ip[1]);
     }
     return 0;
 }
diff -Nru a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c
--- a/drivers/scsi/in2000.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/in2000.c	Mon Apr  7 13:52:18 2003
@@ -2174,17 +2174,17 @@
    if (iinfo[2] > 1024) {
       iinfo[0] = 64;
       iinfo[1] = 63;
-      iinfo[2] = disk->capacity / (iinfo[0] * iinfo[1]);
+      iinfo[2] = (long)disk->capacity / (iinfo[0] * iinfo[1]);
       }
    if (iinfo[2] > 1024) {
       iinfo[0] = 128;
       iinfo[1] = 63;
-      iinfo[2] = disk->capacity / (iinfo[0] * iinfo[1]);
+      iinfo[2] = (long)disk->capacity / (iinfo[0] * iinfo[1]);
       }
    if (iinfo[2] > 1024) {
       iinfo[0] = 255;
       iinfo[1] = 63;
-      iinfo[2] = disk->capacity / (iinfo[0] * iinfo[1]);
+      iinfo[2] = (long)disk->capacity / (iinfo[0] * iinfo[1]);
       }
     return 0;
 }
diff -Nru a/drivers/scsi/ini9100u.c b/drivers/scsi/ini9100u.c
--- a/drivers/scsi/ini9100u.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/ini9100u.c	Mon Apr  7 13:52:18 2003
@@ -592,16 +592,16 @@
 	if (pTcb->TCS_DrvHead) {
 		info_array[0] = pTcb->TCS_DrvHead;
 		info_array[1] = pTcb->TCS_DrvSector;
-		info_array[2] = disk->capacity / pTcb->TCS_DrvHead / pTcb->TCS_DrvSector;
+		info_array[2] = (long)disk->capacity / pTcb->TCS_DrvHead / pTcb->TCS_DrvSector;
 	} else {
 		if (pTcb->TCS_DrvFlags & TCF_DRV_255_63) {
 			info_array[0] = 255;
 			info_array[1] = 63;
-			info_array[2] = disk->capacity / 255 / 63;
+			info_array[2] = (long)disk->capacity / 255 / 63;
 		} else {
 			info_array[0] = 64;
 			info_array[1] = 32;
-			info_array[2] = disk->capacity >> 11;
+			info_array[2] = (long)disk->capacity >> 11;
 		}
 	}
 
diff -Nru a/drivers/scsi/inia100.c b/drivers/scsi/inia100.c
--- a/drivers/scsi/inia100.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/inia100.c	Mon Apr  7 13:52:18 2003
@@ -701,16 +701,16 @@
 	if (pTcb->TCS_DrvHead) {
 		info_array[0] = pTcb->TCS_DrvHead;
 		info_array[1] = pTcb->TCS_DrvSector;
-		info_array[2] = disk->capacity / pTcb->TCS_DrvHead / pTcb->TCS_DrvSector;
+		info_array[2] = (long)disk->capacity / pTcb->TCS_DrvHead / pTcb->TCS_DrvSector;
 	} else {
 		if (pTcb->TCS_DrvFlags & TCF_DRV_255_63) {
 			info_array[0] = 255;
 			info_array[1] = 63;
-			info_array[2] = disk->capacity / 255 / 63;
+			info_array[2] = (long)disk->capacity / 255 / 63;
 		} else {
 			info_array[0] = 64;
 			info_array[1] = 32;
-			info_array[2] = disk->capacity >> 11;
+			info_array[2] = (long)disk->capacity >> 11;
 		}
 	}
 	return 0;
diff -Nru a/drivers/scsi/ips.c b/drivers/scsi/ips.c
--- a/drivers/scsi/ips.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/ips.c	Mon Apr  7 13:52:17 2003
@@ -1870,7 +1870,7 @@
       sectors = IPS_COMP_SECTORS;
    }
 
-   cylinders = disk->capacity / (heads * sectors);
+   cylinders = (long)disk->capacity / (heads * sectors);
 
    DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d",
              heads, sectors, cylinders);
diff -Nru a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
--- a/drivers/scsi/megaraid.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/megaraid.c	Mon Apr  7 13:52:17 2003
@@ -4236,13 +4236,13 @@
 			/* Default heads (64) & sectors (32) */
 			heads = 64;
 			sectors = 32;
-			cylinders = disk->capacity / (heads * sectors);
+			cylinders = (long)disk->capacity / (heads * sectors);
 
 			/* Handle extended translation size for logical drives > 1Gb */
 			if (disk->capacity >= 0x200000) {
 				heads = 255;
 				sectors = 63;
-				cylinders = disk->capacity / (heads * sectors);
+				cylinders = (long)disk->capacity / (heads * sectors);
 			}
 
 			/* return result */
@@ -4260,13 +4260,13 @@
 		/* Default heads (64) & sectors (32) */
 		heads = 64;
 		sectors = 32;
-		cylinders = disk->capacity / (heads * sectors);
+		cylinders = (long)disk->capacity / (heads * sectors);
 
 		/* Handle extended translation size for logical drives > 1Gb */
 		if (disk->capacity >= 0x200000) {
 			heads = 255;
 			sectors = 63;
-			cylinders = disk->capacity / (heads * sectors);
+			cylinders = (long)disk->capacity / (heads * sectors);
 		}
 
 		/* return result */
diff -Nru a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c
--- a/drivers/scsi/ppa.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/ppa.c	Mon Apr  7 13:52:17 2003
@@ -1004,11 +1004,11 @@
 {
     ip[0] = 0x40;
     ip[1] = 0x20;
-    ip[2] = (disk->capacity + 1) / (ip[0] * ip[1]);
+    ip[2] = ((long)disk->capacity + 1) / (ip[0] * ip[1]);
     if (ip[2] > 1024) {
 	ip[0] = 0xff;
 	ip[1] = 0x3f;
-	ip[2] = (disk->capacity + 1) / (ip[0] * ip[1]);
+	ip[2] = ((long)disk->capacity + 1) / (ip[0] * ip[1]);
 	if (ip[2] > 1023)
 	    ip[2] = 1023;
     }
diff -Nru a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
--- a/drivers/scsi/qla1280.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/qla1280.c	Mon Apr  7 13:52:18 2003
@@ -1483,14 +1483,14 @@
 {
     int heads, sectors, cylinders;
 
-            heads = 64;
+    heads = 64;
     sectors = 32;
-    cylinders = disk->capacity / (heads * sectors);
+    cylinders = (long)disk->capacity / (heads * sectors);
     if (cylinders > 1024)
     {
         heads = 255;
         sectors = 63;
-        cylinders = disk->capacity / (heads * sectors);
+        cylinders = (long)disk->capacity / (heads * sectors);
         /* if (cylinders > 1023)
         cylinders = 1023; */
     }
diff -Nru a/drivers/scsi/qlogicfas.c b/drivers/scsi/qlogicfas.c
--- a/drivers/scsi/qlogicfas.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/qlogicfas.c	Mon Apr  7 13:52:18 2003
@@ -653,11 +653,11 @@
 /* This should mimic the DOS Qlogic driver's behavior exactly */
 	ip[0] = 0x40;
 	ip[1] = 0x20;
-	ip[2] = disk->capacity / (ip[0] * ip[1]);
+	ip[2] = (long)disk->capacity / (ip[0] * ip[1]);
 	if (ip[2] > 1024) {
 		ip[0] = 0xff;
 		ip[1] = 0x3f;
-		ip[2] = disk->capacity / (ip[0] * ip[1]);
+		ip[2] = (long)disk->capacity / (ip[0] * ip[1]);
 #if 0
 		if (ip[2] > 1023)
 			ip[2] = 1023;
diff -Nru a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
--- a/drivers/scsi/scsi.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/scsi.c	Mon Apr  7 13:52:18 2003
@@ -2477,7 +2477,7 @@
 		for (SDpnt = shpnt->host_queue; SDpnt; SDpnt = SDpnt->next) {
 			for (SCpnt = SDpnt->device_queue; SCpnt; SCpnt = SCpnt->next) {
 				/*  (0) h:c:t:l (dev sect nsect cnumsec sg) (ret all flg) (to/cmd to ito) cmd snse result %d %x      */
-				printk(KERN_INFO "(%3d) %2d:%1d:%2d:%2d (%6s %4ld %4ld %4ld %4x %1d) (%1d %1d 0x%2x) (%4d %4d %4d) 0x%2.2x 0x%2.2x 0x%8.8x\n",
+				printk(KERN_INFO "(%3d) %2d:%1d:%2d:%2d (%6s %4lld %4ld %4ld %4x %1d) (%1d %1d 0x%2x) (%4d %4d %4d) 0x%2.2x 0x%2.2x 0x%8.8x\n",
 				       i++,
 
 				       SCpnt->host->host_no,
@@ -2486,7 +2486,7 @@
 				       SCpnt->lun,
 
 				       kdevname(SCpnt->request.rq_dev),
-				       SCpnt->request.sector,
+				       (unsigned long long)SCpnt->request.sector,
 				       SCpnt->request.nr_sectors,
 				       SCpnt->request.current_nr_sectors,
 				       SCpnt->request.rq_status,
diff -Nru a/drivers/scsi/scsi.h b/drivers/scsi/scsi.h
--- a/drivers/scsi/scsi.h	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/scsi.h	Mon Apr  7 13:52:18 2003
@@ -434,7 +434,7 @@
 /*
  * Prototypes for functions in scsicam.c
  */
-extern int  scsi_partsize(struct buffer_head *bh, unsigned long capacity,
+extern int  scsi_partsize(struct buffer_head *bh, sector_t capacity,
                     unsigned int *cyls, unsigned int *hds,
                     unsigned int *secs);
 
diff -Nru a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
--- a/drivers/scsi/scsi_lib.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/scsi_lib.c	Mon Apr  7 13:52:18 2003
@@ -371,8 +371,8 @@
 	req = &SCpnt->request;
 	req->errors = 0;
 	if (!uptodate) {
-		printk(" I/O error: dev %s, sector %lu\n",
-		       kdevname(req->rq_dev), req->sector);
+		printk(" I/O error: dev %s, sector %llu\n",
+		       kdevname(req->rq_dev), (unsigned long long)req->sector);
 	}
 	do {
 		if ((bh = req->bh) != NULL) {
diff -Nru a/drivers/scsi/scsicam.c b/drivers/scsi/scsicam.c
--- a/drivers/scsi/scsicam.c	Mon Apr  7 13:52:17 2003
+++ b/drivers/scsi/scsicam.c	Mon Apr  7 13:52:17 2003
@@ -44,14 +44,14 @@
 {
 	struct buffer_head *bh;
 	int ret_code;
-	int size = disk->capacity;
+	unsigned long size = disk->capacity;
 	unsigned long temp_cyl;
 
 	if (!(bh = bread(MKDEV(MAJOR(dev), MINOR(dev)&~0xf), 0, block_size(dev))))
 		return -1;
 
 	/* try to infer mapping from partition table */
-	ret_code = scsi_partsize(bh, (unsigned long) size, (unsigned int *) ip + 2,
+	ret_code = scsi_partsize(bh, size, (unsigned int *) ip + 2,
 		       (unsigned int *) ip + 0, (unsigned int *) ip + 1);
 	brelse(bh);
 
@@ -59,7 +59,7 @@
 		/* pick some standard mapping with at most 1024 cylinders,
 		   and at most 62 sectors per track - this works up to
 		   7905 MB */
-		ret_code = setsize((unsigned long) size, (unsigned int *) ip + 2,
+		ret_code = setsize(size, (unsigned int *) ip + 2,
 		       (unsigned int *) ip + 0, (unsigned int *) ip + 1);
 	}
 	/* if something went wrong, then apparently we have to return
@@ -88,7 +88,7 @@
  *
  */
 
-int scsi_partsize(struct buffer_head *bh, unsigned long capacity,
+int scsi_partsize(struct buffer_head *bh, sector_t capacity,
 	       unsigned int *cyls, unsigned int *hds, unsigned int *secs)
 {
 	struct partition *p, *largest = NULL;
@@ -148,7 +148,7 @@
 		  (end_cyl == 1023 && ext_physical_end == logical_end)) {
 			*secs = end_sector;
 			*hds = end_head + 1;
-			*cyls = capacity / ((end_head + 1) * end_sector);
+			*cyls = (unsigned long)capacity / ((end_head + 1) * end_sector);
 			return 0;
 		}
 #ifdef DEBUG
diff -Nru a/drivers/scsi/sd.c b/drivers/scsi/sd.c
--- a/drivers/scsi/sd.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/sd.c	Mon Apr  7 13:52:18 2003
@@ -91,7 +91,7 @@
 
 static Scsi_Disk *rscsi_disks;
 static struct gendisk *sd_gendisks;
-static int *sd_sizes;
+static sector_t *sd_sizes;
 static int *sd_blocksizes;
 static int *sd_hardsizes;	/* Hardware sector size */
 static int *sd_max_sectors;
@@ -218,7 +218,7 @@
 
 			diskinfo[0] = 0x40;
 			diskinfo[1] = 0x20;
-			diskinfo[2] = rscsi_disks[DEVICE_NR(dev)].capacity >> 11;
+			diskinfo[2] = (int)rscsi_disks[DEVICE_NR(dev)].capacity >> 11;
 
 			/* override with calculated, extended default, or driver values */
 
@@ -294,7 +294,8 @@
 
 static int sd_init_command(Scsi_Cmnd * SCpnt)
 {
-	int dev, block, this_count;
+	int dev, this_count;
+	sector_t block;
 	struct hd_struct *ppnt;
 	Scsi_Disk *dpnt;
 #if CONFIG_SCSI_LOGGING
@@ -603,7 +604,7 @@
 	int this_count = SCpnt->bufflen >> 9;
 	int good_sectors = (result == 0 ? this_count : 0);
 	int block_sectors = 1;
-	long error_sector;
+	sector_t error_sector;
 
 	SCSI_LOG_HLCOMPLETE(1, sd_devname(DEVICE_NR(SCpnt->request.rq_dev), nbuff));
 
@@ -624,7 +625,7 @@
 	    SCpnt->sense_buffer[0] == 0xF0) {	/* Sense data is valid */
 		switch (SCpnt->sense_buffer[2]) {
 		case MEDIUM_ERROR:
-			error_sector = (SCpnt->sense_buffer[3] << 24) |
+			error_sector = ((sector_t)SCpnt->sense_buffer[3] << 24) |
 			(SCpnt->sense_buffer[4] << 16) |
 			(SCpnt->sense_buffer[5] << 8) |
 			SCpnt->sense_buffer[6];
@@ -953,7 +954,7 @@
 		 */
 		rscsi_disks[i].ready = 1;
 
-		rscsi_disks[i].capacity = 1 + ((buffer[0] << 24) |
+		rscsi_disks[i].capacity = 1 + (((sector_t)buffer[0] << 24) |
 					       (buffer[1] << 16) |
 					       (buffer[2] << 8) |
 					       buffer[3]);
@@ -1001,7 +1002,11 @@
 			 */
 			int m;
 			int hard_sector = sector_size;
-			int sz = rscsi_disks[i].capacity * (hard_sector/256);
+			sector_t sz = rscsi_disks[i].capacity * (hard_sector/256);
+			sector_t mb = sz >> 1;
+			sector_div(sz, 1250);
+			mb -= sz - 974;
+			sector_div(mb, 1950);
 
 			/* There are 16 minors allocated for each major device */
 			for (m = i << 4; m < ((i + 1) << 4); m++) {
@@ -1009,19 +1014,19 @@
 			}
 
 			printk("SCSI device %s: "
-			       "%d %d-byte hdwr sectors (%d MB)\n",
-			       nbuff, rscsi_disks[i].capacity,
-			       hard_sector, (sz/2 - sz/1250 + 974)/1950);
+			       "%llu %d-byte hdwr sectors (%llu MB)\n",
+			       nbuff, (unsigned long long)rscsi_disks[i].capacity,
+			       hard_sector, (unsigned long long)mb);
 		}
 
 		/* Rescale capacity to 512-byte units */
 		if (sector_size == 4096)
 			rscsi_disks[i].capacity <<= 3;
-		if (sector_size == 2048)
+		else if (sector_size == 2048)
 			rscsi_disks[i].capacity <<= 2;
-		if (sector_size == 1024)
+		else if (sector_size == 1024)
 			rscsi_disks[i].capacity <<= 1;
-		if (sector_size == 256)
+		else if (sector_size == 256)
 			rscsi_disks[i].capacity >>= 1;
 	}
 
@@ -1123,20 +1128,20 @@
 	memset(rscsi_disks, 0, sd_template.dev_max * sizeof(Scsi_Disk));
 
 	/* for every (necessary) major: */
-	sd_sizes = kmalloc((sd_template.dev_max << 4) * sizeof(int), GFP_ATOMIC);
+	sd_sizes = kmalloc((sd_template.dev_max << 4) * sizeof(*sd_sizes), GFP_ATOMIC);
 	if (!sd_sizes)
 		goto cleanup_disks;
-	memset(sd_sizes, 0, (sd_template.dev_max << 4) * sizeof(int));
+	memset(sd_sizes, 0, (sd_template.dev_max << 4) * sizeof(*sd_sizes));
 
-	sd_blocksizes = kmalloc((sd_template.dev_max << 4) * sizeof(int), GFP_ATOMIC);
+	sd_blocksizes = kmalloc((sd_template.dev_max << 4) * sizeof(*sd_blocksizes), GFP_ATOMIC);
 	if (!sd_blocksizes)
 		goto cleanup_sizes;
-	
-	sd_hardsizes = kmalloc((sd_template.dev_max << 4) * sizeof(int), GFP_ATOMIC);
+
+	sd_hardsizes = kmalloc((sd_template.dev_max << 4) * sizeof(*sd_hardsizes), GFP_ATOMIC);
 	if (!sd_hardsizes)
 		goto cleanup_blocksizes;
 
-	sd_max_sectors = kmalloc((sd_template.dev_max << 4) * sizeof(int), GFP_ATOMIC);
+	sd_max_sectors = kmalloc((sd_template.dev_max << 4) * sizeof(*sd_max_sectors), GFP_ATOMIC);
 	if (!sd_max_sectors)
 		goto cleanup_max_sectors;
 
diff -Nru a/drivers/scsi/sd.h b/drivers/scsi/sd.h
--- a/drivers/scsi/sd.h	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/sd.h	Mon Apr  7 13:52:18 2003
@@ -24,7 +24,7 @@
 #endif
 
 typedef struct scsi_disk {
-	unsigned capacity;	/* size in blocks */
+	sector_t capacity;	/* size in blocks */
 	Scsi_Device *device;
 	unsigned char ready;	/* flag ready for FLOPTICAL */
 	unsigned char write_prot;	/* flag write_protect for rmvable dev */
diff -Nru a/drivers/scsi/sr.c b/drivers/scsi/sr.c
--- a/drivers/scsi/sr.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/sr.c	Mon Apr  7 13:52:18 2003
@@ -85,7 +85,7 @@
 };
 
 Scsi_CD *scsi_CDs;
-static int *sr_sizes;
+static sector_t *sr_sizes;
 
 static int *sr_blocksizes;
 static int *sr_hardsizes;
@@ -198,7 +198,7 @@
 	int good_sectors = (result == 0 ? this_count : 0);
 	int block_sectors = 0;
 	int device_nr = DEVICE_NR(SCpnt->request.rq_dev);
-	long error_sector;
+	sector_t error_sector;
 
 #ifdef DEBUG
 	printk("sr.c done: %x %p\n", result, SCpnt->request.bh->b_data);
@@ -216,7 +216,7 @@
 		case MEDIUM_ERROR:
 		case VOLUME_OVERFLOW:
 		case ILLEGAL_REQUEST:
-			error_sector = (SCpnt->sense_buffer[3] << 24) |
+			error_sector = ((sector_t)SCpnt->sense_buffer[3] << 24) |
 			(SCpnt->sense_buffer[4] << 16) |
 			(SCpnt->sense_buffer[5] << 8) |
 			SCpnt->sense_buffer[6];
@@ -293,7 +293,7 @@
 	/*
 	 * need front pad
 	 */
-	if ((fsize = SCpnt->request.sector % (s_size >> 9))) {
+	if ((fsize = (unsigned long)SCpnt->request.sector % (s_size >> 9))) {
 		fsize <<= 9;
 		sg_ent++;
 		if ((front = scsi_malloc(fsize)) == NULL)
@@ -425,12 +425,12 @@
 		return 0;
 	}
 
-	block = SCpnt->request.sector / (s_size >> 9);
+	block = (long)SCpnt->request.sector / (s_size >> 9);
 
 	/*
 	 * request doesn't start on hw block boundary, add scatter pads
 	 */
-	if ((SCpnt->request.sector % (s_size >> 9)) || (SCpnt->request_bufflen % s_size))
+	if (((long)SCpnt->request.sector % (s_size >> 9)) || (SCpnt->request_bufflen % s_size))
 		if (sr_scatter_pad(SCpnt, s_size))
 			return 0;
 
@@ -824,16 +824,16 @@
 		goto cleanup_devfs;
 	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]));
 
-	sr_blocksizes = kmalloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC);
+	sr_blocksizes = kmalloc(sr_template.dev_max * sizeof(sr_blocksizes[0]), GFP_ATOMIC);
 	if (!sr_blocksizes)
 		goto cleanup_sizes;
 
-	sr_hardsizes = kmalloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC);
+	sr_hardsizes = kmalloc(sr_template.dev_max * sizeof(sr_hardsizes[0]), GFP_ATOMIC);
 	if (!sr_hardsizes)
 		goto cleanup_blocksizes;
 	/*
diff -Nru a/drivers/scsi/t128.c b/drivers/scsi/t128.c
--- a/drivers/scsi/t128.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/t128.c	Mon Apr  7 13:52:18 2003
@@ -142,7 +142,7 @@
 
 #define NO_BASES (sizeof (bases) / sizeof (struct base))
 
-static const struct signature {
+static struct signature {
 	const char *string;
 	int offset;
 } signatures[] __initdata = {
diff -Nru a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c
--- a/drivers/scsi/wd7000.c	Mon Apr  7 13:52:18 2003
+++ b/drivers/scsi/wd7000.c	Mon Apr  7 13:52:18 2003
@@ -1739,7 +1739,7 @@
      */
     ip[0] = 64;
     ip[1] = 32;
-    ip[2] = disk->capacity / (64 * 32);
+    ip[2] = (long)disk->capacity / (64 * 32);
 
     /*
      * for disks >1GB do some guessing
@@ -1758,7 +1758,7 @@
 
 	    ip[0] = 255;
 	    ip[1] = 63;
-	    ip[2] = disk->capacity / (255 * 63);
+	    ip[2] = (long)disk->capacity / (255 * 63);
 	}
 	else {
 	    ip[0] = info[0];
diff -Nru a/fs/adfs/adfs.h b/fs/adfs/adfs.h
--- a/fs/adfs/adfs.h	Mon Apr  7 13:52:18 2003
+++ b/fs/adfs/adfs.h	Mon Apr  7 13:52:18 2003
@@ -66,7 +66,7 @@
 
 /* Inode stuff */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-int adfs_get_block(struct inode *inode, long block,
+int adfs_get_block(struct inode *inode, sector_t block,
 		   struct buffer_head *bh, int create);
 #else
 int adfs_bmap(struct inode *inode, int block);
diff -Nru a/fs/adfs/inode.c b/fs/adfs/inode.c
--- a/fs/adfs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/adfs/inode.c	Mon Apr  7 13:52:18 2003
@@ -27,7 +27,7 @@
  * not support creation of new blocks, so we return -EIO for this case.
  */
 int
-adfs_get_block(struct inode *inode, long block, struct buffer_head *bh, int create)
+adfs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh, int create)
 {
 	if (block < 0)
 		goto abort_negative;
@@ -71,7 +71,7 @@
 		&page->mapping->host->u.adfs_i.mmu_private);
 }
 
-static int _adfs_bmap(struct address_space *mapping, long block)
+static sector_t _adfs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping, block, adfs_get_block);
 }
diff -Nru a/fs/affs/file.c b/fs/affs/file.c
--- a/fs/affs/file.c	Mon Apr  7 13:52:18 2003
+++ b/fs/affs/file.c	Mon Apr  7 13:52:18 2003
@@ -38,7 +38,7 @@
 static struct buffer_head *affs_alloc_extblock(struct inode *inode, struct buffer_head *bh, u32 ext);
 static inline struct buffer_head *affs_get_extblock(struct inode *inode, u32 ext);
 static struct buffer_head *affs_get_extblock_slow(struct inode *inode, u32 ext);
-static int affs_get_block(struct inode *inode, long block, struct buffer_head *bh_result, int create);
+static int affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create);
 
 static ssize_t affs_file_write(struct file *filp, const char *buf, size_t count, loff_t *ppos);
 static int affs_file_open(struct inode *inode, struct file *filp);
@@ -332,17 +332,21 @@
 }
 
 static int
-affs_get_block(struct inode *inode, long block, struct buffer_head *bh_result, int create)
+affs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
 {
 	struct super_block	*sb = inode->i_sb;
 	struct buffer_head	*ext_bh;
+	long			 block = iblock;
 	u32			 ext;
 
-	pr_debug("AFFS: get_block(%u, %ld)\n", (u32)inode->i_ino, block);
+	pr_debug("AFFS: get_block(%u, %ld)\n", (u32)inode->i_ino, (long)block);
 
 	if (block < 0)
 		goto err_small;
 
+	if (unlikely(iblock != block))
+		goto err_big;
+
 	if (block >= AFFS_INODE->i_blkcnt) {
 		if (block > AFFS_INODE->i_blkcnt || !create)
 			goto err_big;
@@ -423,7 +427,7 @@
 	return cont_prepare_write(page, from, to, affs_get_block,
 		&page->mapping->host->u.affs_i.mmu_private);
 }
-static int _affs_bmap(struct address_space *mapping, long block)
+static sector_t _affs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,affs_get_block);
 }
diff -Nru a/fs/affs/super.c b/fs/affs/super.c
--- a/fs/affs/super.c	Mon Apr  7 13:52:18 2003
+++ b/fs/affs/super.c	Mon Apr  7 13:52:18 2003
@@ -29,7 +29,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 
-extern int *blk_size[];
 extern struct timezone sys_tz;
 
 static int affs_statfs(struct super_block *sb, struct statfs *buf);
diff -Nru a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c
--- a/fs/befs/linuxvfs.c	Mon Apr  7 13:52:18 2003
+++ b/fs/befs/linuxvfs.c	Mon Apr  7 13:52:18 2003
@@ -27,9 +27,9 @@
 #define VFS_BLOCK_SIZE 512
 
 static int befs_readdir(struct file *, void *, filldir_t);
-static int befs_get_block(struct inode *, long, struct buffer_head *, int);
+static int befs_get_block(struct inode *, sector_t, struct buffer_head *, int);
 static int befs_readpage(struct file *file, struct page *page);
-static int befs_bmap(struct address_space *mapping, long block);
+static sector_t befs_bmap(struct address_space *mapping, sector_t block);
 static struct dentry *befs_lookup(struct inode *, struct dentry *);
 static void befs_read_inode(struct inode *ino);
 static void befs_clear_inode(struct inode *ino);
@@ -97,8 +97,8 @@
 	return block_read_full_page(page, befs_get_block);
 }
 
-static int
-befs_bmap(struct address_space *mapping, long block)
+static sector_t
+befs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping, block, befs_get_block);
 }
@@ -115,7 +115,7 @@
  */
 
 static int
-befs_get_block(struct inode *inode, long block,
+befs_get_block(struct inode *inode, sector_t sect,
 	       struct buffer_head *bh_result, int create)
 {
 	struct super_block *sb = inode->i_sb;
@@ -123,6 +123,7 @@
 	befs_block_run run = BAD_IADDR;
 	int res = 0;
 	ulong disk_off;
+	long block = (unsigned long)sect;
 
 	befs_debug(sb, "---> befs_get_block() for inode %lu, block %ld",
 		   inode->i_ino, block);
diff -Nru a/fs/bfs/file.c b/fs/bfs/file.c
--- a/fs/bfs/file.c	Mon Apr  7 13:52:18 2003
+++ b/fs/bfs/file.c	Mon Apr  7 13:52:18 2003
@@ -54,7 +54,7 @@
 	return 0;
 }
 
-static int bfs_get_block(struct inode * inode, long block, 
+static int bfs_get_block(struct inode * inode, sector_t block, 
 	struct buffer_head * bh_result, int create)
 {
 	long phys;
@@ -151,7 +151,7 @@
 	return block_prepare_write(page, from, to, bfs_get_block);
 }
 
-static int bfs_bmap(struct address_space *mapping, long block)
+static sector_t bfs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping, block, bfs_get_block);
 }
diff -Nru a/fs/block_dev.c b/fs/block_dev.c
--- a/fs/block_dev.c	Mon Apr  7 13:52:18 2003
+++ b/fs/block_dev.c	Mon Apr  7 13:52:18 2003
@@ -22,14 +22,14 @@
 
 #include <asm/uaccess.h>
 
-static unsigned long max_block(kdev_t dev)
+static sector_t max_block(kdev_t dev)
 {
-	unsigned int retval = ~0U;
+	sector_t retval = ~0;
 	int major = MAJOR(dev);
 
 	if (blk_size[major]) {
 		int minor = MINOR(dev);
-		unsigned int blocks = blk_size[major][minor];
+		sector_t blocks = blk_size[major][minor];
 		if (blocks) {
 			unsigned int size = block_size(dev);
 			unsigned int sizebits = blksize_bits(size);
@@ -44,7 +44,7 @@
 
 static loff_t blkdev_size(kdev_t dev)
 {
-	unsigned int blocks = ~0U;
+	sector_t blocks = ~0;
 	int major = MAJOR(dev);
 
 	if (blk_size[major]) {
@@ -120,7 +120,7 @@
 	return sb_set_blocksize(sb, size);
 }
 
-static int blkdev_get_block(struct inode * inode, long iblock, struct buffer_head * bh, int create)
+static int blkdev_get_block(struct inode * inode, sector_t iblock, struct buffer_head * bh, int create)
 {
 	if (iblock >= max_block(inode->i_rdev))
 		return -EIO;
@@ -131,7 +131,7 @@
 	return 0;
 }
 
-static int blkdev_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize)
+static int blkdev_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, sector_t blocknr, int blocksize)
 {
 	return generic_direct_IO(rw, inode, iobuf, blocknr, blocksize, blkdev_get_block);
 }
diff -Nru a/fs/buffer.c b/fs/buffer.c
--- a/fs/buffer.c	Mon Apr  7 13:52:18 2003
+++ b/fs/buffer.c	Mon Apr  7 13:52:18 2003
@@ -558,7 +558,7 @@
 	spin_unlock(&lru_list_lock);
 }
 
-struct buffer_head * get_hash_table(kdev_t dev, int block, int size)
+struct buffer_head * get_hash_table(kdev_t dev, sector_t block, int size)
 {
 	struct buffer_head *bh, **p = &hash(dev, block);
 
@@ -951,7 +951,7 @@
  * 14.02.92: changed it to sync dirty buffers a bit: better performance
  * when the filesystem starts to get full of dirty blocks (I hope).
  */
-struct buffer_head * getblk(kdev_t dev, int block, int size)
+struct buffer_head * getblk(kdev_t dev, sector_t block, int size)
 {
 	for (;;) {
 		struct buffer_head * bh;
@@ -1118,7 +1118,7 @@
  *	Reads a specified block, and returns buffer head that
  *	contains it. It returns NULL if the block was unreadable.
  */
-struct buffer_head * bread(kdev_t dev, int block, int size)
+struct buffer_head * bread(kdev_t dev, sector_t block, int size)
 {
 	struct buffer_head * bh;
 
@@ -1550,7 +1550,7 @@
 		unsigned from, unsigned to, get_block_t *get_block)
 {
 	unsigned block_start, block_end;
-	unsigned long block;
+	sector_t block;
 	int err = 0;
 	unsigned blocksize, bbits;
 	struct buffer_head *bh, *head, *wait[2], **wait_bh=wait;
@@ -1562,7 +1562,7 @@
 	head = page->buffers;
 
 	bbits = inode->i_blkbits;
-	block = page->index << (PAGE_CACHE_SHIFT - bbits);
+	block = (sector_t)page->index << (PAGE_CACHE_SHIFT - bbits);
 
 	for(bh = head, block_start = 0; bh != head || !block_start;
 	    block++, block_start=block_end, bh = bh->b_this_page) {
@@ -1701,7 +1701,7 @@
 int block_read_full_page(struct page *page, get_block_t *get_block)
 {
 	struct inode *inode = page->mapping->host;
-	unsigned long iblock, lblock;
+	sector_t iblock, lblock;
 	struct buffer_head *bh, *head, *arr[MAX_BUF_PER_PAGE];
 	unsigned int blocksize, blocks;
 	int nr, i;
@@ -1714,7 +1714,7 @@
 	head = page->buffers;
 
 	blocks = PAGE_CACHE_SIZE >> inode->i_blkbits;
-	iblock = page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits);
+	iblock = (sector_t)page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits);
 	lblock = (inode->i_size+blocksize-1) >> inode->i_blkbits;
 	bh = head;
 	nr = 0;
@@ -2096,7 +2096,7 @@
 }
 EXPORT_SYMBOL(waitfor_one_page);
 
-int generic_block_bmap(struct address_space *mapping, long block, get_block_t *get_block)
+sector_t generic_block_bmap(struct address_space *mapping, sector_t block, get_block_t *get_block)
 {
 	struct buffer_head tmp;
 	struct inode *inode = mapping->host;
@@ -2106,10 +2106,12 @@
 	return tmp.b_blocknr;
 }
 
-int generic_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize, get_block_t * get_block)
+int generic_direct_IO(int rw, struct inode * inode, 
+		      struct kiobuf * iobuf, sector_t blocknr, 
+		      int blocksize, get_block_t * get_block)
 {
 	int i, nr_blocks, retval;
-	unsigned long * blocks = iobuf->blocks;
+	sector_t *blocks = iobuf->blocks;
 	int length;
 
 	length = iobuf->length;
@@ -2137,7 +2139,7 @@
 				BUG();
 			if (!buffer_mapped(&bh)) {
 				/* there was an hole in the filesystem */
-				blocks[i] = -1UL;
+				blocks[i] = ~(sector_t)0;
 				continue;
 			}
 		} else {
@@ -2222,7 +2224,7 @@
  */
 
 int brw_kiovec(int rw, int nr, struct kiobuf *iovec[], 
-	       kdev_t dev, unsigned long b[], int size)
+	       kdev_t dev, sector_t b[], int size)
 {
 	int		err;
 	int		length;
@@ -2232,7 +2234,7 @@
 	int		pageind;
 	int		bhind;
 	int		offset;
-	unsigned long	blocknr;
+	sector_t	blocknr;
 	struct kiobuf *	iobuf = NULL;
 	struct page *	map;
 	struct buffer_head *tmp, **bhs = NULL;
@@ -2357,7 +2359,7 @@
  * FIXME: we need a swapper_inode->get_block function to remove
  *        some of the bmap kludges and interface ugliness here.
  */
-int brw_page(int rw, struct page *page, kdev_t dev, int b[], int size)
+int brw_page(int rw, struct page *page, kdev_t dev, sector_t b[], int size)
 {
 	struct buffer_head *head, *bh;
 
diff -Nru a/fs/efs/file.c b/fs/efs/file.c
--- a/fs/efs/file.c	Mon Apr  7 13:52:18 2003
+++ b/fs/efs/file.c	Mon Apr  7 13:52:18 2003
@@ -8,7 +8,7 @@
 
 #include <linux/efs_fs.h>
 
-int efs_get_block(struct inode *inode, long iblock,
+int efs_get_block(struct inode *inode, sector_t iblock,
 		  struct buffer_head *bh_result, int create)
 {
 	int error = -EROFS;
diff -Nru a/fs/efs/inode.c b/fs/efs/inode.c
--- a/fs/efs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/efs/inode.c	Mon Apr  7 13:52:18 2003
@@ -12,12 +12,12 @@
 #include <linux/module.h>
 
 
-extern int efs_get_block(struct inode *, long, struct buffer_head *, int);
+extern int efs_get_block(struct inode *, sector_t, struct buffer_head *, int);
 static int efs_readpage(struct file *file, struct page *page)
 {
 	return block_read_full_page(page,efs_get_block);
 }
-static int _efs_bmap(struct address_space *mapping, long block)
+static sector_t _efs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,efs_get_block);
 }
diff -Nru a/fs/ext2/inode.c b/fs/ext2/inode.c
--- a/fs/ext2/inode.c	Mon Apr  7 13:52:17 2003
+++ b/fs/ext2/inode.c	Mon Apr  7 13:52:17 2003
@@ -505,7 +505,7 @@
  * reachable from inode.
  */
 
-static int ext2_get_block(struct inode *inode, long iblock, struct buffer_head *bh_result, int create)
+static int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
 {
 	int err = -EIO;
 	int offsets[4];
@@ -588,11 +588,12 @@
 {
 	return block_prepare_write(page,from,to,ext2_get_block);
 }
-static int ext2_bmap(struct address_space *mapping, long block)
+static sector_t ext2_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,ext2_get_block);
 }
-static int ext2_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize)
+static int ext2_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf,
+			  sector_t blocknr, int blocksize)
 {
 	return generic_direct_IO(rw, inode, iobuf, blocknr, blocksize, ext2_get_block);
 }
diff -Nru a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c
--- a/fs/ext3/ialloc.c	Mon Apr  7 13:52:18 2003
+++ b/fs/ext3/ialloc.c	Mon Apr  7 13:52:18 2003
@@ -564,8 +564,8 @@
 	    is_bad_inode(inode) || NEXT_ORPHAN(inode) > max_ino) {
 		ext3_warning(sb, __FUNCTION__,
 			     "bad orphan inode %ld!  e2fsck was run?\n", ino);
-		printk(KERN_NOTICE "ext3_test_bit(bit=%d, block=%ld) = %d\n",
-		       bit, bh->b_blocknr, ext3_test_bit(bit, bh->b_data));
+		printk(KERN_NOTICE "ext3_test_bit(bit=%d, block=%llu) = %d\n",
+		       bit, (unsigned long long)bh->b_blocknr, ext3_test_bit(bit, bh->b_data));
 		printk(KERN_NOTICE "inode=%p\n", inode);
 		if (inode) {
 			printk(KERN_NOTICE "is_bad_inode(inode)=%d\n",
diff -Nru a/fs/ext3/inode.c b/fs/ext3/inode.c
--- a/fs/ext3/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/ext3/inode.c	Mon Apr  7 13:52:18 2003
@@ -825,7 +825,7 @@
 /*
  * The BKL is not held on entry here.
  */
-static int ext3_get_block(struct inode *inode, long iblock,
+static int ext3_get_block(struct inode *inode, sector_t iblock,
 			struct buffer_head *bh_result, int create)
 {
 	handle_t *handle = 0;
@@ -1165,7 +1165,7 @@
  * So, if we see any bmap calls here on a modified, data-journaled file,
  * take extra steps to flush any blocks which might be in the cache. 
  */
-static int ext3_bmap(struct address_space *mapping, long block)
+static sector_t ext3_bmap(struct address_space *mapping, sector_t block)
 {
 	struct inode *inode = mapping->host;
 	journal_t *journal;
diff -Nru a/fs/fat/file.c b/fs/fat/file.c
--- a/fs/fat/file.c	Mon Apr  7 13:52:18 2003
+++ b/fs/fat/file.c	Mon Apr  7 13:52:18 2003
@@ -48,11 +48,13 @@
 }
 
 
-int fat_get_block(struct inode *inode, long iblock, struct buffer_head *bh_result, int create)
+int fat_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
 {
 	struct super_block *sb = inode->i_sb;
 	unsigned long phys;
 
+	BUG_ON(sizeof(iblock) > 4 && (iblock>>32));
+
 	phys = fat_bmap(inode, iblock);
 	if (phys) {
 		bh_result->b_dev = inode->i_dev;
@@ -66,7 +68,7 @@
 		BUG();
 		return -EIO;
 	}
-	if (!(iblock % MSDOS_SB(inode->i_sb)->cluster_size)) {
+	if (!((unsigned long)iblock % MSDOS_SB(inode->i_sb)->cluster_size)) {
 		if (fat_add_cluster(inode) < 0)
 			return -ENOSPC;
 	}
diff -Nru a/fs/fat/inode.c b/fs/fat/inode.c
--- a/fs/fat/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/fat/inode.c	Mon Apr  7 13:52:18 2003
@@ -869,7 +869,7 @@
 	return cont_prepare_write(page,from,to,fat_get_block,
 		&MSDOS_I(page->mapping->host)->mmu_private);
 }
-static int _fat_bmap(struct address_space *mapping, long block)
+static sector_t _fat_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,fat_get_block);
 }
diff -Nru a/fs/fat/misc.c b/fs/fat/misc.c
--- a/fs/fat/misc.c	Mon Apr  7 13:52:18 2003
+++ b/fs/fat/misc.c	Mon Apr  7 13:52:18 2003
@@ -182,10 +182,10 @@
 		mark_inode_dirty(inode);
 	}
 	if (file_cluster
-	    != inode->i_blocks / cluster_size / (sb->s_blocksize / 512)) {
+	    != (long)inode->i_blocks / cluster_size / (sb->s_blocksize / 512)) {
 		printk ("file_cluster badly computed!!! %d <> %ld\n",
 			file_cluster,
-			inode->i_blocks / cluster_size / (sb->s_blocksize / 512));
+			(long)inode->i_blocks / cluster_size / (sb->s_blocksize / 512));
 		fat_cache_inval_inode(inode);
 	}
 	inode->i_blocks += (1 << MSDOS_SB(sb)->cluster_bits) / 512;
diff -Nru a/fs/freevxfs/vxfs_kcompat.h b/fs/freevxfs/vxfs_kcompat.h
--- a/fs/freevxfs/vxfs_kcompat.h	Mon Apr  7 13:52:18 2003
+++ b/fs/freevxfs/vxfs_kcompat.h	Mon Apr  7 13:52:18 2003
@@ -7,10 +7,8 @@
 
 #include <linux/blkdev.h>
 
-typedef long sector_t;
-
 /* Dito.  */
-static inline void map_bh(struct buffer_head *bh, struct super_block *sb, int block)
+static inline void map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block)
 {
 	bh->b_state |= 1 << BH_Mapped;
 	bh->b_dev = sb->s_dev;
diff -Nru a/fs/freevxfs/vxfs_subr.c b/fs/freevxfs/vxfs_subr.c
--- a/fs/freevxfs/vxfs_subr.c	Mon Apr  7 13:52:18 2003
+++ b/fs/freevxfs/vxfs_subr.c	Mon Apr  7 13:52:18 2003
@@ -42,7 +42,7 @@
 
 
 static int		vxfs_readpage(struct file *, struct page *);
-static int		vxfs_bmap(struct address_space *, long);
+static sector_t		vxfs_bmap(struct address_space *, sector_t);
 
 struct address_space_operations vxfs_aops = {
 	.readpage =		vxfs_readpage,
@@ -185,8 +185,8 @@
  * Locking status:
  *   We are under the bkl.
  */
-static int
-vxfs_bmap(struct address_space *mapping, long block)
+static sector_t
+vxfs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping, block, vxfs_getblk);
 }
diff -Nru a/fs/hfs/file.c b/fs/hfs/file.c
--- a/fs/hfs/file.c	Mon Apr  7 13:52:18 2003
+++ b/fs/hfs/file.c	Mon Apr  7 13:52:18 2003
@@ -106,7 +106,7 @@
  * block number.  This function just calls hfs_extent_map() to do the
  * real work and then stuffs the appropriate info into the buffer_head.
  */
-int hfs_get_block(struct inode *inode, long iblock, struct buffer_head *bh_result, int create)
+int hfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
 {
 	unsigned long phys;
 
diff -Nru a/fs/hfs/hfs.h b/fs/hfs/hfs.h
--- a/fs/hfs/hfs.h	Mon Apr  7 13:52:18 2003
+++ b/fs/hfs/hfs.h	Mon Apr  7 13:52:18 2003
@@ -495,7 +495,7 @@
 extern void hfs_extent_free(struct hfs_fork *);
 
 /* file.c */
-extern int hfs_get_block(struct inode *, long, struct buffer_head *, int);
+extern int hfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
 
 /* mdb.c */
 extern struct hfs_mdb *hfs_mdb_get(hfs_sysmdb, int, hfs_s32);
diff -Nru a/fs/hfs/inode.c b/fs/hfs/inode.c
--- a/fs/hfs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/hfs/inode.c	Mon Apr  7 13:52:18 2003
@@ -235,7 +235,7 @@
 	return cont_prepare_write(page,from,to,hfs_get_block,
 		&page->mapping->host->u.hfs_i.mmu_private);
 }
-static int hfs_bmap(struct address_space *mapping, long block)
+static sector_t hfs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,hfs_get_block);
 }
diff -Nru a/fs/hpfs/file.c b/fs/hpfs/file.c
--- a/fs/hpfs/file.c	Mon Apr  7 13:52:18 2003
+++ b/fs/hpfs/file.c	Mon Apr  7 13:52:18 2003
@@ -68,7 +68,7 @@
 	hpfs_write_inode(i);
 }
 
-int hpfs_get_block(struct inode *inode, long iblock, struct buffer_head *bh_result, int create)
+int hpfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
 {
 	secno s;
 	s = hpfs_bmap(inode, iblock);
@@ -108,7 +108,7 @@
 	return cont_prepare_write(page,from,to,hpfs_get_block,
 		&page->mapping->host->u.hpfs_i.mmu_private);
 }
-static int _hpfs_bmap(struct address_space *mapping, long block)
+static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,hpfs_get_block);
 }
diff -Nru a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h
--- a/fs/hpfs/hpfs_fn.h	Mon Apr  7 13:52:18 2003
+++ b/fs/hpfs/hpfs_fn.h	Mon Apr  7 13:52:18 2003
@@ -261,7 +261,7 @@
 int hpfs_file_fsync(struct file *, struct dentry *, int);
 secno hpfs_bmap(struct inode *, unsigned);
 void hpfs_truncate(struct inode *);
-int hpfs_get_block(struct inode *inode, long iblock, struct buffer_head *bh_result, int create);
+int hpfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create);
 ssize_t hpfs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos);
 
 /* inode.c */
diff -Nru a/fs/inode.c b/fs/inode.c
--- a/fs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/inode.c	Mon Apr  7 13:52:18 2003
@@ -1112,9 +1112,9 @@
  *	file.
  */
  
-int bmap(struct inode * inode, int block)
+sector_t bmap(struct inode * inode, sector_t block)
 {
-	int res = 0;
+	sector_t res = 0;
 	if (inode->i_mapping->a_ops->bmap)
 		res = inode->i_mapping->a_ops->bmap(inode->i_mapping, block);
 	return res;
diff -Nru a/fs/intermezzo/journal_ext3.c b/fs/intermezzo/journal_ext3.c
--- a/fs/intermezzo/journal_ext3.c	Mon Apr  7 13:52:18 2003
+++ b/fs/intermezzo/journal_ext3.c	Mon Apr  7 13:52:18 2003
@@ -262,7 +262,7 @@
 
         block *= (inode->i_sb->s_blocksize / 512);
 
-        CDEBUG(D_CACHE, "Need %ld blocks, have %ld.\n", block, inode->i_blocks);
+        CDEBUG(D_CACHE, "Need %llu blocks, have %lu.\n", (unsigned long long)block, inode->i_blocks);
 
         if (block > inode->i_blocks) {
                 EXIT;
diff -Nru a/fs/isofs/inode.c b/fs/isofs/inode.c
--- a/fs/isofs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/isofs/inode.c	Mon Apr  7 13:52:18 2003
@@ -976,7 +976,7 @@
 /*
  * Used by the standard interfaces.
  */
-static int isofs_get_block(struct inode *inode, long iblock,
+static int isofs_get_block(struct inode *inode, sector_t iblock,
 		    struct buffer_head *bh_result, int create)
 {
 	if ( create ) {
@@ -984,10 +984,11 @@
 		return -EROFS;
 	}
 
-	return isofs_get_blocks(inode, iblock, &bh_result, 1) ? 0 : -EIO;
+	BUG_ON(sizeof(iblock) > 4 && (iblock >> 32));
+	return isofs_get_blocks(inode, (long)iblock, &bh_result, 1) ? 0 : -EIO;
 }
 
-static int isofs_bmap(struct inode *inode, int block)
+static int isofs_bmap(struct inode *inode, sector_t block)
 {
 	struct buffer_head dummy;
 	int error;
@@ -1000,7 +1001,7 @@
 	return 0;
 }
 
-struct buffer_head *isofs_bread(struct inode *inode, unsigned int block)
+struct buffer_head *isofs_bread(struct inode *inode, sector_t block)
 {
 	unsigned int blknr = isofs_bmap(inode, block);
 	if (!blknr)
@@ -1013,7 +1014,7 @@
 	return block_read_full_page(page,isofs_get_block);
 }
 
-static int _isofs_bmap(struct address_space *mapping, long block)
+static sector_t _isofs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,isofs_get_block);
 }
diff -Nru a/fs/jbd/commit.c b/fs/jbd/commit.c
--- a/fs/jbd/commit.c	Mon Apr  7 13:52:18 2003
+++ b/fs/jbd/commit.c	Mon Apr  7 13:52:18 2003
@@ -359,8 +359,8 @@
 			}
 			
 			bh = jh2bh(descriptor);
-			jbd_debug(4, "JBD: got buffer %ld (%p)\n",
-				bh->b_blocknr, bh->b_data);
+			jbd_debug(4, "JBD: got buffer %llu (%p)\n",
+				(unsigned long long)bh->b_blocknr, bh->b_data);
 			header = (journal_header_t *)&bh->b_data[0];
 			header->h_magic     = htonl(JFS_MAGIC_NUMBER);
 			header->h_blocktype = htonl(JFS_DESCRIPTOR_BLOCK);
diff -Nru a/fs/jbd/journal.c b/fs/jbd/journal.c
--- a/fs/jbd/journal.c	Mon Apr  7 13:52:18 2003
+++ b/fs/jbd/journal.c	Mon Apr  7 13:52:18 2003
@@ -1505,9 +1505,9 @@
 	
 	if (buffer_dirty(bh)) {
 		printk ("%sUnexpected dirty buffer encountered at "
-			"%s:%d (%s blocknr %lu)\n",
+			"%s:%d (%s blocknr %llu)\n",
 			KERN_WARNING, function, line,
-			kdevname(bh->b_dev), bh->b_blocknr);
+			kdevname(bh->b_dev), (unsigned long long)bh->b_blocknr);
 #ifdef JBD_PARANOID_WRITES
 		J_ASSERT_BH (bh, !buffer_dirty(bh));
 #endif	
diff -Nru a/fs/jbd/revoke.c b/fs/jbd/revoke.c
--- a/fs/jbd/revoke.c	Mon Apr  7 13:52:17 2003
+++ b/fs/jbd/revoke.c	Mon Apr  7 13:52:17 2003
@@ -136,7 +136,7 @@
 oom:
 	if (!journal_oom_retry)
 		return -ENOMEM;
-	jbd_debug(1, "ENOMEM in " __FUNCTION__ ", retrying.\n");
+	jbd_debug(1, "ENOMEM in %s, retrying.\n", __FUNCTION__);
 	yield();
 	goto repeat;
 }
@@ -389,7 +389,7 @@
 		record = find_revoke_record(journal, bh->b_blocknr);
 		if (record) {
 			jbd_debug(4, "cancelled existing revoke on "
-				  "blocknr %lu\n", bh->b_blocknr);
+				  "blocknr %llu\n", (unsigned long long)bh->b_blocknr);
 			list_del(&record->hash);
 			kmem_cache_free(revoke_record_cache, record);
 			did_revoke = 1;
diff -Nru a/fs/jfs/inode.c b/fs/jfs/inode.c
--- a/fs/jfs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/jfs/inode.c	Mon Apr  7 13:52:18 2003
@@ -195,7 +195,7 @@
 	set_cflag(COMMIT_Dirty, inode);
 }
 
-static int jfs_get_block(struct inode *ip, long lblock,
+static int jfs_get_block(struct inode *ip, sector_t lblock,
 			 struct buffer_head *bh_result, int create)
 {
 	s64 lblock64 = lblock;
@@ -318,13 +318,13 @@
 	return block_prepare_write(page, from, to, jfs_get_block);
 }
 
-static int jfs_bmap(struct address_space *mapping, long block)
+static sector_t jfs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping, block, jfs_get_block);
 }
 
 static int jfs_direct_IO(int rw, struct inode *inode, struct kiobuf *iobuf,
-			 unsigned long blocknr, int blocksize)
+			 sector_t blocknr, int blocksize)
 {
 	return generic_direct_IO(rw, inode, iobuf, blocknr,
 				 blocksize, jfs_get_block);
diff -Nru a/fs/minix/inode.c b/fs/minix/inode.c
--- a/fs/minix/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/minix/inode.c	Mon Apr  7 13:52:18 2003
@@ -292,7 +292,7 @@
 	return 0;
 }
 
-static int minix_get_block(struct inode *inode, long block,
+static int minix_get_block(struct inode *inode, sector_t block,
 		    struct buffer_head *bh_result, int create)
 {
 	if (INODE_VERSION(inode) == MINIX_V1)
@@ -313,7 +313,7 @@
 {
 	return block_prepare_write(page,from,to,minix_get_block);
 }
-static int minix_bmap(struct address_space *mapping, long block)
+static sector_t minix_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,minix_get_block);
 }
diff -Nru a/fs/minix/itree_common.c b/fs/minix/itree_common.c
--- a/fs/minix/itree_common.c	Mon Apr  7 13:52:18 2003
+++ b/fs/minix/itree_common.c	Mon Apr  7 13:52:18 2003
@@ -140,7 +140,7 @@
 	return -EAGAIN;
 }
 
-static inline int get_block(struct inode * inode, long block,
+static inline int get_block(struct inode * inode, sector_t block,
 			struct buffer_head *bh_result, int create)
 {
 	int err = -EIO;
diff -Nru a/fs/partitions/acorn.c b/fs/partitions/acorn.c
--- a/fs/partitions/acorn.c	Mon Apr  7 13:52:17 2003
+++ b/fs/partitions/acorn.c	Mon Apr  7 13:52:17 2003
@@ -462,7 +462,7 @@
  * Returns: -1 on error, 0 if not ADFS format, 1 if ok.
  */
 int acorn_partition(struct gendisk *hd, struct block_device *bdev,
-		    unsigned long first_sect, int first_minor)
+		    sector_t first_sect, int first_minor)
 {
 	int i;
 
diff -Nru a/fs/partitions/acorn.h b/fs/partitions/acorn.h
--- a/fs/partitions/acorn.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/acorn.h	Mon Apr  7 13:52:18 2003
@@ -51,5 +51,5 @@
 	
 
 int acorn_partition(struct gendisk *hd, struct block_device *bdev,
-		   unsigned long first_sect, int first_minor);
+		   sector_t first_sect, int first_minor);
 
diff -Nru a/fs/partitions/amiga.c b/fs/partitions/amiga.c
--- a/fs/partitions/amiga.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/amiga.c	Mon Apr  7 13:52:18 2003
@@ -32,7 +32,7 @@
 
 int
 amiga_partition(struct gendisk *hd, struct block_device *bdev,
-		unsigned long first_sector, int first_part_minor)
+		sector_t first_sector, int first_part_minor)
 {
 	Sector sect;
 	unsigned char *data;
diff -Nru a/fs/partitions/amiga.h b/fs/partitions/amiga.h
--- a/fs/partitions/amiga.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/amiga.h	Mon Apr  7 13:52:18 2003
@@ -4,5 +4,5 @@
 
 int
 amiga_partition(struct gendisk *hd, struct block_device *bdev,
-		unsigned long first_sector, int first_part_minor);
+		sector_t first_sector, int first_part_minor);
 
diff -Nru a/fs/partitions/atari.c b/fs/partitions/atari.c
--- a/fs/partitions/atari.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/atari.c	Mon Apr  7 13:52:18 2003
@@ -41,7 +41,7 @@
 }
 
 int atari_partition (struct gendisk *hd, struct block_device *bdev,
-		     unsigned long first_sector, int minor)
+		     sector_t first_sector, int minor)
 {
 	int m_lim = minor + hd->max_p;
 	Sector sect;
diff -Nru a/fs/partitions/atari.h b/fs/partitions/atari.h
--- a/fs/partitions/atari.h	Mon Apr  7 13:52:17 2003
+++ b/fs/partitions/atari.h	Mon Apr  7 13:52:17 2003
@@ -32,5 +32,5 @@
 } __attribute__((__packed__));
 
 int atari_partition (struct gendisk *hd, struct block_device *bdev,
-		     unsigned long first_sector, int first_part_minor);
+		     sector_t first_sector, int first_part_minor);
 
diff -Nru a/fs/partitions/check.c b/fs/partitions/check.c
--- a/fs/partitions/check.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/check.c	Mon Apr  7 13:52:18 2003
@@ -19,6 +19,7 @@
 #include <linux/blk.h>
 #include <linux/init.h>
 #include <linux/raid/md.h>
+#include <linux/blkdev.h>
 
 #include "check.h"
 
@@ -35,11 +36,10 @@
 #include "ultrix.h"
 #include "efi.h"
 
-extern int *blk_size[];
 
 int warn_no_part = 1; /*This is ugly: should make genhd removable media aware*/
 
-static int (*check_part[])(struct gendisk *hd, struct block_device *bdev, unsigned long first_sect, int first_minor) = {
+static int (*check_part[])(struct gendisk *hd, struct block_device *bdev, sector_t first_sect, int first_minor) = {
 #ifdef CONFIG_ACORN_PARTITION
 	acorn_partition,
 #endif
@@ -204,7 +204,7 @@
 /*
  * Add a partitions details to the devices partition description.
  */
-void add_gd_partition(struct gendisk *hd, int minor, int start, int size)
+void add_gd_partition(struct gendisk *hd, int minor, sector_t start, sector_t size)
 {
 #ifndef CONFIG_DEVFS_FS
 	char buf[40];
@@ -227,7 +227,7 @@
 {
 	devfs_handle_t de = NULL;
 	static int first_time = 1;
-	unsigned long first_sector;
+	sector_t first_sector;
 	struct block_device *bdev;
 	char buf[64];
 	int i;
@@ -374,14 +374,14 @@
  */
 
 void register_disk(struct gendisk *gdev, kdev_t dev, unsigned minors,
-	struct block_device_operations *ops, long size)
+	struct block_device_operations *ops, sector_t size)
 {
 	if (!gdev)
 		return;
 	grok_partitions(gdev, MINOR(dev)>>gdev->minor_shift, minors, size);
 }
 
-void grok_partitions(struct gendisk *dev, int drive, unsigned minors, long size)
+void grok_partitions(struct gendisk *dev, int drive, unsigned minors, sector_t size)
 {
 	int i;
 	int first_minor	= drive << dev->minor_shift;
@@ -415,13 +415,12 @@
 	}
 }
 
-unsigned char *read_dev_sector(struct block_device *bdev, unsigned long n, Sector *p)
+unsigned char *read_dev_sector(struct block_device *bdev, sector_t n, Sector *p)
 {
 	struct address_space *mapping = bdev->bd_inode->i_mapping;
-	int sect = PAGE_CACHE_SIZE / 512;
 	struct page *page;
 
-	page = read_cache_page(mapping, n/sect,
+	page = read_cache_page(mapping, n >> (PAGE_CACHE_SHIFT-9),
 			(filler_t *)mapping->a_ops->readpage, NULL);
 	if (!IS_ERR(page)) {
 		wait_on_page(page);
@@ -430,7 +429,7 @@
 		if (PageError(page))
 			goto fail;
 		p->v = page;
-		return (unsigned char *)page_address(page) + 512 * (n % sect);
+		return (unsigned char *)page_address(page) + ((n & ((1 << (PAGE_CACHE_SHIFT - 9)) - 1)) << 9);
 fail:
 		page_cache_release(page);
 	}
diff -Nru a/fs/partitions/check.h b/fs/partitions/check.h
--- a/fs/partitions/check.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/check.h	Mon Apr  7 13:52:18 2003
@@ -2,11 +2,11 @@
  * add_partition adds a partitions details to the devices partition
  * description.
  */
-void add_gd_partition(struct gendisk *hd, int minor, int start, int size);
+void add_gd_partition(struct gendisk *hd, int minor, sector_t start, sector_t size);
 
 typedef struct {struct page *v;} Sector;
 
-unsigned char *read_dev_sector(struct block_device *, unsigned long, Sector *);
+unsigned char *read_dev_sector(struct block_device *, sector_t, Sector *);
 
 static inline void put_dev_sector(Sector p)
 {
diff -Nru a/fs/partitions/efi.c b/fs/partitions/efi.c
--- a/fs/partitions/efi.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/efi.c	Mon Apr  7 13:52:18 2003
@@ -778,7 +778,7 @@
  */
 int
 efi_partition(struct gendisk *hd, struct block_device *bdev,
-	      unsigned long first_sector, int first_part_minor)
+	      sector_t first_sector, int first_part_minor)
 {
 
 	kdev_t dev = to_kdev_t(bdev->bd_dev);
diff -Nru a/fs/partitions/efi.h b/fs/partitions/efi.h
--- a/fs/partitions/efi.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/efi.h	Mon Apr  7 13:52:18 2003
@@ -110,6 +110,6 @@
 /* Functions */
 extern int
  efi_partition(struct gendisk *hd, struct block_device *bdev,
-	      unsigned long first_sector, int first_part_minor);
+	      sector_t first_sector, int first_part_minor);
 
 #endif
diff -Nru a/fs/partitions/ldm.c b/fs/partitions/ldm.c
--- a/fs/partitions/ldm.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/ldm.c	Mon Apr  7 13:52:18 2003
@@ -1480,7 +1480,7 @@
  *            Or @bdev is a dynamic disk, but it may be corrupted
  */
 int ldm_partition (struct gendisk *hd, struct block_device *bdev,
-	unsigned long first_sector, int first_minor)
+	sector_t first_sector, int first_minor)
 {
 	struct ldmdb  *ldb;
 	unsigned long base;
diff -Nru a/fs/partitions/ldm.h b/fs/partitions/ldm.h
--- a/fs/partitions/ldm.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/ldm.h	Mon Apr  7 13:52:18 2003
@@ -215,7 +215,7 @@
 };
 
 int ldm_partition (struct gendisk *hd, struct block_device *bdev,
-	unsigned long first_sector, int first_minor);
+	sector_t first_sector, int first_minor);
 
 #endif /* _FS_PT_LDM_H_ */
 
diff -Nru a/fs/partitions/mac.c b/fs/partitions/mac.c
--- a/fs/partitions/mac.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/mac.c	Mon Apr  7 13:52:18 2003
@@ -25,7 +25,7 @@
  */
 
 int mac_partition(struct gendisk *hd, struct block_device *bdev,
-		unsigned long fsec, int first_part_minor)
+		sector_t fsec, int first_part_minor)
 {
 	Sector sect;
 	unsigned char *data;
diff -Nru a/fs/partitions/mac.h b/fs/partitions/mac.h
--- a/fs/partitions/mac.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/mac.h	Mon Apr  7 13:52:18 2003
@@ -49,4 +49,4 @@
     /* ... more stuff */
 };
 
-int mac_partition(struct gendisk *hd, struct block_device *bdev, unsigned long fsec, int first_part_minor);
+int mac_partition(struct gendisk *hd, struct block_device *bdev, sector_t fsec, int first_part_minor);
diff -Nru a/fs/partitions/msdos.c b/fs/partitions/msdos.c
--- a/fs/partitions/msdos.c	Mon Apr  7 13:52:17 2003
+++ b/fs/partitions/msdos.c	Mon Apr  7 13:52:17 2003
@@ -551,7 +551,7 @@
 }
  
 int msdos_partition(struct gendisk *hd, struct block_device *bdev,
-		    unsigned long first_sector, int first_part_minor)
+		    sector_t first_sector, int first_part_minor)
 {
 	int i, minor = first_part_minor;
 	Sector sect;
diff -Nru a/fs/partitions/msdos.h b/fs/partitions/msdos.h
--- a/fs/partitions/msdos.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/msdos.h	Mon Apr  7 13:52:18 2003
@@ -5,5 +5,5 @@
 #define MSDOS_LABEL_MAGIC		0xAA55
 
 int msdos_partition(struct gendisk *hd, struct block_device *bdev,
-		    unsigned long first_sector, int first_part_minor);
+		    sector_t first_sector, int first_part_minor);
 
diff -Nru a/fs/partitions/osf.c b/fs/partitions/osf.c
--- a/fs/partitions/osf.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/osf.c	Mon Apr  7 13:52:18 2003
@@ -18,7 +18,7 @@
 #include "osf.h"
 
 int osf_partition(struct gendisk *hd, struct block_device *bdev,
-		unsigned long first_sector, int current_minor)
+		sector_t first_sector, int current_minor)
 {
 	int i;
 	Sector sect;
diff -Nru a/fs/partitions/osf.h b/fs/partitions/osf.h
--- a/fs/partitions/osf.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/osf.h	Mon Apr  7 13:52:18 2003
@@ -5,5 +5,5 @@
 #define DISKLABELMAGIC (0x82564557UL)
 
 int osf_partition(struct gendisk *hd, struct block_device *bdev,
-		unsigned long first_sector, int current_minor);
+		sector_t first_sector, int current_minor);
 
diff -Nru a/fs/partitions/sgi.c b/fs/partitions/sgi.c
--- a/fs/partitions/sgi.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/sgi.c	Mon Apr  7 13:52:18 2003
@@ -17,7 +17,7 @@
 #include "check.h"
 #include "sgi.h"
 
-int sgi_partition(struct gendisk *hd, struct block_device *bdev, unsigned long first_sector, int current_minor)
+int sgi_partition(struct gendisk *hd, struct block_device *bdev, sector_t first_sector, int current_minor)
 {
 	int i, csum, magic;
 	unsigned int *ui, start, blocks, cs;
diff -Nru a/fs/partitions/sgi.h b/fs/partitions/sgi.h
--- a/fs/partitions/sgi.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/sgi.h	Mon Apr  7 13:52:18 2003
@@ -3,7 +3,7 @@
  */
 
 extern int sgi_partition(struct gendisk *hd, struct block_device *bdev,
-	 unsigned long first_sector, int first_part_minor);
+	 sector_t first_sector, int first_part_minor);
 
 #define SGI_LABEL_MAGIC 0x0be5a941
 
diff -Nru a/fs/partitions/sun.c b/fs/partitions/sun.c
--- a/fs/partitions/sun.c	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/sun.c	Mon Apr  7 13:52:18 2003
@@ -24,7 +24,7 @@
 extern void md_autodetect_dev(kdev_t dev);
 #endif
 
-int sun_partition(struct gendisk *hd, struct block_device *bdev, unsigned long first_sector, int first_part_minor)
+int sun_partition(struct gendisk *hd, struct block_device *bdev, sector_t first_sector, int first_part_minor)
 {
 	int i, csum;
 	unsigned short *ush;
diff -Nru a/fs/partitions/sun.h b/fs/partitions/sun.h
--- a/fs/partitions/sun.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/sun.h	Mon Apr  7 13:52:18 2003
@@ -5,5 +5,5 @@
 #define SUN_LABEL_MAGIC          0xDABE
 
 int sun_partition(struct gendisk *hd, struct block_device *bdev,
-		  unsigned long first_sector, int first_part_minor);
+		  sector_t first_sector, int first_part_minor);
 
diff -Nru a/fs/partitions/ultrix.c b/fs/partitions/ultrix.c
--- a/fs/partitions/ultrix.c	Mon Apr  7 13:52:17 2003
+++ b/fs/partitions/ultrix.c	Mon Apr  7 13:52:17 2003
@@ -15,7 +15,7 @@
 #include "check.h"
 
 int ultrix_partition(struct gendisk *hd, struct block_device *bdev,
-                            unsigned long first_sector, int first_part_minor)
+                            sector_t first_sector, int first_part_minor)
 {
 	int i;
 	Sector sect;
diff -Nru a/fs/partitions/ultrix.h b/fs/partitions/ultrix.h
--- a/fs/partitions/ultrix.h	Mon Apr  7 13:52:18 2003
+++ b/fs/partitions/ultrix.h	Mon Apr  7 13:52:18 2003
@@ -3,5 +3,5 @@
  */
 
 int ultrix_partition(struct gendisk *hd, struct block_device *bdev,
-                     unsigned long first_sector, int first_part_minor);
+                     sector_t first_sector, int first_part_minor);
 
diff -Nru a/fs/qnx4/inode.c b/fs/qnx4/inode.c
--- a/fs/qnx4/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/qnx4/inode.c	Mon Apr  7 13:52:18 2003
@@ -204,7 +204,7 @@
 	return NULL;
 }
 
-int qnx4_get_block( struct inode *inode, long iblock, struct buffer_head *bh, int create )
+int qnx4_get_block( struct inode *inode, sector_t iblock, struct buffer_head *bh, int create )
 {
 	unsigned long phys;
 
@@ -424,7 +424,7 @@
 	return cont_prepare_write(page,from,to,qnx4_get_block,
 		&page->mapping->host->u.qnx4_i.mmu_private);
 }
-static int qnx4_bmap(struct address_space *mapping, long block)
+static sector_t qnx4_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,qnx4_get_block);
 }
diff -Nru a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
--- a/fs/reiserfs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/reiserfs/inode.c	Mon Apr  7 13:52:18 2003
@@ -17,7 +17,7 @@
 #define GET_BLOCK_READ_DIRECT 4  /* read the tail if indirect item not found */
 #define GET_BLOCK_NO_ISEM     8 /* i_sem is not held, don't preallocate */
 
-static int reiserfs_get_block (struct inode * inode, long block,
+static int reiserfs_get_block (struct inode * inode, sector_t block,
 			       struct buffer_head * bh_result, int create);
 
 void reiserfs_delete_inode (struct inode * inode)
@@ -217,7 +217,7 @@
 // Please improve the english/clarity in the comment above, as it is
 // hard to understand.
 
-static int _get_block_create_0 (struct inode * inode, long block,
+static int _get_block_create_0 (struct inode * inode, sector_t block,
 				 struct buffer_head * bh_result,
 				 int args)
 {
@@ -226,7 +226,7 @@
     struct buffer_head * bh;
     struct item_head * ih, tmp_ih;
     int fs_gen ;
-    int blocknr;
+    sector_t blocknr;
     char * p = NULL;
     int chars;
     int ret ;
@@ -379,9 +379,11 @@
 
 // this is called to create file map. So, _get_block_create_0 will not
 // read direct item
-int reiserfs_bmap (struct inode * inode, long block,
+int reiserfs_bmap (struct inode * inode, sector_t block,
 		   struct buffer_head * bh_result, int create)
 {
+    if (unlikely(sizeof(sector_t) > 4 && (block >> 32)))
+	return -EFBIG;
     if (!file_capable (inode, block))
 	return -EFBIG;
 
@@ -409,12 +411,12 @@
 ** don't want to send create == GET_BLOCK_NO_HOLE to reiserfs_get_block, 
 ** don't use this function.
 */
-static int reiserfs_get_block_create_0 (struct inode * inode, long block,
+static int reiserfs_get_block_create_0 (struct inode * inode, sector_t block,
 			struct buffer_head * bh_result, int create) {
     return reiserfs_get_block(inode, block, bh_result, GET_BLOCK_NO_HOLE) ;
 }
 
-static int reiserfs_get_block_direct_io (struct inode * inode, long block,
+static int reiserfs_get_block_direct_io (struct inode * inode, sector_t block,
 			struct buffer_head * bh_result, int create) {
     int ret ;
 
@@ -514,7 +516,7 @@
     return reiserfs_new_unf_blocknrs (th, inode, allocated_block_nr, path, block);
 }
 
-static int reiserfs_get_block (struct inode * inode, long block,
+static int reiserfs_get_block (struct inode * inode, sector_t block,
 			       struct buffer_head * bh_result, int create)
 {
     int repeat, retval;
@@ -544,6 +546,11 @@
     th.t_trans_id = 0 ;
     version = get_inode_item_key_version (inode);
 
+    if (unlikely(sizeof(block) > 4 && (block >> 32))) {
+        unlock_kernel();
+        return -EIO;
+    }
+
     if (block < 0) {
 	unlock_kernel();
 	return -EIO;
@@ -558,12 +565,11 @@
     ** log anything, so we don't need to start a transaction
     */
     if (!(create & GET_BLOCK_CREATE)) {
-	int ret ;
 	/* find number of block-th logical block of the file */
-	ret = _get_block_create_0 (inode, block, bh_result, 
+	retval = _get_block_create_0 (inode, block, bh_result, 
 	                           create | GET_BLOCK_READ_DIRECT) ;
 	unlock_kernel() ;
-	return ret;
+	return retval;
     }
 
     inode->u.reiserfs_i.i_flags |= i_pack_on_close_mask;
@@ -856,8 +862,9 @@
     pop_journal_writer(windex) ;
     unlock_kernel() ;
     reiserfs_check_path(&path) ;
-    return retval;
-}
+  
+  return retval;
+} 
 
 
 //
@@ -2035,8 +2042,8 @@
 }
 
 
-static int reiserfs_aop_bmap(struct address_space *as, long block) {
-  return generic_block_bmap(as, block, reiserfs_bmap) ;
+static sector_t reiserfs_aop_bmap(struct address_space *as, sector_t block) {
+    return generic_block_bmap(as, block, reiserfs_bmap) ;
 }
 
 static int reiserfs_commit_write(struct file *f, struct page *page, 
@@ -2120,7 +2127,7 @@
 }
 
 static int reiserfs_direct_io(int rw, struct inode *inode, 
-                              struct kiobuf *iobuf, unsigned long blocknr,
+                              struct kiobuf *iobuf, sector_t blocknr,
 			      int blocksize) 
 {
     return generic_direct_IO(rw, inode, iobuf, blocknr, blocksize,
diff -Nru a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
--- a/fs/reiserfs/journal.c	Mon Apr  7 13:52:17 2003
+++ b/fs/reiserfs/journal.c	Mon Apr  7 13:52:17 2003
@@ -1010,15 +1010,16 @@
     ** is not marked JDirty_wait
     */
     if ((!was_jwait) && !buffer_locked(saved_bh)) {
-printk("journal-813: BAD! buffer %lu %cdirty %cjwait, not in a newer tranasction\n", saved_bh->b_blocknr,
+printk("journal-813: BAD! buffer %llu %cdirty %cjwait, not in a newer tranasction\n", 
+	(unsigned long long)saved_bh->b_blocknr,
         was_dirty ? ' ' : '!', was_jwait ? ' ' : '!') ;
     }
     /* kupdate_one_transaction waits on the buffers it is writing, so we
     ** should never see locked buffers here
     */
     if (buffer_locked(saved_bh)) {
-      printk("clm-2083: locked buffer %lu in flush_journal_list\n", 
-              saved_bh->b_blocknr) ;
+      printk("clm-2083: locked buffer %llu in flush_journal_list\n", 
+              (unsigned long long)saved_bh->b_blocknr) ;
       wait_on_buffer(saved_bh) ;
       if (!buffer_uptodate(saved_bh)) {
         reiserfs_panic(s, "journal-923: buffer write failed\n") ;
@@ -1031,8 +1032,8 @@
       submit_logged_buffer(saved_bh) ;
       count++ ;
     } else {
-      printk("clm-2082: Unable to flush buffer %lu in flush_journal_list\n",
-              saved_bh->b_blocknr) ;
+      printk("clm-2082: Unable to flush buffer %llu in flush_journal_list\n",
+              (unsigned long long)saved_bh->b_blocknr) ;
     }
 free_cnode:
     last = cn ;
@@ -2171,7 +2172,9 @@
   ** could get to disk too early.  NOT GOOD.
   */
   if (!prepared || buffer_locked(bh)) {
-    printk("journal-1777: buffer %lu bad state %cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT\n", bh->b_blocknr, prepared ? ' ' : '!', 
+    printk("journal-1777: buffer %llu bad state %cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT\n", 
+			    (unsigned long long)bh->b_blocknr, 
+			    prepared ? ' ' : '!', 
                             buffer_locked(bh) ? ' ' : '!',
 			    buffer_dirty(bh) ? ' ' : '!',
 			    buffer_journal_dirty(bh) ? ' ' : '!') ;
diff -Nru a/fs/reiserfs/prints.c b/fs/reiserfs/prints.c
--- a/fs/reiserfs/prints.c	Mon Apr  7 13:52:18 2003
+++ b/fs/reiserfs/prints.c	Mon Apr  7 13:52:18 2003
@@ -138,8 +138,8 @@
 
 static void sprintf_buffer_head (char * buf, struct buffer_head * bh) 
 {
-  sprintf (buf, "dev %s, size %d, blocknr %ld, count %d, list %d, state 0x%lx, page %p, (%s, %s, %s)",
-	   kdevname (bh->b_dev), bh->b_size, bh->b_blocknr, atomic_read (&(bh->b_count)), bh->b_list,
+  sprintf (buf, "dev %s, size %d, blocknr %llu, count %d, list %d, state 0x%lx, page %p, (%s, %s, %s)",
+	   kdevname (bh->b_dev), bh->b_size, (unsigned long long)bh->b_blocknr, atomic_read (&(bh->b_count)), bh->b_list,
 	   bh->b_state, bh->b_page,
 	   buffer_uptodate (bh) ? "UPTODATE" : "!UPTODATE",
 	   buffer_dirty (bh) ? "DIRTY" : "CLEAN",
@@ -365,7 +365,7 @@
     if (tb) {
 	while (tb->insert_size[h]) {
 	    bh = PATH_H_PBUFFER (path, h);
-	    printk ("block %lu (level=%d), position %d\n", bh ? bh->b_blocknr : 0,
+	    printk ("block %llu (level=%d), position %d\n", bh ? (unsigned long long)bh->b_blocknr : 0ULL,
 		    bh ? B_LEVEL (bh) : 0, PATH_H_POSITION (path, h));
 	    h ++;
 	}
@@ -375,8 +375,8 @@
       printk ("Offset    Bh     (b_blocknr, b_count) Position Nr_item\n");
       while ( offset > ILLEGAL_PATH_ELEMENT_OFFSET ) {
 	  bh = PATH_OFFSET_PBUFFER (path, offset);
-	  printk ("%6d %10p (%9lu, %7d) %8d %7d\n", offset, 
-		  bh, bh ? bh->b_blocknr : 0, bh ? atomic_read (&(bh->b_count)) : 0,
+	  printk ("%6d %10p (%9llu, %7d) %8d %7d\n", offset, 
+		  bh, (unsigned long long)(bh ? bh->b_blocknr : 0), bh ? atomic_read (&(bh->b_count)) : 0,
 		  PATH_OFFSET_POSITION (path, offset), bh ? B_NR_ITEMS (bh) : -1);
 	  
 	  offset --;
@@ -506,8 +506,8 @@
 	return 1;
     }
 
-    printk ("%s\'s super block in block %ld\n======================\n",
-            kdevname (bh->b_dev), bh->b_blocknr);
+    printk ("%s\'s super block in block %llu\n======================\n",
+            kdevname (bh->b_dev), (unsigned long long)bh->b_blocknr);
     printk ("Reiserfs version %s\n", version );
     printk ("Block count %u\n", sb_block_count(rs));
     printk ("Blocksize %d\n", sb_blocksize(rs));
@@ -545,8 +545,8 @@
     if (memcmp(desc->j_magic, JOURNAL_DESC_MAGIC, 8))
 	return 1;
 
-    printk ("Desc block %lu (j_trans_id %d, j_mount_id %d, j_len %d)",
-	    bh->b_blocknr, desc->j_trans_id, desc->j_mount_id, desc->j_len);
+    printk ("Desc block %llu (j_trans_id %d, j_mount_id %d, j_len %d)",
+	    (unsigned long long)bh->b_blocknr, desc->j_trans_id, desc->j_mount_id, desc->j_len);
 
     return 0;
 }
@@ -571,7 +571,7 @@
 	if (print_internal (bh, first, last))
 	    if (print_super_block (bh))
 		if (print_desc_block (bh))
-		    printk ("Block %ld contains unformatted data\n", bh->b_blocknr);
+		    printk ("Block %llu contains unformatted data\n", (unsigned long long)bh->b_blocknr);
 }
 
 
@@ -606,19 +606,19 @@
 	    tbFh = 0;
 	}
 	sprintf (print_tb_buf + strlen (print_tb_buf),
-		 "* %d * %3ld(%2d) * %3ld(%2d) * %3ld(%2d) * %5ld * %5ld * %5ld * %5ld * %5ld *\n",
+		 "* %d * %3llu(%2d) * %3llu(%2d) * %3llu(%2d) * %5llu * %5llu * %5llu * %5llu * %5llu *\n",
 		 h, 
-		 (tbSh) ? (tbSh->b_blocknr):(-1),
+		 (unsigned long long)((tbSh) ? (tbSh->b_blocknr):(-1)),
 		 (tbSh) ? atomic_read (&(tbSh->b_count)) : -1,
-		 (tb->L[h]) ? (tb->L[h]->b_blocknr):(-1),
+		 (unsigned long long)((tb->L[h]) ? (tb->L[h]->b_blocknr):(-1)),
 		 (tb->L[h]) ? atomic_read (&(tb->L[h]->b_count)) : -1,
-		 (tb->R[h]) ? (tb->R[h]->b_blocknr):(-1),
+		 (unsigned long long)((tb->R[h]) ? (tb->R[h]->b_blocknr):(-1)),
 		 (tb->R[h]) ? atomic_read (&(tb->R[h]->b_count)) : -1,
-		 (tbFh) ? (tbFh->b_blocknr):(-1),
-		 (tb->FL[h]) ? (tb->FL[h]->b_blocknr):(-1),
-		 (tb->FR[h]) ? (tb->FR[h]->b_blocknr):(-1),
-		 (tb->CFL[h]) ? (tb->CFL[h]->b_blocknr):(-1),
-		 (tb->CFR[h]) ? (tb->CFR[h]->b_blocknr):(-1));
+		 (unsigned long long)((tbFh) ? (tbFh->b_blocknr):(-1)),
+		 (unsigned long long)((tb->FL[h]) ? (tb->FL[h]->b_blocknr):(-1)),
+		 (unsigned long long)((tb->FR[h]) ? (tb->FR[h]->b_blocknr):(-1)),
+		 (unsigned long long)((tb->CFL[h]) ? (tb->CFL[h]->b_blocknr):(-1)),
+		 (unsigned long long)((tb->CFR[h]) ? (tb->CFR[h]->b_blocknr):(-1)));
     }
 
     sprintf (print_tb_buf + strlen (print_tb_buf), 
@@ -645,7 +645,7 @@
     h = 0;
     for (i = 0; i < sizeof (tb->FEB) / sizeof (tb->FEB[0]); i ++)
 	sprintf (print_tb_buf + strlen (print_tb_buf),
-		 "%p (%lu %d)%s", tb->FEB[i], tb->FEB[i] ? tb->FEB[i]->b_blocknr : 0,
+		 "%p (%llu %d)%s", tb->FEB[i], (unsigned long long)(tb->FEB[i] ? tb->FEB[i]->b_blocknr : 0),
 		 tb->FEB[i] ? atomic_read (&(tb->FEB[i]->b_count)) : 0, 
 		 (i == sizeof (tb->FEB) / sizeof (tb->FEB[0]) - 1) ? "\n" : ", ");
 
diff -Nru a/fs/reiserfs/super.c b/fs/reiserfs/super.c
--- a/fs/reiserfs/super.c	Mon Apr  7 13:52:18 2003
+++ b/fs/reiserfs/super.c	Mon Apr  7 13:52:18 2003
@@ -848,8 +848,8 @@
     rs = (struct reiserfs_super_block *)bh->b_data;
     if (!is_reiserfs_magic_string (rs)) {
       printk ("read_super_block: "
-              "can't find a reiserfs filesystem on (dev %s, block %lu, size %d)\n",
-              kdevname(s->s_dev), bh->b_blocknr, size);
+              "can't find a reiserfs filesystem on (dev %s, block %llu, size %d)\n",
+              kdevname(s->s_dev), (unsigned long long)bh->b_blocknr, size);
       brelse (bh);
       return 1;
     }
@@ -865,7 +865,7 @@
     brelse (bh);
 
     if (s->s_blocksize != 4096) {
-	printk("Unsupported reiserfs blocksize: %d on %s, only 4096 bytes "
+	printk("Unsupported reiserfs blocksize: %lu on %s, only 4096 bytes "
 	       "blocksize is supported.\n", s->s_blocksize, kdevname (s->s_dev));
 	return 1;
     }
@@ -885,8 +885,8 @@
     if (!is_reiserfs_magic_string (rs) ||
 	sb_blocksize(rs) != s->s_blocksize) {
 	printk ("read_super_block: "
-		"can't find a reiserfs filesystem on (dev %s, block %lu, size %d)\n",
-		kdevname(s->s_dev), bh->b_blocknr, size);
+		"can't find a reiserfs filesystem on (dev %s, block %llu, size %d)\n",
+		kdevname(s->s_dev), (unsigned long long)bh->b_blocknr, size);
 	brelse (bh);
 	printk ("read_super_block: can't find a reiserfs filesystem on dev %s.\n", kdevname(s->s_dev));
 	return 1;
@@ -900,8 +900,8 @@
 	bh->b_blocknr < (sb_journal_block(rs) + JOURNAL_BLOCK_COUNT)) {
 	brelse(bh) ;
 	printk("super-459: read_super_block: "
-	       "super found at block %lu is within its own log. "
-	       "It must not be of this format type.\n", bh->b_blocknr) ;
+	       "super found at block %llu is within its own log. "
+	       "It must not be of this format type.\n", (unsigned long long)bh->b_blocknr) ;
 	return 1 ;
     }
 
@@ -941,8 +941,8 @@
     ll_rw_block(READ, 1, &(SB_AP_BITMAP(s)[i].bh)) ;
     wait_on_buffer(SB_AP_BITMAP(s)[i].bh) ;
     if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh)) {
-      printk("reread_meta_blocks, error reading bitmap block number %d at
-      %ld\n", i, SB_AP_BITMAP(s)[i].bh->b_blocknr) ;
+      printk("reread_meta_blocks, error reading bitmap block number %d at %llu\n", 
+	     i, (unsigned long long)SB_AP_BITMAP(s)[i].bh->b_blocknr) ;
       return 1 ;
     }
   }
diff -Nru a/fs/sysv/itree.c b/fs/sysv/itree.c
--- a/fs/sysv/itree.c	Mon Apr  7 13:52:18 2003
+++ b/fs/sysv/itree.c	Mon Apr  7 13:52:18 2003
@@ -191,7 +191,7 @@
 	return -EAGAIN;
 }
 
-static int get_block(struct inode *inode, long iblock, struct buffer_head *bh_result, int create)
+static int get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
 {
 	int err = -EIO;
 	int offsets[DEPTH];
@@ -425,7 +425,7 @@
 {
 	return block_prepare_write(page,from,to,get_block);
 }
-static int sysv_bmap(struct address_space *mapping, long block)
+static sector_t sysv_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,get_block);
 }
diff -Nru a/fs/udf/inode.c b/fs/udf/inode.c
--- a/fs/udf/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/udf/inode.c	Mon Apr  7 13:52:18 2003
@@ -61,7 +61,7 @@
 static void udf_update_extents(struct inode *,
 	long_ad [EXTENT_MERGE_SIZE], int, int,
 	lb_addr, uint32_t, struct buffer_head **);
-static int udf_get_block(struct inode *, long, struct buffer_head *, int);
+static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int);
 
 /*
  * udf_put_inode
@@ -146,7 +146,7 @@
 	return block_prepare_write(page, from, to, udf_get_block);
 }
 
-static int udf_bmap(struct address_space *mapping, long block)
+static sector_t udf_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,udf_get_block);
 }
@@ -311,7 +311,7 @@
 	return dbh;
 }
 
-static int udf_get_block(struct inode *inode, long block, struct buffer_head *bh_result, int create)
+static int udf_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create)
 {
 	int err, new;
 	struct buffer_head *bh;
diff -Nru a/fs/ufs/inode.c b/fs/ufs/inode.c
--- a/fs/ufs/inode.c	Mon Apr  7 13:52:18 2003
+++ b/fs/ufs/inode.c	Mon Apr  7 13:52:18 2003
@@ -308,7 +308,7 @@
 	return result;
 }
 
-static int ufs_getfrag_block (struct inode *inode, long fragment, struct buffer_head *bh_result, int create)
+static int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create)
 {
 	struct super_block * sb;
 	struct ufs_sb_private_info * uspi;
@@ -463,7 +463,7 @@
 {
 	return block_prepare_write(page,from,to,ufs_getfrag_block);
 }
-static int ufs_bmap(struct address_space *mapping, long block)
+static sector_t ufs_bmap(struct address_space *mapping, sector_t block)
 {
 	return generic_block_bmap(mapping,block,ufs_getfrag_block);
 }
diff -Nru a/include/asm-i386/types.h b/include/asm-i386/types.h
--- a/include/asm-i386/types.h	Mon Apr  7 13:52:17 2003
+++ b/include/asm-i386/types.h	Mon Apr  7 13:52:17 2003
@@ -52,6 +52,10 @@
 #endif
 typedef u64 dma64_addr_t;
 
+#ifdef CONFIG_LBD
+typedef u64 sector_t;
+#define HAVE_ARCH_SECTOR_T
+#endif
 #endif /* __KERNEL__ */
 
 #endif
diff -Nru a/include/asm-ppc/types.h b/include/asm-ppc/types.h
--- a/include/asm-ppc/types.h	Mon Apr  7 13:52:18 2003
+++ b/include/asm-ppc/types.h	Mon Apr  7 13:52:18 2003
@@ -48,6 +48,12 @@
 typedef u32 dma_addr_t;
 typedef u64 dma64_addr_t;
 
+#ifdef CONFIG_LBD
+typedef u64 sector_t;
+#define HAVE_ARCH_SECTOR_T
+#endif
+
+
 #endif /* __KERNEL__ */
 
 /*
diff -Nru a/include/linux/blkdev.h b/include/linux/blkdev.h
--- a/include/linux/blkdev.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/blkdev.h	Mon Apr  7 13:52:18 2003
@@ -34,9 +34,10 @@
 	int cmd;		/* READ or WRITE */
 	int errors;
 	unsigned long start_time;
-	unsigned long sector;
+	sector_t sector;
 	unsigned long nr_sectors;
-	unsigned long hard_sector, hard_nr_sectors;
+	sector_t hard_sector;
+	unsigned long hard_nr_sectors;
 	unsigned int nr_segments;
 	unsigned int nr_hw_segments;
 	unsigned long current_nr_sectors, hard_cur_sectors;
@@ -196,8 +197,8 @@
 
 extern struct sec_size * blk_sec[MAX_BLKDEV];
 extern struct blk_dev_struct blk_dev[MAX_BLKDEV];
-extern void grok_partitions(struct gendisk *dev, int drive, unsigned minors, long size);
-extern void register_disk(struct gendisk *dev, kdev_t first, unsigned minors, struct block_device_operations *ops, long size);
+extern void grok_partitions(struct gendisk *dev, int drive, unsigned minors, sector_t size);
+extern void register_disk(struct gendisk *dev, kdev_t first, unsigned minors, struct block_device_operations *ops, sector_t size);
 extern void generic_make_request(int rw, struct buffer_head * bh);
 extern inline request_queue_t *blk_get_queue(kdev_t dev);
 extern void blkdev_release_request(struct request *);
@@ -213,7 +214,7 @@
 extern void generic_unplug_device(void *);
 extern inline int blk_seg_merge_ok(struct buffer_head *, struct buffer_head *);
 
-extern int * blk_size[MAX_BLKDEV];
+extern sector_t * blk_size[MAX_BLKDEV];
 
 extern int * blksize_size[MAX_BLKDEV];
 
@@ -277,5 +278,19 @@
 	}
 	return retval;
 }
+
+#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
diff -Nru a/include/linux/fs.h b/include/linux/fs.h
--- a/include/linux/fs.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/fs.h	Mon Apr  7 13:52:18 2003
@@ -242,7 +242,7 @@
 struct buffer_head {
 	/* First cache line: */
 	struct buffer_head *b_next;	/* Hash queue list */
-	unsigned long b_blocknr;	/* block number */
+	sector_t b_blocknr;		/* block number */
 	unsigned short b_size;		/* block size */
 	unsigned short b_list;		/* List that this buffer appears */
 	kdev_t b_dev;			/* device (B_FREE = free) */
@@ -263,7 +263,7 @@
 	void (*b_end_io)(struct buffer_head *bh, int uptodate); /* I/O completion */
  	void *b_private;		/* reserved for b_end_io */
 
-	unsigned long b_rsector;	/* Real buffer location on disk */
+	sector_t b_rsector;		/* Real buffer location on disk */
 	wait_queue_head_t b_wait;
 
 	struct inode *	     b_inode;
@@ -391,11 +391,11 @@
 	int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
 	int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
 	/* Unfortunately this kludge is needed for FIBMAP. Don't use it */
-	int (*bmap)(struct address_space *, long);
+	sector_t (*bmap)(struct address_space *, sector_t);
 	int (*flushpage) (struct page *, unsigned long);
 	int (*releasepage) (struct page *, int);
 #define KERNEL_HAS_O_DIRECT /* this is for modules out of the kernel */
-	int (*direct_IO)(int, struct inode *, struct kiobuf *, unsigned long, int);
+	int (*direct_IO)(int, struct inode *, struct kiobuf *, sector_t, int);
 };
 
 struct address_space {
@@ -452,7 +452,7 @@
 	time_t			i_ctime;
 	unsigned int		i_blkbits;
 	unsigned long		i_blksize;
-	unsigned long		i_blocks;
+	sector_t		i_blocks;
 	unsigned long		i_version;
 	struct semaphore	i_sem;
 	struct semaphore	i_zombie;
@@ -1241,7 +1241,7 @@
 extern int filemap_fdatasync(struct address_space *);
 extern int filemap_fdatawait(struct address_space *);
 extern void sync_supers(kdev_t);
-extern int bmap(struct inode *, int);
+extern sector_t bmap(struct inode *, sector_t);
 extern int notify_change(struct dentry *, struct iattr *);
 extern int permission(struct inode *, int);
 extern int vfs_permission(struct inode *, int);
@@ -1373,8 +1373,8 @@
 extern void remove_inode_hash(struct inode *);
 extern struct file * get_empty_filp(void);
 extern void file_move(struct file *f, struct list_head *list);
-extern struct buffer_head * get_hash_table(kdev_t, int, int);
-extern struct buffer_head * getblk(kdev_t, int, int);
+extern struct buffer_head * get_hash_table(kdev_t, sector_t, int);
+extern struct buffer_head * getblk(kdev_t, sector_t, int);
 extern void ll_rw_block(int, int, struct buffer_head * bh[]);
 extern void submit_bh(int, struct buffer_head *);
 extern int is_read_only(kdev_t);
@@ -1393,16 +1393,16 @@
 extern int set_blocksize(kdev_t, int);
 extern int sb_set_blocksize(struct super_block *, int);
 extern int sb_min_blocksize(struct super_block *, int);
-extern struct buffer_head * bread(kdev_t, int, int);
-static inline struct buffer_head * sb_bread(struct super_block *sb, int block)
+extern struct buffer_head * bread(kdev_t, sector_t, int);
+static inline struct buffer_head * sb_bread(struct super_block *sb, sector_t block)
 {
 	return bread(sb->s_dev, block, sb->s_blocksize);
 }
-static inline struct buffer_head * sb_getblk(struct super_block *sb, int block)
+static inline struct buffer_head * sb_getblk(struct super_block *sb, sector_t block)
 {
 	return getblk(sb->s_dev, block, sb->s_blocksize);
 }
-static inline struct buffer_head * sb_get_hash_table(struct super_block *sb, int block)
+static inline struct buffer_head * sb_get_hash_table(struct super_block *sb, sector_t block)
 {
 	return get_hash_table(sb->s_dev, block, sb->s_blocksize);
 }
@@ -1410,9 +1410,9 @@
 extern void put_unused_buffer_head(struct buffer_head * bh);
 extern struct buffer_head * get_unused_buffer_head(int async);
 
-extern int brw_page(int, struct page *, kdev_t, int [], int);
+extern int brw_page(int, struct page *, kdev_t, sector_t [], int);
 
-typedef int (get_block_t)(struct inode*,long,struct buffer_head*,int);
+typedef int (get_block_t)(struct inode*,sector_t,struct buffer_head*,int);
 
 /* Generic buffer handling for block filesystems.. */
 extern int try_to_release_page(struct page * page, int gfp_mask);
@@ -1429,10 +1429,10 @@
 extern int block_commit_write(struct page *page, unsigned from, unsigned to);
 extern int block_sync_page(struct page *);
 
-int generic_block_bmap(struct address_space *, long, get_block_t *);
+sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);
 int generic_commit_write(struct file *, struct page *, unsigned, unsigned);
 int block_truncate_page(struct address_space *, loff_t, get_block_t *);
-extern int generic_direct_IO(int, struct inode *, struct kiobuf *, unsigned long, int, get_block_t *);
+extern int generic_direct_IO(int, struct inode *, struct kiobuf *, sector_t, int, get_block_t *);
 extern int waitfor_one_page(struct page *);
 extern int writeout_one_page(struct page *);
 
diff -Nru a/include/linux/genhd.h b/include/linux/genhd.h
--- a/include/linux/genhd.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/genhd.h	Mon Apr  7 13:52:18 2003
@@ -59,8 +59,8 @@
 #  include <linux/devfs_fs_kernel.h>
 
 struct hd_struct {
-	unsigned long start_sect;
-	unsigned long nr_sects;
+	sector_t start_sect;
+	sector_t nr_sects;
 	devfs_handle_t de;              /* primary (master) devfs entry  */
 #ifdef CONFIG_DEVFS_FS
 	int number;
@@ -94,7 +94,7 @@
 	int max_p;			/* maximum partitions per device */
 
 	struct hd_struct *part;		/* [indexed by minor] */
-	int *sizes;			/* [idem], device size in blocks */
+	sector_t *sizes;		/* [idem], device size in blocks */
 	int nr_real;			/* number of real devices */
 
 	void *real_devices;		/* internal use */
diff -Nru a/include/linux/ide.h b/include/linux/ide.h
--- a/include/linux/ide.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/ide.h	Mon Apr  7 13:52:18 2003
@@ -689,7 +689,7 @@
 typedef int		(ide_cleanup_proc)(ide_drive_t *);
 typedef int		(ide_standby_proc)(ide_drive_t *);
 typedef int		(ide_flushcache_proc)(ide_drive_t *);
-typedef ide_startstop_t	(ide_do_request_proc)(ide_drive_t *, struct request *, unsigned long);
+typedef ide_startstop_t	(ide_do_request_proc)(ide_drive_t *, struct request *, sector_t);
 typedef void		(ide_end_request_proc)(byte, ide_hwgroup_t *);
 typedef int		(ide_ioctl_proc)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);
 typedef int		(ide_open_proc)(struct inode *, struct file *, ide_drive_t *);
@@ -697,7 +697,7 @@
 typedef int		(ide_check_media_change_proc)(ide_drive_t *);
 typedef void		(ide_revalidate_proc)(ide_drive_t *);
 typedef void		(ide_pre_reset_proc)(ide_drive_t *);
-typedef unsigned long	(ide_capacity_proc)(ide_drive_t *);
+typedef sector_t	(ide_capacity_proc)(ide_drive_t *);
 typedef ide_startstop_t	(ide_special_proc)(ide_drive_t *);
 typedef void		(ide_setting_proc)(ide_drive_t *);
 typedef int		(ide_reinit_proc)(ide_drive_t *);
diff -Nru a/include/linux/iobuf.h b/include/linux/iobuf.h
--- a/include/linux/iobuf.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/iobuf.h	Mon Apr  7 13:52:18 2003
@@ -41,7 +41,7 @@
 
 	struct page **  maplist;
 	struct buffer_head ** bh;
-	unsigned long * blocks;
+	sector_t * blocks;
 
 	/* Dynamic state for IO completion: */
 	atomic_t	io_count;	/* IOs still in progress */
@@ -73,6 +73,6 @@
 /* fs/buffer.c */
 
 int	brw_kiovec(int rw, int nr, struct kiobuf *iovec[], 
-		   kdev_t dev, unsigned long b[], int size);
+		   kdev_t dev, sector_t b[], int size);
 
 #endif /* __LINUX_IOBUF_H */
diff -Nru a/include/linux/iso_fs.h b/include/linux/iso_fs.h
--- a/include/linux/iso_fs.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/iso_fs.h	Mon Apr  7 13:52:18 2003
@@ -219,7 +219,7 @@
 int get_acorn_filename(struct iso_directory_record *, char *, struct inode *);
 
 extern struct dentry *isofs_lookup(struct inode *, struct dentry *);
-extern struct buffer_head *isofs_bread(struct inode *inode, unsigned int block);
+extern struct buffer_head *isofs_bread(struct inode *inode, sector_t block);
 extern int isofs_get_blocks(struct inode *, long, struct buffer_head **, unsigned long);
 
 extern struct inode_operations isofs_dir_inode_operations;
@@ -234,7 +234,7 @@
 #define brelse leak_check_brelse
 extern void * leak_check_malloc(unsigned int size);
 extern void leak_check_free_s(void * obj, int size);
-extern struct buffer_head * leak_check_bread(struct super_block *sb, int block);
+extern struct buffer_head * leak_check_bread(struct super_block *sb, sector_t block);
 extern void leak_check_brelse(struct buffer_head * bh);
 #endif /* LEAK_CHECK */
 
diff -Nru a/include/linux/loop.h b/include/linux/loop.h
--- a/include/linux/loop.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/loop.h	Mon Apr  7 13:52:18 2003
@@ -34,7 +34,7 @@
 	int		lo_flags;
 	int		(*transfer)(struct loop_device *, int cmd,
 				    char *raw_buf, char *loop_buf, int size,
-				    int real_block);
+				    sector_t real_block);
 	char		lo_name[LO_NAME_SIZE];
 	char		lo_encrypt_key[LO_KEY_SIZE];
 	__u32           lo_init[2];
@@ -129,7 +129,7 @@
 struct loop_func_table {
 	int number; 	/* filter type */ 
 	int (*transfer)(struct loop_device *lo, int cmd, char *raw_buf,
-			char *loop_buf, int size, int real_block);
+			char *loop_buf, int size, sector_t real_block);
 	int (*init)(struct loop_device *, struct loop_info *); 
 	/* release is called from loop_unregister_transfer or clr_fd */
 	int (*release)(struct loop_device *); 
diff -Nru a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h
--- a/include/linux/msdos_fs.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/msdos_fs.h	Mon Apr  7 13:52:18 2003
@@ -273,7 +273,7 @@
 extern struct inode_operations fat_file_inode_operations;
 extern ssize_t fat_file_read(struct file *filp, char *buf, size_t count,
 			     loff_t *ppos);
-extern int fat_get_block(struct inode *inode, long iblock,
+extern int fat_get_block(struct inode *inode, sector_t iblock,
 			 struct buffer_head *bh_result, int create);
 extern ssize_t fat_file_write(struct file *filp, const char *buf, size_t count,
 			      loff_t *ppos);
diff -Nru a/include/linux/qnx4_fs.h b/include/linux/qnx4_fs.h
--- a/include/linux/qnx4_fs.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/qnx4_fs.h	Mon Apr  7 13:52:18 2003
@@ -118,7 +118,7 @@
 extern int qnx4_rmdir(struct inode *dir, struct dentry *dentry);
 extern int qnx4_sync_file(struct file *file, struct dentry *dentry, int);
 extern int qnx4_sync_inode(struct inode *inode);
-extern int qnx4_get_block(struct inode *inode, long iblock, struct buffer_head *bh, int create);
+extern int qnx4_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh, int create);
 
 #endif				/* __KERNEL__ */
 
diff -Nru a/include/linux/raid/linear.h b/include/linux/raid/linear.h
--- a/include/linux/raid/linear.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/raid/linear.h	Mon Apr  7 13:52:18 2003
@@ -5,8 +5,8 @@
 
 struct dev_info {
 	kdev_t		dev;
-	unsigned long	size;
-	unsigned long	offset;
+	sector_t	size;
+	sector_t	offset;
 };
 
 typedef struct dev_info dev_info_t;
diff -Nru a/include/linux/raid/md.h b/include/linux/raid/md.h
--- a/include/linux/raid/md.h	Mon Apr  7 13:52:17 2003
+++ b/include/linux/raid/md.h	Mon Apr  7 13:52:17 2003
@@ -59,7 +59,7 @@
 #define MD_MINOR_VERSION                90
 #define MD_PATCHLEVEL_VERSION           0
 
-extern int md_size[MAX_MD_DEVS];
+extern sector_t md_size[MAX_MD_DEVS];
 extern struct hd_struct md_hd_struct[MAX_MD_DEVS];
 
 extern void add_mddev_mapping (mddev_t *mddev, kdev_t dev, void *data);
diff -Nru a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h
--- a/include/linux/raid/md_k.h	Mon Apr  7 13:52:17 2003
+++ b/include/linux/raid/md_k.h	Mon Apr  7 13:52:17 2003
@@ -164,14 +164,14 @@
 
 	kdev_t dev;			/* Device number */
 	kdev_t old_dev;			/*  "" when it was last imported */
-	unsigned long size;		/* Device size (in blocks) */
+	sector_t size;			/* Device size (in blocks) */
 	mddev_t *mddev;			/* RAID array if running */
 	unsigned long last_events;	/* IO event timestamp */
 
 	struct block_device *bdev;	/* block device handle */
 
 	mdp_super_t *sb;
-	unsigned long sb_offset;
+	sector_t sb_offset;
 
 	int alias_device;		/* device alias to the same disk */
 	int faulty;			/* if faulty do not issue IO requests */
diff -Nru a/include/linux/types.h b/include/linux/types.h
--- a/include/linux/types.h	Mon Apr  7 13:52:18 2003
+++ b/include/linux/types.h	Mon Apr  7 13:52:18 2003
@@ -127,4 +127,10 @@
 	char			f_fpack[6];
 };
 
+#define HAVE_SECTOR_T	/* Allow subsystems to know LBD patch is present */
+
+#ifndef HAVE_ARCH_SECTOR_T
+typedef unsigned long sector_t;
+#endif
+
 #endif /* _LINUX_TYPES_H */
diff -Nru a/include/scsi/scsicam.h b/include/scsi/scsicam.h
--- a/include/scsi/scsicam.h	Mon Apr  7 13:52:18 2003
+++ b/include/scsi/scsicam.h	Mon Apr  7 13:52:18 2003
@@ -14,6 +14,6 @@
 #define SCSICAM_H
 #include <linux/kdev_t.h>
 extern int scsicam_bios_param (Disk *disk, kdev_t dev, int *ip);
-extern int scsi_partsize(struct buffer_head *bh, unsigned long capacity,
+extern int scsi_partsize(struct buffer_head *bh, sector_t capacity,
            unsigned int  *cyls, unsigned int *hds, unsigned int *secs);
 #endif /* def SCSICAM_H */
diff -Nru a/init/do_mounts.c b/init/do_mounts.c
--- a/init/do_mounts.c	Mon Apr  7 13:52:18 2003
+++ b/init/do_mounts.c	Mon Apr  7 13:52:18 2003
@@ -593,7 +593,7 @@
 		rd_blocks >>= 1;
 
 	if (nblocks > rd_blocks) {
-		printk("RAMDISK: image too big! (%d/%d blocks)\n",
+		printk("RAMDISK: image too big! (%d/%lu blocks)\n",
 		       nblocks, rd_blocks);
 		goto done;
 	}
@@ -620,11 +620,11 @@
 		goto done;
 	}
 
-	printk(KERN_NOTICE "RAMDISK: Loading %d blocks [%d disk%s] into ram disk... ", 
+	printk(KERN_NOTICE "RAMDISK: Loading %d blocks [%lu disk%s] into ram disk... ", 
 		nblocks, ((nblocks-1)/devblocks)+1, nblocks>devblocks ? "s" : "");
 	for (i=0; i < nblocks; i++) {
 		if (i && (i % devblocks == 0)) {
-			printk("done disk #%d.\n", i/devblocks);
+			printk("done disk #%lu.\n", i/devblocks);
 			rotate = 0;
 			if (close(in_fd)) {
 				printk("Error closing the disk.\n");
@@ -636,7 +636,7 @@
 				printk("Error opening disk.\n");
 				goto noclose_input;
 			}
-			printk("Loading disk #%d... ", i/devblocks+1);
+			printk("Loading disk #%lu... ", i/devblocks+1);
 		}
 		read(in_fd, buf, BLOCK_SIZE);
 		write(out_fd, buf, BLOCK_SIZE);
diff -Nru a/mm/page_io.c b/mm/page_io.c
--- a/mm/page_io.c	Mon Apr  7 13:52:17 2003
+++ b/mm/page_io.c	Mon Apr  7 13:52:17 2003
@@ -36,7 +36,7 @@
 static int rw_swap_page_base(int rw, swp_entry_t entry, struct page *page)
 {
 	unsigned long offset;
-	int zones[PAGE_SIZE/512];
+	sector_t zones[PAGE_SIZE/512];
 	int zones_used;
 	kdev_t dev = 0;
 	int block_size;
@@ -55,7 +55,7 @@
 		block_size = PAGE_SIZE;
 	} else if (swapf) {
 		int i, j;
-		unsigned int block = offset
+		sector_t block = offset
 			<< (PAGE_SHIFT - swapf->i_sb->s_blocksize_bits);
 
 		block_size = swapf->i_sb->s_blocksize;