[Libsysio-commit] HEAD: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2008-12-06 23:29:01
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv8263 Modified Files: fs_incore.c Log Message: Ported to the new pnode-only infrastructure changes. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -w -b -B -p -r1.35 -r1.36 --- fs_incore.c 24 Sep 2007 19:00:02 -0000 1.35 +++ fs_incore.c 6 Dec 2008 23:28:55 -0000 1.36 @@ -96,9 +96,16 @@ struct incore_inode { #define I2IC(ino) ((struct incore_inode *)(ino)->i_private) struct incore_filesys { + ino_t icfs_nxtnum; /* next inum */ LIST_HEAD(, incore_inode) icfs_icinodes; /* all i-nodes list */ }; +#define ICFS_INIT(_icfs) \ + do { \ + (_icfs)->icfs_nxtnum = 1; \ + LIST_INIT(&(_icfs)->icfs_icinodes); \ + } while (0) + /* * Given pointer to filesys, return pointer to incore-filesys. */ @@ -125,38 +132,35 @@ static int _sysio_incore_dirop_lookup(st struct intent *intnt, const char *path); static int _sysio_incore_inop_getattr(struct pnode *pno, - struct inode *ino, struct intnl_stat *stbuf); static int _sysio_incore_inop_setattr(struct pnode *pno, - struct inode *ino, unsigned mask, struct intnl_stat *stbuf); -static ssize_t _sysio_incore_dirop_filldirentries(struct inode *ino, +static ssize_t _sysio_incore_dirop_filldirentries(struct pnode *pno, _SYSIO_OFF_T *posp, char *buf, size_t nbytes); static int _sysio_incore_dirop_mkdir(struct pnode *pno, mode_t mode); static int _sysio_incore_dirop_rmdir(struct pnode *pno); static int _sysio_incore_inop_open(struct pnode *pno, int flags, mode_t mode); -static int _sysio_incore_inop_close(struct inode *ino); +static int _sysio_incore_inop_close(struct pnode *pno); 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_read(struct inode *ino, struct ioctx *ioctx); -static int _sysio_incore_filop_write(struct inode *ino, struct ioctx *ioctx); -static _SYSIO_OFF_T _sysio_incore_filop_pos(struct inode *ino, +static int _sysio_incore_filop_read(struct ioctx *ioctx); +static int _sysio_incore_filop_write(struct ioctx *ioctx); +static _SYSIO_OFF_T _sysio_incore_filop_pos(struct pnode *pno, _SYSIO_OFF_T off); static int _sysio_incore_filop_iodone(struct ioctx *ioctx); -static int _sysio_incore_filop_fcntl(struct inode *ino, +static int _sysio_incore_filop_fcntl(struct pnode *pno, int cmd, va_list ap, int *rtn); -static int _sysio_incore_inop_sync(struct inode *ino); -static int _sysio_incore_filop_ioctl(struct inode *ino, +static int _sysio_incore_inop_sync(struct pnode *pno); +static int _sysio_incore_filop_ioctl(struct pnode *pno, unsigned long int request, va_list ap); static int _sysio_incore_dirop_mknod(struct pnode *pno, mode_t mode, dev_t dev); #ifdef _HAVE_STATVFS static int _sysio_incore_inop_statvfs(struct pnode *pno, - struct inode *ino, struct intnl_statvfs *buf); #endif static void _sysio_incore_inop_gone(struct inode *ino); @@ -166,20 +170,18 @@ static void _sysio_incore_inop_gone(stru #define _sysio_incore_dirop_readlink \ (int (*)(struct pnode *, char *, size_t))_sysio_do_enosys #define _sysio_incore_dirop_read \ - (int (*)(struct inode *, \ - struct ioctx *))_sysio_do_eisdir + (int (*)(struct ioctx *))_sysio_do_eisdir #define _sysio_incore_dirop_write \ - (int (*)(struct inode *, \ - struct ioctx *))_sysio_do_eisdir + (int (*)(struct ioctx *))_sysio_do_eisdir #define _sysio_incore_dirop_pos \ - (_SYSIO_OFF_T (*)(struct inode *, \ + (_SYSIO_OFF_T (*)(struct pnode *, \ _SYSIO_OFF_T))_sysio_do_eisdir #define _sysio_incore_dirop_iodone \ (int (*)(struct ioctx *))_sysio_do_illop #define _sysio_incore_dirop_fcntl \ - (int (*)(struct inode *, int, va_list, int *))_sysio_do_eisdir + (int (*)(struct pnode *, int, va_list, int *))_sysio_do_eisdir #define _sysio_incore_dirop_ioctl \ - (int (*)(struct inode *, \ + (int (*)(struct pnode *, \ unsigned long int, \ va_list))_sysio_do_eisdir @@ -217,7 +219,7 @@ static int _sysio_incore_filop_lookup(st struct intent *intnt, const char *path); #define _sysio_incore_filop_filldirentries \ - (ssize_t (*)(struct inode *, \ + (ssize_t (*)(struct pnode *, \ _SYSIO_OFF_T *, \ char *, \ size_t))_sysio_do_illop @@ -398,12 +400,11 @@ _sysio_incore_init() } static ino_t -incore_inum_alloc() +incore_inum_alloc(struct incore_filesys *icfs) { - static ino_t nxtnum = 1; - assert(nxtnum); - return nxtnum++; + assert(icfs->icfs_nxtnum); + return icfs->icfs_nxtnum++; } static struct incore_inode * @@ -596,15 +597,14 @@ _sysio_incore_fsswop_mount(const char *s err = -ENOMEM; goto error; } - (void )memset(icfs, 0, sizeof(struct incore_filesys)); - LIST_INIT(&icfs->icfs_icinodes); + ICFS_INIT(icfs); /* * Create root i-node. */ (void )memset(&stat, 0, sizeof(stat)); stat.st_dev = dev; - inum = incore_inum_alloc(); + inum = incore_inum_alloc(icfs); #ifdef HAVE__ST_INO stat.__st_ino = inum; #endif @@ -654,6 +654,8 @@ _sysio_incore_fsswop_mount(const char *s */ mnt = NULL; err = _sysio_mounti(fs, rooti, flags, tocover, &mnt); + I_PUT(rooti); + rooti = NULL; if (err) goto error; @@ -891,28 +893,25 @@ _sysio_incore_filop_lookup(struct pnode static int _sysio_incore_inop_getattr(struct pnode *pno, - struct inode *ino, struct intnl_stat *stbuf) { struct incore_inode *icino; - if (!ino) - ino = pno->p_base->pb_ino; - icino = I2IC(ino); + assert(pno->p_base->pb_ino); + icino = I2IC(pno->p_base->pb_ino); *stbuf = icino->ici_st; return 0; } static int _sysio_incore_inop_setattr(struct pnode *pno, - struct inode *ino, unsigned mask, struct intnl_stat *stbuf) { + struct inode *ino; struct incore_inode *icino; int err; - if (!ino) ino = pno->p_base->pb_ino; if (!ino) return -EBADF; @@ -988,16 +987,18 @@ incore_directory_enumerate(struct intnl_ } static ssize_t -_sysio_incore_dirop_filldirentries(struct inode *ino, +_sysio_incore_dirop_filldirentries(struct pnode *pno, _SYSIO_OFF_T *posp, char *buf, size_t nbytes) { - struct incore_inode *icino = I2IC(ino); + struct incore_inode *icino; off_t off; struct intnl_dirent *de; struct copy_info copy_info; + assert(pno->p_base->pb_ino); + icino = I2IC(pno->p_base->pb_ino); if (*posp >= icino->ici_st.st_size) return 0; @@ -1172,7 +1173,7 @@ _sysio_incore_dirop_mkdir(struct pnode * (void )memset(&stat, 0, sizeof(stat)); stat.st_dev = pno->p_parent->p_base->pb_ino->i_fs->fs_dev; - inum = incore_inum_alloc(); + inum = incore_inum_alloc(FS2ICFS(ino->i_fs)); #ifdef HAVE__ST_INO stat.__st_ino = inum; #endif @@ -1222,7 +1223,7 @@ _sysio_incore_dirop_mkdir(struct pnode * return err; } - pno->p_base->pb_ino = ino; + I_PUT(ino); return 0; } @@ -1295,7 +1296,6 @@ _sysio_incore_dirop_rmdir(struct pnode * if (icino->ici_st.st_nlink > 2) return -ENOTEMPTY; - pno->p_base->pb_ino = NULL; err = incore_unlink_entry(I2IC(pno->p_parent->p_base->pb_ino), &pno->p_base->pb_key.pbk_name); @@ -1347,7 +1347,7 @@ incore_create(struct pnode *pno, struct return err; } - pno->p_base->pb_ino = ino; + I_PUT(ino); return 0; } @@ -1368,7 +1368,7 @@ _sysio_incore_inop_open(struct pnode *pn */ (void )memset(&stat, 0, sizeof(stat)); stat.st_dev = pno->p_parent->p_base->pb_ino->i_fs->fs_dev; - inum = incore_inum_alloc(); + inum = incore_inum_alloc(FS2ICFS(pno->p_parent->p_base->pb_ino->i_fs)); #ifdef HAVE__ST_INO stat.__st_ino = inum; #endif @@ -1387,7 +1387,7 @@ _sysio_incore_inop_open(struct pnode *pn } static int -_sysio_incore_inop_close(struct inode *ino __IS_UNUSED) +_sysio_incore_inop_close(struct pnode *pno __IS_UNUSED) { return 0; @@ -1496,7 +1496,6 @@ _sysio_incore_dirop_unlink(struct pnode static int doio(ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, struct incore_inode *), - struct inode *ino, struct ioctx *ioctx) { @@ -1504,7 +1503,7 @@ doio(ssize_t (*f)(void *, size_t, _SYSIO _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)); + I2IC(ioctx->ioctx_pno->p_base->pb_ino)); if (ioctx->ioctx_cc < 0) { ioctx->ioctx_errno = -ioctx->ioctx_cc; ioctx->ioctx_cc = -1; @@ -1534,11 +1533,11 @@ incore_read(void *buf, size_t nbytes, } static int -_sysio_incore_filop_read(struct inode *ino, struct ioctx *ioctx) +_sysio_incore_filop_read(struct ioctx *ioctx) { - return doio(incore_read, ino, ioctx); + return doio(incore_read, ioctx); } static ssize_t @@ -1573,18 +1572,17 @@ incore_write(const void *buf, size_t nby } static int -_sysio_incore_filop_write(struct inode *ino, struct ioctx *ioctx) +_sysio_incore_filop_write(struct ioctx *ioctx) { return doio((ssize_t (*)(void *, size_t, _SYSIO_OFF_T, struct incore_inode *))incore_write, - ino, ioctx); } static _SYSIO_OFF_T -_sysio_incore_filop_pos(struct inode *ino __IS_UNUSED, _SYSIO_OFF_T off) +_sysio_incore_filop_pos(struct pnode *pno __IS_UNUSED, _SYSIO_OFF_T off) { return off; @@ -1601,7 +1599,7 @@ _sysio_incore_filop_iodone(struct ioctx } static int -_sysio_incore_filop_fcntl(struct inode *ino __IS_UNUSED, +_sysio_incore_filop_fcntl(struct pnode *pno __IS_UNUSED, int cmd __IS_UNUSED, va_list ap __IS_UNUSED, int *rtn) @@ -1615,7 +1613,7 @@ _sysio_incore_filop_fcntl(struct inode * } static int -_sysio_incore_inop_sync(struct inode *ino __IS_UNUSED) +_sysio_incore_inop_sync(struct pnode *pno __IS_UNUSED) { /* @@ -1625,7 +1623,7 @@ _sysio_incore_inop_sync(struct inode *in } static int -_sysio_incore_filop_ioctl(struct inode *ino __IS_UNUSED, +_sysio_incore_filop_ioctl(struct pnode *pno __IS_UNUSED, unsigned long int request __IS_UNUSED, va_list ap __IS_UNUSED) { @@ -1662,7 +1660,7 @@ _sysio_incore_dirop_mknod(struct pnode * */ (void )memset(&stat, 0, sizeof(stat)); stat.st_dev = pno->p_parent->p_base->pb_ino->i_fs->fs_dev; - inum = incore_inum_alloc(); + inum = incore_inum_alloc(FS2ICFS(pno->p_parent->p_base->pb_ino->i_fs)); #ifdef HAVE__ST_INO stat.__st_ino = inum; #endif @@ -1683,7 +1681,6 @@ _sysio_incore_dirop_mknod(struct pnode * #ifdef _HAVE_STATVFS static int _sysio_incore_inop_statvfs(struct pnode *pno, - struct inode *ino __IS_UNUSED, struct intnl_statvfs *buf) { struct filesys *fs; |