[Libsysio-commit] HEAD: libsysio/dev/stdfd stdfd.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2004-02-06 20:10:45
|
Update of /cvsroot/libsysio/libsysio/dev/stdfd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29990/dev/stdfd Modified Files: stdfd.c Log Message: Merging strided-IO branch + Strided-IO infrastructure. Internals altered to move data base don multiple targeted regions in both the file address space and local memory. + Added [i]{read,write}x, calls to perform extent-based or strided-IO directly. + Many bug fixes + Many uocnfig fixes + --with-zero-sum-memory; A config option that causes the shutdown code to carefully release *all* memory acquired from the heap, by the library. Useful for debugging tasks such as leak detection. Index: stdfd.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/dev/stdfd/stdfd.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -w -b -B -p -r1.7 -r1.8 --- stdfd.c 26 Jan 2004 16:34:53 -0000 1.7 +++ stdfd.c 6 Feb 2004 20:07:28 -0000 1.8 @@ -74,10 +74,8 @@ static int stdfd_open(struct pnode *pno, int flags, mode_t mode); static int stdfd_close(struct inode *ino); -static int stdfd_ipreadv(struct inode *ino, - struct ioctx *ioctx); -static int stdfd_ipwritev(struct inode *ino, - struct ioctx *ioctx); +static int stdfd_read(struct inode *ino, struct ioctx *ioctx); +static int stdfd_write(struct inode *ino, struct ioctx *ioctx); static int stdfd_iodone(struct ioctx *ioctx); static int stdfd_datasync(struct inode *ino); static int stdfd_ioctl(struct inode *ino, @@ -92,8 +90,8 @@ _sysio_stdfd_init() stdfd_operations = _sysio_nodev_ops; stdfd_operations.inop_open = stdfd_open; stdfd_operations.inop_close = stdfd_close; - stdfd_operations.inop_ipreadv = stdfd_ipreadv; - stdfd_operations.inop_ipwritev = stdfd_ipwritev; + stdfd_operations.inop_read = stdfd_read; + stdfd_operations.inop_write = stdfd_write; stdfd_operations.inop_iodone = stdfd_iodone; stdfd_operations.inop_datasync = stdfd_datasync; stdfd_operations.inop_ioctl = stdfd_ioctl; @@ -120,33 +118,27 @@ stdfd_close(struct inode *ino __IS_UNUSE } static int -doio(ssize_t (*f)(int, char *, size_t), +doio(ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, struct inode *), struct inode *ino, struct ioctx *ioctx) { - const struct iovec *iov; - size_t n; - ssize_t cc = 0; - - iov = ioctx->ioctx_iovec; - for (n = ioctx->ioctx_iovlen, iov = ioctx->ioctx_iovec; - n--; - iov++) { - if (!iov->iov_len) - continue; - cc = - (*f)(SYSIO_MINOR_DEV(ino->i_rdev), - iov->iov_base, - iov->iov_len); - if (cc <= 0) - break; - ioctx->ioctx_cc += cc; + + if (ioctx->ioctx_xtvlen != 1) { + /* + * No scatter/gather to "file" address space (we're not + * seekable) and "nowhere" makes no sense. + */ + return -EINVAL; } - if (cc < 0 && !ioctx->ioctx_cc) { + ioctx->ioctx_cc = + _sysio_doio(ioctx->ioctx_xtv, ioctx->ioctx_xtvlen, + ioctx->ioctx_iov, ioctx->ioctx_iovlen, + (ssize_t (*)(void *, size_t, _SYSIO_OFF_T, void *))f, + ino); + if (ioctx->ioctx_cc < 0) { + ioctx->ioctx_errno = -ioctx->ioctx_cc; ioctx->ioctx_cc = -1; - ioctx->ioctx_errno = -cc; } - return 0; } @@ -151,35 +143,43 @@ doio(ssize_t (*f)(int, char *, size_t), } static ssize_t -stdfd_read(int fd, char *buf, size_t nbytes) +stdfd_read_simple(void *buf, + size_t nbytes, + _SYSIO_OFF_T off __IS_UNUSED, + struct inode *ino) { + int fd = SYSIO_MINOR_DEV(ino->i_rdev); + return doread(fd, buf, nbytes); } static int -stdfd_ipreadv(struct inode *ino, - struct ioctx *ioctx) +stdfd_read(struct inode *ino, struct ioctx *ioctx) { - return doio(stdfd_read, ino, ioctx); + return doio(stdfd_read_simple, ino, ioctx); } static ssize_t -stdfd_write(int fd, - const char *buf, - size_t nbytes) +stdfd_write_simple(const void *buf, + size_t nbytes, + _SYSIO_OFF_T off __IS_UNUSED, + struct inode *ino) { + int fd = SYSIO_MINOR_DEV(ino->i_rdev); return dowrite(fd, buf, nbytes); } static int -stdfd_ipwritev(struct inode *ino, - struct ioctx *ioctx) +stdfd_write(struct inode *ino, struct ioctx *ioctx) { - return doio((ssize_t (*)(int, char *, size_t))stdfd_write, + return doio((ssize_t (*)(void *, + size_t, + _SYSIO_OFF_T, + struct inode *))stdfd_write_simple, ino, ioctx); } |