[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);
}
|