diff options
| author | Peter Chubb <peterc@gelato.unsw.edu.au> | 2005-10-19 22:31:19 -0400 |
|---|---|---|
| committer | Tony Luck <tony.luck@intel.com> | 2005-10-25 17:36:55 -0400 |
| commit | b6a7e1ecef66b9ecd1eed31f46ba0248d6d7e957 (patch) | |
| tree | 682b8cf7e11ca49693b9a73420c050700b0774c7 | |
| parent | 444d1d9bb5b724f03344c9317bc01d54a9b39073 (diff) | |
[IA64] Allow simulator to use bigger disks
The simscsi code at present overflows an int if it's given a large
disk image. The attached patch increases the possible size to 128G.
While it's unlikely that anyone will want to use SKI with such a
large drive, the same framework is currently being used for various
virtualisation experiments.
Signed-off-by: Peter Chubb <peterc@gelato.unsw.edu.au>
Signed-off-by: Tony Luck <tony.luck@intel.com>
| -rw-r--r-- | arch/ia64/hp/sim/simscsi.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c index a18983a3c934..a3fe97531134 100644 --- a/arch/ia64/hp/sim/simscsi.c +++ b/arch/ia64/hp/sim/simscsi.c | |||
| @@ -205,10 +205,11 @@ simscsi_get_disk_size (int fd) | |||
| 205 | char buf[512]; | 205 | char buf[512]; |
| 206 | 206 | ||
| 207 | /* | 207 | /* |
| 208 | * This is a bit kludgey: the simulator doesn't provide a direct way of determining | 208 | * This is a bit kludgey: the simulator doesn't provide a |
| 209 | * the disk size, so we do a binary search, assuming a maximum disk size of 4GB. | 209 | * direct way of determining the disk size, so we do a binary |
| 210 | * search, assuming a maximum disk size of 128GB. | ||
| 210 | */ | 211 | */ |
| 211 | for (bit = (4UL << 30)/512; bit != 0; bit >>= 1) { | 212 | for (bit = (128UL << 30)/512; bit != 0; bit >>= 1) { |
| 212 | req.addr = __pa(&buf); | 213 | req.addr = __pa(&buf); |
| 213 | req.len = sizeof(buf); | 214 | req.len = sizeof(buf); |
| 214 | ia64_ssc(fd, 1, __pa(&req), ((sectors | bit) - 1)*512, SSC_READ); | 215 | ia64_ssc(fd, 1, __pa(&req), ((sectors | bit) - 1)*512, SSC_READ); |
| @@ -225,8 +226,10 @@ simscsi_readwrite10 (struct scsi_cmnd *sc, int mode) | |||
| 225 | { | 226 | { |
| 226 | unsigned long offset; | 227 | unsigned long offset; |
| 227 | 228 | ||
| 228 | offset = ( (sc->cmnd[2] << 24) | (sc->cmnd[3] << 16) | 229 | offset = (((unsigned long)sc->cmnd[2] << 24) |
| 229 | | (sc->cmnd[4] << 8) | (sc->cmnd[5] << 0))*512; | 230 | | ((unsigned long)sc->cmnd[3] << 16) |
| 231 | | ((unsigned long)sc->cmnd[4] << 8) | ||
| 232 | | ((unsigned long)sc->cmnd[5] << 0))*512UL; | ||
| 230 | if (sc->use_sg > 0) | 233 | if (sc->use_sg > 0) |
| 231 | simscsi_sg_readwrite(sc, mode, offset); | 234 | simscsi_sg_readwrite(sc, mode, offset); |
| 232 | else | 235 | else |
