[Libsysio-commit] HEAD: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2004-02-06 20:10:45
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29990/drivers/incore Modified Files: fs_incore.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: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -w -b -B -p -r1.12 -r1.13 --- fs_incore.c 12 Jan 2004 18:06:11 -0000 1.12 +++ fs_incore.c 6 Feb 2004 20:07:29 -0000 1.13 @@ -142,10 +142,8 @@ static int _sysio_incore_inop_close(stru static int _sysio_incore_dirop_link(struct pnode *old, struct pnode *new); static int _sysio_incore_dirop_unlink(struct pnode *pno); static int _sysio_incore_dirop_rename(struct pnode *old, struct pnode *new); -static int _sysio_incore_filop_ipreadv(struct inode *ino, - struct ioctx *ioctx); -static int _sysio_incore_filop_ipwritev(struct inode *ino, - struct ioctx *ioctx); +static int _sysio_incore_filop_read(struct inode *ino, struct ioctx *ioctx); +static int _sysio_incore_filop_write(struct inode *ino, struct ioctx *ioctx); static int _sysio_incore_filop_iodone(struct ioctx *ioctx); static int _sysio_incore_filop_fcntl(struct inode *ino, int cmd, va_list ap); static int _sysio_incore_inop_sync(struct inode *ino); @@ -168,10 +166,10 @@ static void _sysio_incore_illop(void); (int (*)(struct pnode *, const char *))_sysio_incore_e_nosys #define _sysio_incore_dirop_readlink \ (int (*)(struct pnode *, char *, size_t))_sysio_incore_e_inval -#define _sysio_incore_dirop_ipreadv \ +#define _sysio_incore_dirop_read \ (int (*)(struct inode *, \ struct ioctx *))_sysio_incore_e_isdir -#define _sysio_incore_dirop_ipwritev \ +#define _sysio_incore_dirop_write \ (int (*)(struct inode *, \ struct ioctx *))_sysio_incore_e_isdir #define _sysio_incore_dirop_iodone \ @@ -197,8 +195,8 @@ static struct inode_ops _sysio_incore_di _sysio_incore_dirop_link, _sysio_incore_dirop_unlink, _sysio_incore_dirop_rename, - _sysio_incore_dirop_ipreadv, - _sysio_incore_dirop_ipwritev, + _sysio_incore_dirop_read, + _sysio_incore_dirop_write, _sysio_incore_dirop_iodone, _sysio_incore_dirop_fcntl, _sysio_incore_inop_sync, @@ -252,8 +250,8 @@ static struct inode_ops _sysio_incore_fi _sysio_incore_filop_link, _sysio_incore_filop_unlink, _sysio_incore_filop_rename, - _sysio_incore_filop_ipreadv, - _sysio_incore_filop_ipwritev, + _sysio_incore_filop_read, + _sysio_incore_filop_write, _sysio_incore_filop_iodone, _sysio_incore_filop_fcntl, _sysio_incore_inop_sync, @@ -280,8 +278,8 @@ static struct inode_ops _sysio_incore_de _sysio_incore_filop_link, _sysio_incore_filop_unlink, _sysio_incore_filop_rename, - _sysio_nodev_inop_ipreadv, - _sysio_nodev_inop_ipwritev, + _sysio_nodev_inop_read, + _sysio_nodev_inop_write, _sysio_nodev_inop_iodone, _sysio_incore_filop_fcntl, _sysio_incore_inop_sync, @@ -622,6 +620,8 @@ _sysio_incore_fsswop_mount(const char *s /* * Create root for system. + * + * Persistent across remounts because we ask for immunity. */ rooti = _sysio_i_new(fs, @@ -1153,6 +1153,8 @@ _sysio_incore_dirop_mkdir(struct pnode * /* * Tell the system about the new inode. + * + * Persistent across remounts because we ask for immunity. */ ino = _sysio_i_new(pno->p_parent->p_base->pb_ino->i_fs, @@ -1474,34 +1476,20 @@ _sysio_incore_dirop_unlink(struct pnode } static int -incore_doio(ssize_t (*f)(struct incore_inode *, off_t, char *, size_t), +doio(ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, struct incore_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)(I2IC(ino), - ioctx->ioctx_offset, - iov->iov_base, - iov->iov_len); - if (cc <= 0) - break; - ioctx->ioctx_cc += cc; - } - 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, + I2IC(ino)); + if (ioctx->ioctx_cc < 0) { + ioctx->ioctx_errno = -ioctx->ioctx_cc; ioctx->ioctx_cc = -1; - ioctx->ioctx_errno = -cc; } - ioctx->ioctx_done = 1; return 0; @@ -1508,63 +1496,70 @@ incore_doio(ssize_t (*f)(struct incore_i } static ssize_t -incore_read(struct incore_inode *icino, off_t off, char *buf, size_t nbytes) +incore_read(void *buf, size_t nbytes, + _SYSIO_OFF_T off, + struct incore_inode *icino) { - _SYSIO_OFF_T n; + size_t n; + if (off < 0) + return -EINVAL; if (!nbytes || off > icino->ici_st.st_size) return 0; - n = (_SYSIO_OFF_T )nbytes; - if (!(n > 0 && (size_t )n == nbytes)) - return -EINVAL; - if (n > icino->ici_st.st_size - off) - n = icino->ici_st.st_size - off; + n = icino->ici_st.st_size - (size_t )off; + if (n > nbytes) + n = nbytes; (void )memcpy(buf, icino->ici_data + off, (size_t )n); return (ssize_t )n; } static int -_sysio_incore_filop_ipreadv(struct inode *ino, - struct ioctx *ioctx) +_sysio_incore_filop_read(struct inode *ino, struct ioctx *ioctx) { - return incore_doio(incore_read, ino, ioctx); + + return doio(incore_read, ino, ioctx); } static ssize_t -incore_write(struct incore_inode *icino, - off_t off, - const char *buf, - size_t nbytes) +incore_write(const void *buf, size_t nbytes, + _SYSIO_OFF_T off, + struct incore_inode *icino) { - int err; - _SYSIO_OFF_T n; + _SYSIO_OFF_T pos; - if (!nbytes) - return 0; - n = (_SYSIO_OFF_T )nbytes; - if (!(n > 0 && (size_t )n == nbytes)) + if (off < 0) return -EINVAL; - if (off + n > icino->ici_st.st_size) { - err = incore_trunc(icino, (size_t )(off + n), 0); + if (!nbytes || off > icino->ici_st.st_size) + return 0; + pos = off + nbytes; + if (off && pos <= off) { + /* + * It's all or nothing. We won't write just part of + * the buffer. + */ + return -EFBIG; + } + if (pos > icino->ici_st.st_size) { + int err; + + err = incore_trunc(icino, (size_t )pos, 0); if (err) return err; } - (void )memcpy(icino->ici_data + off, buf, (size_t )n); + (void )memcpy(icino->ici_data + off, buf, nbytes); - return (ssize_t )n; + return (ssize_t )nbytes; } static int -_sysio_incore_filop_ipwritev(struct inode *ino, - struct ioctx *ioctx) +_sysio_incore_filop_write(struct inode *ino, struct ioctx *ioctx) { - return incore_doio((ssize_t (*)(struct incore_inode *, - off_t, - char *, - size_t))incore_write, + return doio((ssize_t (*)(void *, size_t, + _SYSIO_OFF_T, + struct incore_inode *))incore_write, ino, ioctx); } |