[Libsysio-commit] HEAD: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2008-12-06 22:16:43
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv26562/drivers/incore Modified Files: fs_incore.c Log Message: In do_mnt(), must put the directory being covered whether the mount succeded or not. Fixed. 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 21:56:25 -0000 1.36 @@ -125,38 +125,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 +163,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 +212,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 @@ -497,7 +492,6 @@ incore_directory_new(struct incore_files &incore_dir_template, sizeof(incore_dir_template)); de = icino->ici_data; - de->d_ino = st->st_ino; de = (struct intnl_dirent *)((char *)de + #ifdef _DIRENT_HAVE_D_OFF @@ -506,7 +500,7 @@ incore_directory_new(struct incore_files de->d_reclen #endif ); - de->d_ino = parent->ici_st.st_ino; + de->d_ino = st->st_ino; /* * Set creation time to modify time set by truncate. @@ -656,6 +650,7 @@ _sysio_incore_fsswop_mount(const char *s err = _sysio_mounti(fs, rooti, flags, tocover, &mnt); if (err) goto error; + I_PUT(rooti); *mntp = mnt; @@ -665,7 +660,7 @@ error: if (mnt && _sysio_do_unmount(mnt) != 0) abort(); if (rooti) - I_RELE(rooti); + I_PUT(rooti); if (fs) { FS_RELE(fs); goto out; @@ -891,32 +886,26 @@ _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); + 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 incore_inode *icino; int err; - if (!ino) - ino = pno->p_base->pb_ino; - if (!ino) + if (!pno->p_base->pb_ino) return -EBADF; - icino = I2IC(ino); + icino = I2IC(pno->p_base->pb_ino); err = 0; if (mask & SETATTR_LEN) { @@ -939,7 +928,7 @@ _sysio_incore_inop_setattr(struct pnode icino->ici_st.st_gid = stbuf->st_gid; icino->ici_st.st_ctime = time(NULL); - ino->i_stbuf = icino->ici_st; + pno->p_base->pb_ino->i_stbuf = icino->ici_st; out: return err; } @@ -988,12 +977,12 @@ 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 = I2IC(pno->p_base->pb_ino); off_t off; struct intnl_dirent *de; struct copy_info copy_info; @@ -1220,9 +1209,9 @@ _sysio_incore_dirop_mkdir(struct pnode * I_RELE(ino); _sysio_i_gone(ino); return err; - } + } else + I_PUT(ino); - pno->p_base->pb_ino = ino; return 0; } @@ -1303,7 +1292,7 @@ _sysio_incore_dirop_rmdir(struct pnode * } static int -incore_create(struct pnode *pno, struct intnl_stat *stat) +incore_create(struct pnode *pno, struct intnl_stat *stat, struct inode **inop) { struct inode *dino, *ino; struct incore_inode *icino; @@ -1347,7 +1336,7 @@ incore_create(struct pnode *pno, struct return err; } - pno->p_base->pb_ino = ino; + *inop = ino; return 0; } @@ -1356,6 +1345,8 @@ _sysio_incore_inop_open(struct pnode *pn { struct intnl_stat stat; ino_t inum; + int err; + struct inode *ino; /* * File exists. Nothing to do. @@ -1383,11 +1374,16 @@ _sysio_incore_inop_open(struct pnode *pn stat.st_ctime = stat.st_mtime = stat.st_atime = 0; stat.st_ino = inum; - return incore_create(pno, &stat); + err = incore_create(pno, &stat, &ino); + if (err) + return err; + assert(ino); + I_PUT(ino); + return 0; } static int -_sysio_incore_inop_close(struct inode *ino __IS_UNUSED) +_sysio_incore_inop_close(struct pnode *pno __IS_UNUSED) { return 0; @@ -1496,7 +1492,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 +1499,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 +1529,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 +1568,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 +1595,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 +1609,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 +1619,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) { @@ -1642,6 +1636,8 @@ _sysio_incore_dirop_mknod(struct pnode * mode_t m; struct intnl_stat stat; ino_t inum; + int err; + struct inode *ino; assert(!pno->p_base->pb_ino); @@ -1677,13 +1673,16 @@ _sysio_incore_dirop_mknod(struct pnode * stat.st_ctime = stat.st_mtime = stat.st_atime = 0; stat.st_ino = inum; - return incore_create(pno, &stat); + err = incore_create(pno, &stat, &ino); + if (err) + return err; + I_PUT(ino); + return 0; } #ifdef _HAVE_STATVFS static int _sysio_incore_inop_statvfs(struct pnode *pno, - struct inode *ino __IS_UNUSED, struct intnl_statvfs *buf) { struct filesys *fs; |