[Libsysio-commit] HEAD: libsysio/src dev.c inode.c lseek.c
Brought to you by:
lward
|
From: Lee W. <lw...@us...> - 2004-04-16 20:38:43
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30430/src Modified Files: dev.c inode.c lseek.c Log Message: New operation for the drivers to implement -- take note! The drivers now need to implement inop_pos which takes an inode and a _SYSIO_OFF_T and should return the resulting position as though it were lseek(FD2INO(fd), off, SEEK_SET). As usual a negative return value is the negated errno. Lseek is altered to use this. Changes in fs_native.c to utilize pread/pwrite whenever positioning is required instead of an lseek/io-op pair of calls. This addresses a race to yod. Index: dev.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/dev.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -w -b -B -p -r1.6 -r1.7 --- dev.c 6 Feb 2004 20:07:30 -0000 1.6 +++ dev.c 16 Apr 2004 20:38:34 -0000 1.7 @@ -68,6 +68,7 @@ const struct inode_ops _sysio_nodev_ops _sysio_nodev_inop_rename, _sysio_nodev_inop_read, _sysio_nodev_inop_write, + _sysio_nodev_inop_pos, _sysio_nodev_inop_iodone, _sysio_nodev_inop_fcntl, _sysio_nodev_inop_sync, @@ -169,17 +170,3 @@ _sysio_dev_lookup(mode_t mode, dev_t dev return &devtbl[major].dev_ops; } - -int -_sysio_dev_illop() -{ - - abort(); -} - -void -_sysio_dev_noop() -{ - - return; -} Index: inode.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/inode.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -w -b -B -p -r1.14 -r1.15 --- inode.c 24 Feb 2004 14:58:26 -0000 1.14 +++ inode.c 16 Apr 2004 20:38:34 -0000 1.15 @@ -875,3 +875,83 @@ _sysio_setattr(struct pnode *pno, ino = pno->p_base->pb_ino; return (*ino->i_ops.inop_setattr)(pno, ino, mask, stbuf); } + +/* + * Do nothing. + */ +void +_sysio_do_noop() +{ + + return; +} + +/* + * Abort. + */ +void +_sysio_do_illop() +{ + + abort(); +} + +/* + * Return -EBADF + */ +int +_sysio_do_ebadf() +{ + + return -EBADF; +} + +/* + * Return -EINVAL + */ +int +_sysio_do_einval() +{ + + return -EINVAL; +} + +/* + * Return -ENOENT + */ +int +_sysio_do_enoent() +{ + + return -ENOENT; +} + +/* + * Return -ESPIPE + */ +int +_sysio_do_espipe() +{ + + return -ESPIPE; +} + +/* + * Return -EISDIR + */ +int +_sysio_do_eisdir() +{ + + return -EISDIR; +} + +/* + * Return -ENOSYS + */ +int +_sysio_do_enosys() +{ + + return -ENOSYS; +} Index: lseek.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/lseek.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -w -b -B -p -r1.14 -r1.15 --- lseek.c 18 Mar 2004 14:34:18 -0000 1.14 +++ lseek.c 16 Apr 2004 20:38:34 -0000 1.15 @@ -101,6 +101,10 @@ _sysio_lseek(int fd, _SYSIO_OFF_T offset if (pos >= _SYSIO_OFF_T_MAX) return -EOVERFLOW; #endif + pos = (fil->f_ino->i_ops.inop_pos)(fil->f_ino, pos); + if (pos < 0) + return pos; + return fil->f_pos = pos; } |