Thread: [Libsysio-commit] RedStorm_merge: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
From: Sonja T. <so...@us...> - 2003-10-09 15:04:19
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv7240/drivers/incore Modified Files: Tag: RedStorm_merge fs_incore.c Log Message: Merging redstorm changes Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.4.4.2 retrieving revision 1.4.4.2.2.1 diff -u -w -b -B -p -r1.4.4.2 -r1.4.4.2.2.1 --- fs_incore.c 19 May 2003 14:25:24 -0000 1.4.4.2 +++ fs_incore.c 9 Oct 2003 15:04:09 -0000 1.4.4.2.2.1 @@ -56,9 +56,7 @@ #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> -#ifdef _HAVE_STATVFS #include <sys/statvfs.h> -#endif #include <sys/queue.h> #include "sysio.h" @@ -74,6 +72,9 @@ * In-core file system pseudo-driver. */ +#ifndef REDSTORM +#define _DIRENT_HAVE_D_OFF +#endif /* * Pseudo-blocksize. */ @@ -139,7 +140,9 @@ static int _sysio_incore_dirop_mkdir(str 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_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 io_arguments *ioargs, struct ioctx **ioctxp); @@ -153,14 +156,11 @@ static int _sysio_incore_filop_ioctl(str 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); static int _sysio_incore_e_isdir(void); -static int _sysio_incore_e_notdir(void); static int _sysio_incore_e_inval(void); static int _sysio_incore_e_nosys(void); static void _sysio_incore_illop(void); @@ -197,7 +197,9 @@ static struct inode_ops _sysio_incore_di _sysio_incore_dirop_readlink, _sysio_incore_inop_open, _sysio_incore_inop_close, + _sysio_incore_dirop_link, _sysio_incore_dirop_unlink, + _sysio_incore_dirop_rename, _sysio_incore_dirop_ipreadv, _sysio_incore_dirop_ipwritev, _sysio_incore_dirop_iodone, @@ -206,9 +208,7 @@ static struct inode_ops _sysio_incore_di _sysio_incore_inop_sync, _sysio_incore_dirop_ioctl, _sysio_incore_dirop_mknod, -#ifdef _HAVE_STATVFS _sysio_incore_inop_statvfs, -#endif _sysio_incore_inop_gone }; @@ -216,24 +216,28 @@ static struct inode_ops _sysio_incore_di (int (*)(struct pnode *, \ struct inode **, \ struct intent *, \ - const char *))_sysio_incore_e_notdir + const char *))_sysio_incore_illop #define _sysio_incore_filop_getdirentries \ (ssize_t (*)(struct inode *, \ char *, \ size_t, \ - _SYSIO_OFF_T *))_sysio_incore_e_notdir + _SYSIO_OFF_T *))_sysio_incore_illop #define _sysio_incore_filop_mkdir \ - (int (*)(struct pnode *, mode_t))_sysio_incore_e_notdir + (int (*)(struct pnode *, mode_t))_sysio_incore_illop #define _sysio_incore_filop_rmdir \ - (int (*)(struct pnode *))_sysio_incore_e_notdir + (int (*)(struct pnode *))_sysio_incore_illop #define _sysio_incore_filop_symlink \ (int (*)(struct pnode *, const char *))_sysio_incore_illop #define _sysio_incore_symlinkop_readlink \ (int (*)(struct pnode *, char *, size_t))_sysio_incore_illop +#define _sysio_incore_filop_link \ + (int (*)(struct pnode *old, struct pnode *new))_sysio_incore_illop #define _sysio_incore_filop_unlink \ - (int (*)(struct pnode *pno))_sysio_incore_e_notdir + (int (*)(struct pnode *pno))_sysio_incore_illop +#define _sysio_incore_filop_rename \ + (int (*)(struct pnode *old, struct pnode *new))_sysio_incore_illop #define _sysio_incore_filop_mknod \ - (int (*)(struct pnode *pno, mode_t, dev_t))_sysio_incore_e_notdir + (int (*)(struct pnode *pno, mode_t, dev_t))_sysio_incore_illop static struct inode_ops _sysio_incore_file_ops = { _sysio_incore_filop_lookup, @@ -246,7 +250,9 @@ static struct inode_ops _sysio_incore_fi _sysio_incore_symlinkop_readlink, _sysio_incore_inop_open, _sysio_incore_inop_close, + _sysio_incore_filop_link, _sysio_incore_filop_unlink, + _sysio_incore_filop_rename, _sysio_incore_filop_ipreadv, _sysio_incore_filop_ipwritev, _sysio_incore_filop_iodone, @@ -255,9 +261,7 @@ static struct inode_ops _sysio_incore_fi _sysio_incore_inop_sync, _sysio_incore_filop_ioctl, _sysio_incore_filop_mknod, -#ifdef _HAVE_STATVFS _sysio_incore_inop_statvfs, -#endif _sysio_incore_inop_gone }; @@ -272,7 +276,9 @@ static struct inode_ops _sysio_incore_de _sysio_incore_symlinkop_readlink, _sysio_nodev_inop_open, _sysio_nodev_inop_close, + _sysio_incore_filop_link, _sysio_incore_filop_unlink, + _sysio_incore_filop_rename, _sysio_nodev_inop_ipreadv, _sysio_nodev_inop_ipwritev, _sysio_nodev_inop_iodone, @@ -281,9 +287,7 @@ static struct inode_ops _sysio_incore_de _sysio_nodev_inop_sync, _sysio_nodev_inop_ioctl, _sysio_incore_filop_mknod, -#ifdef _HAVE_STATVFS _sysio_incore_inop_statvfs, -#endif _sysio_incore_inop_gone }; @@ -319,7 +323,7 @@ struct lookup_data { */ #define INCORE_D_RECLEN(namlen) \ (((size_t )&((struct intnl_dirent *)0)->d_name + \ - (namlen) + sizeof(void *)) & \ + (namlen) + 1 + sizeof(void *)) & \ ~(sizeof(void *) - 1)) /* @@ -369,17 +374,20 @@ _sysio_incore_init() #ifdef _DIRENT_HAVE_D_NAMLEN de->d_namlen = 1; #endif + /* + * Move to entry for `..' + */ de = (void *)de + off; de->d_reclen = INCORE_D_RECLEN(2); +#ifdef _DIRENT_HAVE_D_NAMLEN + de->d_namlen = 2; +#endif #ifdef _DIRENT_HAVE_D_OFF de->d_off = #endif off += de->d_reclen; de->d_type = INCORE_D_TYPEOF(S_IFDIR); de->d_name[0] = de->d_name[1] = '.'; -#ifdef _DIRENT_HAVE_D_NAMLEN - de->d_namlen = 2; -#endif return _sysio_fssw_register("incore", &incore_fssw_ops); } @@ -736,12 +744,20 @@ incore_directory_probe(void *data, de->d_off - origin; #else ((void *)de - data) + de->d_reclen; -#endif +#endif/* if (hole) { p = (*hole)((void *)de, de->d_reclen, arg); if (p) return p; } + */ + if (hole && n > de->d_reclen) { + p = (*hole)((void *)de + de->d_reclen, + n-de->d_reclen, + arg); + if (p) + return p; + } if (n >= siz) break; de = data + n; @@ -764,8 +780,7 @@ incore_directory_match(struct intnl_dire #ifdef _DIRENT_HAVE_D_NAMLEN ld->name->len == de->d_namlen && #endif - strncmp(de->d_name, ld->name->name, ld->name->len) == 0 - ) + strncmp(de->d_name, ld->name->name, ld->name->len) == 0) return de; ld->de = de; return NULL; @@ -1041,12 +1056,18 @@ incore_directory_insert(struct incore_in de->d_reclen; #else INCORE_D_RECLEN(de->d_namlen); -#endif +#endif/* if (!parent->ici_st.st_size || - xt + r + reclen > (size_t )parent->ici_st.st_size) { + xt + r + reclen > (size_t )parent->ici_st.st_size) {*/ + if (n >= (size_t) parent->ici_st.st_size) { int err; - err = incore_trunc(parent, xt + r + reclen, 1); + /* err = incore_trunc(parent, xt + r + reclen, 1);*/ + err = + incore_trunc(parent, + ((size_t)((void *)de - parent->ici_data + + de->d_reclen + reclen)), + 1); if (err) return err; de = parent->ici_data + xt; @@ -1115,7 +1137,7 @@ _sysio_incore_dirop_mkdir(struct pnode * struct incore_inode *icino, *parent; ino_t inum; int err; - struct intnl_dirent *de; + struct intnl_dirent *de = NULL; struct inode *ino; ino = pno->p_parent->p_base->pb_ino; @@ -1220,6 +1242,12 @@ incore_unlink_entry(struct incore_inode lookup_data.de->d_off = off; #endif + /* + * Adjust link count. + */ + assert(icino->ici_st.st_nlink > 2); + icino->ici_st.st_nlink--; + return 0; } @@ -1251,6 +1279,12 @@ _sysio_incore_dirop_rmdir(struct pnode * return err; I_RELE(ino); + /* + * Adjust link count. + */ + assert(icino->ici_st.st_nlink > 2); + icino->ici_st.st_nlink--; + return 0; } @@ -1348,6 +1383,94 @@ _sysio_incore_inop_close(struct inode *i } static int +_sysio_incore_dirop_link(struct pnode *old, struct pnode *new) +{ + struct incore_inode *icino = I2IC(old->p_base->pb_ino); + int err; + + assert(!new->p_base->pb_ino); + assert(!S_ISDIR(old->p_base->pb_ino->i_mode)); + + /* + * Can bump the link count? + */ + if (!(icino->ici_st.st_nlink + 1)) + return -EMLINK; + /* + * Insert into parent. + */ + err = + incore_directory_insert(I2IC(new->p_parent->p_base->pb_ino), + &new->p_base->pb_name, + icino->ici_st.st_ino, + INCORE_D_TYPEOF(icino->ici_st.st_mode)); + if (err) + return err; + /* + * Bump the link count. + */ + icino->ici_st.st_nlink++; + + return 0; +} + +static int +_sysio_incore_dirop_rename(struct pnode *old, struct pnode *new) +{ + int err; + struct incore_inode *icino = I2IC(old->p_base->pb_ino); + + if (new->p_base->pb_ino) { + /* + * Have to kill off the target first. + */ + if (S_ISDIR(I2IC(new->p_base->pb_ino)->ici_st.st_mode) && + I2IC(new->p_base->pb_ino)->ici_st.st_nlink > 2) + return -ENOTEMPTY; + err = + incore_unlink_entry(I2IC(new->p_parent->p_base->pb_ino), + &new->p_base->pb_name); + if (err) + return err; + I_RELE(new->p_base->pb_ino); + _sysio_i_gone(new->p_base->pb_ino); + new->p_base->pb_ino = NULL; + } + + /* + * Insert into new parent. + */ + err = + incore_directory_insert(I2IC(new->p_parent->p_base->pb_ino), + &new->p_base->pb_name, + icino->ici_st.st_ino, + INCORE_D_TYPEOF(icino->ici_st.st_mode)); + if (err) + abort(); + /* + * Remove from the old parent. + */ + err = + incore_unlink_entry(I2IC(old->p_parent->p_base->pb_ino), + &old->p_base->pb_name); + if (err) + abort(); + + if (S_ISDIR(icino->ici_st.st_mode)) { + struct intnl_dirent *de; + + /* + * We moved a directory. The entry for `..' must be corrected. + */ + de = icino->ici_data; + de++; + assert(strcmp(de->d_name, "..") == 0); + de->d_ino = I2IC(new->p_parent->p_base->pb_ino)->ici_st.st_ino; + } + return 0; +} + +static int _sysio_incore_dirop_unlink(struct pnode *pno) { struct inode *ino = pno->p_base->pb_ino; @@ -1357,7 +1480,6 @@ _sysio_incore_dirop_unlink(struct pnode if (S_ISDIR(icino->ici_st.st_mode)) return -EISDIR; - pno->p_base->pb_ino = NULL; err = incore_unlink_entry(I2IC(pno->p_parent->p_base->pb_ino), &pno->p_base->pb_name); @@ -1377,7 +1499,7 @@ incore_doio(ssize_t (*f)(struct incore_i struct ioctx *ioctx; const struct iovec *iov; size_t n; - ssize_t cc; + ssize_t cc = 0; ioctx = _sysio_ioctx_new(ino, ioargs); if (!ioctx) @@ -1558,7 +1680,6 @@ _sysio_incore_dirop_mknod(struct pnode * return incore_create(pno, &stat); } -#ifdef _HAVE_STATVFS static int _sysio_incore_inop_statvfs(struct pnode *pno, struct inode *ino, @@ -1579,7 +1700,8 @@ _sysio_incore_inop_statvfs(struct pnode */ buf->f_bsize = fs->fs_bsize; buf->f_frsize = buf->f_bsize; - buf->f_blocks = (0xffffffffffffffff - 1) / buf->f_bsize; + buf->f_blocks = ~0; + buf->f_blocks /= buf->f_bsize; buf->f_bfree = buf->f_blocks - 1; buf->f_bavail = buf->f_bfree; buf->f_files = buf->f_blocks; @@ -1591,7 +1713,6 @@ _sysio_incore_inop_statvfs(struct pnode return 0; } -#endif void _sysio_incore_inop_gone(struct inode *ino) @@ -1606,13 +1727,6 @@ _sysio_incore_e_isdir(void) { return -EISDIR; -} - -static int -_sysio_incore_e_notdir(void) -{ - - return -ENOTDIR; } static int |