From: Ben Gras Date: Tue, 24 Apr 2007 13:27:33 +0000 (+0000) Subject: . readall: use lseek64() to read more than 4GB of a device X-Git-Tag: v3.1.4~393 X-Git-Url: http://zhaoyanbai.com/repos/%22/xml/v3/zones/static/man.7.txt?a=commitdiff_plain;h=8eb09f6ddc32584a90ac36b4c3e273e6a15207c7;p=minix.git . readall: use lseek64() to read more than 4GB of a device . vfs: 64-bit offset support for character device i/o (also remove unused dev_bio function) . memory: /dev/null and /dev/zero are infinitely large, don't stop reading/writing at 4GB --- diff --git a/commands/simple/readall.c b/commands/simple/readall.c index 5b8fd65a0..1b935884c 100755 --- a/commands/simple/readall.c +++ b/commands/simple/readall.c @@ -124,8 +124,8 @@ char *argv[]; /* Read the entire file. Try it in large chunks, but if an error * occurs, go to single reads for a while. */ while (1) { - if(lseek(fd, BLOCK_SIZE * b, SEEK_SET) < 0) { - perror("lseek"); + if(lseek64(fd, mul64u(BLOCK_SIZE, b), SEEK_SET, NULL) < 0) { + perror("lseek64"); return 1; } s = read(fd, a, BLOCK_SIZE * chunk); diff --git a/drivers/memory/memory.c b/drivers/memory/memory.c index f6564d697..d5b9af796 100644 --- a/drivers/memory/memory.c +++ b/drivers/memory/memory.c @@ -148,7 +148,8 @@ int safe; /* safe copies */ return EPERM; } - if (ex64hi(pos64) != 0) + /* ZERO_DEV and NULL_DEV are infinite in size. */ + if (m_device != ZERO_DEV && m_device != NULL_DEV && ex64hi(pos64) != 0) return OK; /* Beyond EOF */ position= cv64ul(pos64); diff --git a/servers/vfs/device.c b/servers/vfs/device.c index 1f0f94836..37f68c91b 100644 --- a/servers/vfs/device.c +++ b/servers/vfs/device.c @@ -37,7 +37,7 @@ FORWARD _PROTOTYPE( int safe_io_conversion, (endpoint_t, cp_grant_id_t *, int *, cp_grant_id_t *, int, endpoint_t *, - void **, int *, vir_bytes, off_t *)); + void **, int *, vir_bytes, u32_t *)); FORWARD _PROTOTYPE( void safe_io_cleanup, (cp_grant_id_t, cp_grant_id_t *, int)); @@ -170,7 +170,7 @@ PUBLIC void dev_status(message *m) * safe_io_conversion * *===========================================================================*/ PRIVATE int safe_io_conversion(driver, gid, op, gids, gids_size, - io_ept, buf, vec_grants, bytes, pos) + io_ept, buf, vec_grants, bytes, pos_lo) endpoint_t driver; cp_grant_id_t *gid; int *op; @@ -180,7 +180,7 @@ endpoint_t *io_ept; void **buf; int *vec_grants; vir_bytes bytes; -off_t *pos; +u32_t *pos_lo; { int access = 0, size; int j; @@ -242,7 +242,7 @@ off_t *pos; *buf = new_iovec; break; case VFS_DEV_IOCTL: - *pos = *io_ept; /* Old endpoint in POSITION field. */ + *pos_lo = *io_ept; /* Old endpoint in POSITION field. */ *op = DEV_IOCTL_S; if(_MINIX_IOCTL_IOR(m_in.REQUEST)) access |= CPF_WRITE; if(_MINIX_IOCTL_IOW(m_in.REQUEST)) access |= CPF_READ; @@ -303,6 +303,7 @@ int gids_size; return; } +#if 0 /*===========================================================================* * dev_bio * *===========================================================================*/ @@ -420,22 +421,23 @@ int bytes; /* how many bytes to transfer */ return(m.REP_STATUS); } } +#endif /*===========================================================================* * dev_io * *===========================================================================*/ -PUBLIC int dev_io(op, dev, proc_e, buf, posX, bytes, flags) +PUBLIC int dev_io(op, dev, proc_e, buf, pos, bytes, flags) int op; /* DEV_READ, DEV_WRITE, DEV_IOCTL, etc. */ dev_t dev; /* major-minor device number */ int proc_e; /* in whose address space is buf? */ void *buf; /* virtual address of the buffer */ -u64_t posX; /* byte position */ +u64_t pos; /* byte position */ int bytes; /* how many bytes to transfer */ int flags; /* special flags, like O_NONBLOCK */ { /* Read or write from a device. The parameter 'dev' tells which one. */ struct dmap *dp; - off_t pos; + u32_t pos_lo, pos_high; message dev_mess; cp_grant_id_t gid = GRANT_INVALID; static cp_grant_id_t gids[NR_IOREQS]; @@ -443,9 +445,8 @@ int flags; /* special flags, like O_NONBLOCK */ void *buf_used; endpoint_t ioproc; - if (ex64hi(posX) != 0) - panic(__FILE__, "dev_io: postition too high", NO_NUM); - pos= ex64lo(posX); + pos_lo= ex64lo(pos); + pos_high= ex64hi(pos); /* Determine task dmap. */ dp = &dmap[(dev >> MAJOR) & BYTE]; @@ -471,7 +472,7 @@ int flags; /* special flags, like O_NONBLOCK */ buf_used = buf; safe = safe_io_conversion(dp->dmap_driver, &gid, &op, gids, NR_IOREQS, &dev_mess.IO_ENDPT, &buf_used, - &vec_grants, bytes, &pos); + &vec_grants, bytes, &pos_lo); if(buf != buf_used) panic(__FILE__,"dev_io: safe_io_conversion changed buffer", NO_NUM); @@ -484,9 +485,9 @@ int flags; /* special flags, like O_NONBLOCK */ /* Set up the rest of the message passed to task. */ dev_mess.m_type = op; dev_mess.DEVICE = (dev >> MINOR) & BYTE; - dev_mess.POSITION = pos; + dev_mess.POSITION = pos_lo; dev_mess.COUNT = bytes; - dev_mess.HIGHPOS = 0; + dev_mess.HIGHPOS = pos_high; /* This will be used if the i/o is suspended. */ ioproc = dev_mess.IO_ENDPT;