[Libsysio-commit] b_lustre: libsysio/src bypass.c Makefile.am fcntl.c iowait.c read.c write.c
Brought to you by:
lward
From: Mei <me...@us...> - 2003-06-19 12:18:32
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1:/tmp/cvs-serv28176/src Modified Files: Tag: b_lustre Makefile.am fcntl.c iowait.c read.c write.c Added Files: Tag: b_lustre bypass.c Log Message: initially add bypass mechanism, only for fcntl, read, write --- NEW FILE --- /* * bypass.c Added by Cluster File Systems * Note it's only a temporary workaround and far from complete. */ #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/uio.h> #include <sys/queue.h> #include <syscall.h> #include "sysio.h" #include "file.h" #include "inode.h" #include "bypass.h" ioid_t __bypass_ireadv(int fd, const struct iovec *iov, int count) { struct ioctx *ioctx; ssize_t ret; DEBUG("iread on unknown fd %d\n", fd); ret = syscall(SYS_readv, fd, iov, count); if (ret >= 0) { ioctx = (struct ioctx *)malloc(sizeof(*ioctx)); if (!ioctx) { ERROR("failed to alloc ioctx\n"); return IOID_FAIL; } ioctx->ioctx_id = 0; ioctx->ioctx_cc = ret; return ioctx; } DEBUG("readv error %d, errno %d\n", ret, errno); return IOID_FAIL; } ioid_t __bypass_preadv(int fd, const struct iovec *iov, int count, off_t offset) { struct ioctx *ioctx; ssize_t ret; DEBUG("pread on unknown fd %d\n", fd); if (syscall(SYS_lseek, fd, offset, SEEK_SET) < 0) { DEBUG("lseek err\n"); return IOID_FAIL; } return __bypass_ireadv(fd, iov, count); } ioid_t __bypass_iwritev(int fd, const struct iovec *iov, int count) { struct ioctx *ioctx; ssize_t ret; DEBUG("iwrite on unknown fd %d\n", fd); ret = syscall(SYS_writev, fd, iov, count); if (ret >= 0) { ioctx = (struct ioctx *)malloc(sizeof(*ioctx)); if (!ioctx) { ERROR("failed to alloc ioctx\n"); return IOID_FAIL; } ioctx->ioctx_id = 0; ioctx->ioctx_cc = ret; return ioctx; } DEBUG("writev error %d, errno %d\n", ret, errno); return IOID_FAIL; } ioid_t __bypass_pwritev(int fd, const struct iovec *iov, int count, off_t offset) { struct ioctx *ioctx; ssize_t ret; DEBUG("pwrite on unknown fd %d\n", fd); if (syscall(SYS_lseek, fd, offset, SEEK_SET) < 0) { DEBUG("lseek err\n"); return IOID_FAIL; } return __bypass_iwritev(fd, iov, count); } int __bypass_fcntl(int fd, int cmd, va_list ap) { int err; long arg; DEBUG("fcntl on unknown fd %d, cmd %d\n", fd, cmd); switch (cmd) { case F_GETFD: case F_GETFL: case F_GETOWN: // case F_GETSIG: // case F_GETLEASE: return syscall(SYS_fcntl, fd, cmd); case F_DUPFD: case F_SETFD: case F_SETFL: case F_GETLK: case F_SETLK: case F_SETLKW: case F_SETOWN: // case F_SETSIG: // case F_SETLEASE: // case F_NOTIFY: arg = va_arg(ap, long); return syscall(SYS_fcntl, fd, cmd, arg); default: ERROR("uncached cmd %d\n", cmd); } return -1; } Index: Makefile.am =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/Makefile.am,v retrieving revision 1.5 retrieving revision 1.5.4.1 diff -u -w -b -B -p -r1.5 -r1.5.4.1 --- Makefile.am 24 Mar 2003 22:09:06 -0000 1.5 +++ Makefile.am 19 Jun 2003 12:18:28 -0000 1.5.4.1 @@ -3,6 +3,6 @@ lib_LIBRARIES = libsysio.a libsysio_a_SOURCES = chdir.c chmod.c chown.c dev.c dup.c fcntl.c file.c fs.c \ fsync.c getdirentries.c init.c inode.c ioctl.c ioctx.c iowait.c \ lseek.c mkdir.c mknod.c mount.c namei.c open.c read.c rmdir.c stat.c \ - stat64.c statvfs.c symlink.c truncate.c unlink.c write.c + stat64.c statvfs.c symlink.c truncate.c unlink.c write.c bypass.c include $(top_srcdir)/Rules.make Index: fcntl.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/fcntl.c,v retrieving revision 1.3.2.2 retrieving revision 1.3.2.3 diff -u -w -b -B -p -r1.3.2.2 -r1.3.2.3 --- fcntl.c 17 Jun 2003 03:38:31 -0000 1.3.2.2 +++ fcntl.c 19 Jun 2003 12:18:29 -0000 1.3.2.3 @@ -51,6 +51,7 @@ #include "sysio.h" #include "inode.h" #include "file.h" +#include "bypass.h" int fcntl(int fd, int cmd, ...) @@ -62,18 +63,10 @@ fcntl(int fd, int cmd, ...) err = 0; fil = _sysio_fd_find(fd); if (!fil) { -#if 1 - /* FIXME temorary solution to get IOR2 run. cleanup this - * later */ - printf("libsysio: fcntl on unknown fd %d\n", fd); va_start(ap, cmd); - err = syscall(SYS_fcntl, fd, cmd, ap); + err = __bypass_fcntl(fd, cmd, ap); va_end(ap); return err; -#else - err = -EBADF; - goto out; -#endif } switch (cmd) { Index: iowait.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/iowait.c,v retrieving revision 1.3 retrieving revision 1.3.8.1 diff -u -w -b -B -p -r1.3 -r1.3.8.1 --- iowait.c 9 Mar 2003 06:25:45 -0000 1.3 +++ iowait.c 19 Jun 2003 12:18:29 -0000 1.3.8.1 @@ -90,9 +90,18 @@ iowait(ioid_t ioid) struct ioctx *ioctx; ssize_t cc; + /* check if it's a bypassed ioctx */ + ioctx = (struct ioctx *)ioid; + if (ioctx->ioctx_id == 0) { + cc = ioctx->ioctx_cc; + free(ioctx); + return cc; + } + ioctx = lookup_ioid(ioid); - if (!ioctx) + if (!ioctx) { return -1; + } cc = _sysio_ioctx_wait(ioctx); if (cc < 0) { Index: read.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/read.c,v retrieving revision 1.2.8.1 retrieving revision 1.2.8.2 diff -u -w -b -B -p -r1.2.8.1 -r1.2.8.2 --- read.c 17 Jun 2003 03:38:31 -0000 1.2.8.1 +++ read.c 19 Jun 2003 12:18:29 -0000 1.2.8.2 @@ -53,6 +53,7 @@ #include "sysio.h" #include "file.h" #include "inode.h" +#include "bypass.h" /* * Schedule asynchronous read of iovec at some file extent. @@ -100,12 +101,11 @@ ipreadv(int fd, const struct iovec *iov, { struct file *fil; struct ioctx *ioctxp; + int i; fil = _sysio_fd_find(fd); - if (!fil) { - errno = -EBADF; - return IOID_FAIL; - } + if (!fil) + return __bypass_preadv(fd, iov, count, offset); ioctxp = do_ipreadv(fil, iov, count, offset); return ioctxp ? ioctxp->ioctx_id : IOID_FAIL; @@ -164,21 +164,8 @@ ireadv(int fd, const struct iovec *iov, struct ioctx *ioctxp; fil = _sysio_fd_find(fd); - if (!fil) { -#if 1 - /* XXX for MPI */ - printf("libsysio: read on unknown fd %d\n", fd); - if (syscall(SYS_readv, fd, iov, count) < 0) - return IOID_FAIL; - else { - /* XXX */ - return (ioid_t)IOID_NATIVE_DIRECT; - } -#else - errno = -EBADF; - return IOID_FAIL; -#endif - } + if (!fil) + return __bypass_ireadv(fd, iov, count); ioctxp = do_ipreadv(fil, iov, count, fil->f_pos); if (!ioctxp) @@ -208,14 +195,6 @@ readv(int fd, const struct iovec *iov, i ioid = ireadv(fd, iov, count); if (ioid == IOID_FAIL) return -1; - /* XXX for MPI. suppose we'v got all the data we want */ - if (ioid == (ioid_t)IOID_NATIVE_DIRECT) { - ssize_t ret = 0; - int i; - for (i=0; i<count; i++) - ret += iov[i].iov_len; - return ret; - } return iowait(ioid); } @@ -227,9 +206,6 @@ read(int fd, void *buf, size_t count) ioid = iread(fd, buf, count); if (ioid == IOID_FAIL) return -1; - /* XXX for MPI. suppose we'v got all the data we want */ - if (ioid == (ioid_t)IOID_NATIVE_DIRECT) - return count; return iowait(ioid); } Index: write.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/write.c,v retrieving revision 1.2.10.1 retrieving revision 1.2.10.2 diff -u -w -b -B -p -r1.2.10.1 -r1.2.10.2 --- write.c 17 Jun 2003 03:38:31 -0000 1.2.10.1 +++ write.c 19 Jun 2003 12:18:29 -0000 1.2.10.2 @@ -55,6 +55,7 @@ #include "inode.h" #include "fs.h" #include "mount.h" +#include "bypass.h" /* * Schedule asynchronous write of iovec at some file extent. @@ -108,10 +109,8 @@ ipwritev(int fd, const struct iovec *iov struct ioctx *ioctxp; fil = _sysio_fd_find(fd); - if (!fil) { - errno = -EBADF; - return IOID_FAIL; - } + if (!fil) + return __bypass_pwritev(fd, iov, count, offset); ioctxp = do_ipwritev(fil, iov, count, offset); return ioctxp ? ioctxp->ioctx_id : IOID_FAIL; @@ -170,21 +168,8 @@ iwritev(int fd, const struct iovec *iov, struct ioctx *ioctxp; fil = _sysio_fd_find(fd); - if (!fil) { -#if 1 - /* XXX for MPI */ - printf("libsysio: write on unknown fd %d\n", fd); - if (syscall(SYS_writev, fd, iov, count) < 0) - return IOID_FAIL; - else { - /* XXX */ - return (ioid_t)IOID_NATIVE_DIRECT; - } -#else - errno = -EBADF; - return IOID_FAIL; -#endif - } + if (!fil) + return __bypass_iwritev(fd, iov, count); ioctxp = do_ipwritev(fil, iov, count, fil->f_pos); if (!ioctxp) @@ -214,14 +199,6 @@ writev(int fd, const struct iovec *iov, ioid = iwritev(fd, iov, count); if (ioid == IOID_FAIL) return -1; - /* XXX for MPI. suppose all data we want has been written out */ - if (ioid == (ioid_t)IOID_NATIVE_DIRECT) { - ssize_t ret = 0; - int i; - for (i=0; i<count; i++) - ret += iov[i].iov_len; - return ret; - } return iowait(ioid); } @@ -233,9 +210,6 @@ write(int fd, const void *buf, size_t co ioid = iwrite(fd, buf, count); if (ioid == IOID_FAIL) return -1; - /* XXX for MPI. suppose all data we want has been written out */ - if (ioid == (ioid_t)IOID_NATIVE_DIRECT) - return count; return iowait(ioid); } |