Thread: [Libsysio-commit] HEAD: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
From: Ruth K. <rk...@us...> - 2003-07-31 22:45:12
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv25526/drivers/incore Modified Files: fs_incore.c Log Message: fix warnings Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -w -b -B -p -r1.4 -r1.5 --- fs_incore.c 23 Apr 2003 18:16:57 -0000 1.4 +++ fs_incore.c 31 Jul 2003 22:21:36 -0000 1.5 @@ -1024,7 +1024,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; @@ -1271,7 +1271,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) |
From: Lee W. <lw...@us...> - 2003-09-27 20:19:13
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv6348/drivers/incore Modified Files: fs_incore.c Log Message: - Better checking during chdir(). - Added _sysio_p_chdir() to call change working directory with a pnode. - test_path.c doesn't follow symlinks anymore. - sysio_stubs.c defined a bunch of disk ioctl's inappropriately. Removed. - Added fchmod(), fchown(), rename(), link(), utime(). Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -w -b -B -p -r1.5 -r1.6 --- fs_incore.c 31 Jul 2003 22:21:36 -0000 1.5 +++ fs_incore.c 27 Sep 2003 19:42:01 -0000 1.6 @@ -137,7 +137,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); @@ -156,7 +158,6 @@ static int _sysio_incore_inop_statvfs(st struct intnl_statvfs *buf); 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); @@ -193,7 +194,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, @@ -210,24 +213,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, \ - off64_t *))_sysio_incore_e_notdir + off64_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, @@ -240,7 +247,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, @@ -264,7 +273,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, @@ -309,7 +320,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)) /* @@ -353,11 +364,13 @@ _sysio_incore_init() de->d_off = off = de->d_reclen = INCORE_D_RECLEN(1); de->d_type = INCORE_D_TYPEOF(S_IFDIR); de->d_name[0] = '.'; + de->d_name[1] = ' '; de = (void *)de + de->d_off; de->d_reclen = INCORE_D_RECLEN(2); de->d_off = off += de->d_reclen; de->d_type = INCORE_D_TYPEOF(S_IFDIR); de->d_name[0] = de->d_name[1] = '.'; + de->d_name[2] = ' '; return _sysio_fssw_register("incore", &incore_fssw_ops); } @@ -719,7 +732,8 @@ incore_directory_match(struct intnl_dire struct lookup_data *ld) { - if (strncmp(de->d_name, ld->name->name, ld->name->len) == 0) + if (strlen(de->d_name) == ld->name->len && + strncmp(de->d_name, ld->name->name, ld->name->len) == 0) return de; ld->de = de; return NULL; @@ -1006,6 +1020,7 @@ incore_directory_insert(struct incore_in de->d_reclen = reclen; de->d_type = type; (void )memcpy(de->d_name, name->name, name->len); + de->d_name[name->len] = '\0'; /* * Update attributes to reflect the new entry. @@ -1114,6 +1129,12 @@ incore_unlink_entry(struct incore_inode lookup_data.de->d_off = de->d_off; /* unlink */ (void )memset(de, 0, de->d_reclen); /* clear */ + /* + * Adjust link count. + */ + assert(icino->ici_st.st_nlink > 2); + icino->ici_st.st_nlink--; + return 0; } @@ -1145,6 +1166,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; } @@ -1242,6 +1269,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; @@ -1251,7 +1366,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); @@ -1472,7 +1586,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; @@ -1498,13 +1613,6 @@ _sysio_incore_e_isdir(void) { return -EISDIR; -} - -static int -_sysio_incore_e_notdir(void) -{ - - return -ENOTDIR; } static int |
From: Lee W. <lw...@us...> - 2003-10-10 18:52:31
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv14350/drivers/incore Modified Files: fs_incore.c Log Message: Red Storm branch mega-merge. Please, no more changes to any of the Red Storm branches. We'll keep them for reference for awhile but then, they go away. Finally! Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -w -b -B -p -r1.6 -r1.7 --- fs_incore.c 27 Sep 2003 19:42:01 -0000 1.6 +++ fs_incore.c 10 Oct 2003 18:50:31 -0000 1.7 @@ -56,7 +56,9 @@ #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" @@ -132,7 +134,7 @@ static int _sysio_incore_inop_setattr(st static ssize_t _sysio_incore_dirop_getdirentries(struct inode *ino, char *buf, size_t nbytes, - off64_t *basep); + _SYSIO_OFF_T *basep); 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); @@ -153,9 +155,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_inval(void); @@ -205,7 +209,9 @@ 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 }; @@ -218,7 +224,7 @@ static struct inode_ops _sysio_incore_di (ssize_t (*)(struct inode *, \ char *, \ size_t, \ - off64_t *))_sysio_incore_illop + _SYSIO_OFF_T *))_sysio_incore_illop #define _sysio_incore_filop_mkdir \ (int (*)(struct pnode *, mode_t))_sysio_incore_illop #define _sysio_incore_filop_rmdir \ @@ -258,7 +264,9 @@ 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 }; @@ -284,7 +292,9 @@ 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 }; @@ -361,13 +371,27 @@ _sysio_incore_init() * Fill in the directory template. */ de = (struct intnl_dirent *)incore_dir_template; - de->d_off = off = de->d_reclen = INCORE_D_RECLEN(1); +#ifdef _DIRENT_HAVE_D_OFF + de->d_off = +#endif + off = de->d_reclen = INCORE_D_RECLEN(1); de->d_type = INCORE_D_TYPEOF(S_IFDIR); de->d_name[0] = '.'; - de->d_name[1] = ' '; - de = (void *)de + de->d_off; +#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); - de->d_off = off += de->d_reclen; +#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] = '.'; de->d_name[2] = ' '; @@ -407,9 +431,9 @@ incore_i_alloc(struct incore_filesys *ic } static int -incore_trunc(struct incore_inode *icino, off64_t size, int clear) +incore_trunc(struct incore_inode *icino, _SYSIO_OFF_T size, int clear) { - off64_t n; + _SYSIO_OFF_T n; void *p; if (size < 0) @@ -477,7 +501,12 @@ incore_directory_new(struct incore_files sizeof(incore_dir_template)); de = icino->ici_data; de->d_ino = st->st_ino; - (void *)de += de->d_off; + (void *)de += +#ifdef _DIRENT_HAVE_D_OFF + de->d_off; +#else + de->d_reclen; +#endif de->d_ino = parent->ici_st.st_ino; /* @@ -695,7 +724,11 @@ _sysio_incore_fsop_gone(struct filesys * static void * incore_directory_probe(void *data, size_t siz, - off64_t origin, + _SYSIO_OFF_T origin +#ifndef _DIRENT_HAVE_D_OFF + __IS_UNUSED +#endif + , probe_ty entry, probe_ty hole, void *arg) @@ -706,15 +739,21 @@ incore_directory_probe(void *data, de = data; for (;;) { +#ifdef _DIRENT_HAVE_D_OFF assert(de->d_off); +#else + assert(de->d_reclen); +#endif if (entry && (p = (*entry)(de, de->d_reclen, arg))) return p; - n = de->d_off - origin; - if (hole && n > de->d_reclen) { - p = - (*hole)((void *)de + de->d_reclen, - n - de->d_reclen, - arg); + n = +#ifdef _DIRENT_HAVE_D_OFF + de->d_off - origin; +#else + ((void *)de - data) + de->d_reclen; +#endif + if (hole) { + p = (*hole)((void *)de, de->d_reclen, arg); if (p) return p; } @@ -732,7 +771,14 @@ incore_directory_match(struct intnl_dire struct lookup_data *ld) { - if (strlen(de->d_name) == ld->name->len && +#if defined(BSD) || defined(REDSTORM) + if (IFTODT(de->d_type) == DT_WHT) + return NULL; +#endif + if ( +#ifdef _DIRENT_HAVE_D_NAMLEN + ld->name->len == de->d_namlen && +#endif strncmp(de->d_name, ld->name->name, ld->name->len) == 0) return de; ld->de = de; @@ -893,6 +939,13 @@ struct copy_info { size_t nbytes; }; +/* + * Eumeration callback. + * + * Note: + * On those systems supporting white-out entries, they are returned. On + * systems without, they are not. + */ static void * incore_directory_enumerate(struct intnl_dirent *de, size_t reclen, @@ -910,7 +963,7 @@ static ssize_t _sysio_incore_dirop_getdirentries(struct inode *ino, char *buf, size_t nbytes, - off64_t *basep) + _SYSIO_OFF_T *basep) { struct incore_inode *icino = I2IC(ino); off_t off; @@ -974,7 +1027,9 @@ incore_directory_insert(struct incore_in size_t reclen; struct lookup_data lookup_data; struct intnl_dirent *de; + size_t xt; size_t n; + size_t r; reclen = INCORE_D_RECLEN(name->len); INCORE_LD_INIT(&lookup_data, reclen, name); @@ -988,39 +1043,74 @@ incore_directory_insert(struct incore_in if (de) return -EEXIST; de = lookup_data.de; - n = de->d_off; - if (n >= (size_t )parent->ici_st.st_size) { + xt = (void *)lookup_data.de - parent->ici_data; + n = +#ifdef _DIRENT_HAVE_D_OFF + de->d_off; +#else + xt + de->d_reclen; +#endif + r = +#ifdef _DIRENT_HAVE_D_OFF + de->d_reclen; +#else + INCORE_D_RECLEN(de->d_namlen); +#endif + if (!parent->ici_st.st_size || + xt + r + reclen > (size_t )parent->ici_st.st_size) { int err; - size_t xt; - xt = (void *)lookup_data.de - parent->ici_data; - err = - incore_trunc(parent, - ((size_t )((void *)de - parent->ici_data) + - de->d_reclen + - reclen), - 1); + err = incore_trunc(parent, xt + r + reclen, 1); if (err) return err; de = parent->ici_data + xt; n = parent->ici_st.st_size; } +#ifdef _DIRENT_HAVE_D_OFF + de->d_off = xt + r; /* trim */ +#else + de->d_reclen = r; +#endif + (void *)de += r; /* reposition */ + xt += r; + +#ifndef _DIRENT_HAVE_D_OFF /* - * Fix previous entry. + * Will we split this hole or use all of it? */ - de->d_off = (void *)de - parent->ici_data + de->d_reclen; + if (lookup_data.hole.len - reclen && + lookup_data.hole.len - reclen <= INCORE_D_RECLEN(1)) + reclen = lookup_data.hole.len; +#endif /* * Insert new. */ - (void *)de += de->d_reclen; de->d_ino = inum; +#ifdef _DIRENT_HAVE_D_OFF de->d_off = n; +#endif de->d_reclen = reclen; de->d_type = type; (void )memcpy(de->d_name, name->name, name->len); - de->d_name[name->len] = '\0'; +#ifdef _DIRENT_HAVE_D_NAMLEN + de->d_namlen = name->len; +#endif + +#ifndef _DIRENT_HAVE_D_OFF + xt += reclen; + if (n - xt) { + /* + * White-out remaining part of the hole. + */ + (void *)de += reclen; + de->d_ino = 0; + de->d_reclen = n - xt; + de->d_type = DT_WHT; + de->d_namlen = 0; + } +#endif /* * Update attributes to reflect the new entry. @@ -1110,6 +1200,10 @@ incore_unlink_entry(struct incore_inode { struct lookup_data lookup_data; struct intnl_dirent *de; + size_t reclen; +#ifdef _DIRENT_HAVE_D_OFF + size_t off; +#endif if (!S_ISDIR(icino->ici_st.st_mode)) return -ENOTDIR; @@ -1126,8 +1220,25 @@ incore_unlink_entry(struct incore_inode return -ENOENT; assert((size_t )((void *)de - icino->ici_data) >= sizeof(incore_dir_template)); - lookup_data.de->d_off = de->d_off; /* unlink */ - (void )memset(de, 0, de->d_reclen); /* clear */ +#ifndef _DIRENT_HAVE_D_OFF + reclen = de->d_reclen; +#else + off = de->d_off; + reclen = off - ((void *)de - icino->ici_data); +#endif + (void )memset(de, 0, reclen); +#ifndef _DIRENT_HAVE_D_OFF + de->d_type = (__uint8_t )DTTOIF(DT_WHT); + de->d_reclen = reclen; +#else + lookup_data.de->d_off = off; +#endif + + /* + * Adjust link count. + */ + assert(icino->ici_st.st_nlink > 2); + icino->ici_st.st_nlink--; /* * Adjust link count. @@ -1418,11 +1529,11 @@ 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) { - off64_t n; + _SYSIO_OFF_T n; if (!nbytes || off > icino->ici_st.st_size) return 0; - n = (off64_t )nbytes; + n = (_SYSIO_OFF_T )nbytes; if (!(n > 0 && (size_t )n == nbytes)) return -EINVAL; if (n > icino->ici_st.st_size - off) @@ -1448,11 +1559,11 @@ incore_write(struct incore_inode *icino, size_t nbytes) { int err; - off64_t n; + _SYSIO_OFF_T n; if (!nbytes) return 0; - n = (off64_t )nbytes; + n = (_SYSIO_OFF_T )nbytes; if (!(n > 0 && (size_t )n == nbytes)) return -EINVAL; if (off + n > icino->ici_st.st_size) { @@ -1544,7 +1655,7 @@ _sysio_incore_dirop_mknod(struct pnode * return -EINVAL; /* - * Must create a new, regular, file. + * Initialize attributes. */ (void )memset(&stat, 0, sizeof(stat)); stat.st_dev = pno->p_parent->p_base->pb_ino->i_fs->fs_dev; @@ -1566,6 +1677,7 @@ _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, @@ -1599,6 +1711,7 @@ _sysio_incore_inop_statvfs(struct pnode return 0; } +#endif void _sysio_incore_inop_gone(struct inode *ino) |
From: Lee W. <lw...@us...> - 2003-10-13 01:04:44
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv31768/drivers/incore Modified Files: fs_incore.c Log Message: The IO context record supported one call-back. It now supports a chain. This was changed to accommodate the Sandia-PVFS driver. Also, it's needed for the, coming, {read,write}_strided calls. To add a callback to the chain use: _sysio_ioctx_cb(struct ioctx *ioctx, void (*func)(struct ioctx *, void *), void *data) Callbacks are added to the end of the existing chain. When called, by _sysio_io_complete, they are run in order. So... If you're freeing things using callbacks be careful not to depend on something in a later callback that you previously free'd. Also, _sysio_io_complete no longer waits for the driver. To call this, now, is to signal completion. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -w -b -B -p -r1.7 -r1.8 --- fs_incore.c 10 Oct 2003 18:50:31 -0000 1.7 +++ fs_incore.c 13 Oct 2003 01:04:34 -0000 1.8 @@ -143,11 +143,9 @@ static int _sysio_incore_dirop_link(stru 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); + struct ioctx *ioctx); static int _sysio_incore_filop_ipwritev(struct inode *ino, - struct io_arguments *ioargs, - struct ioctx **ioctxp); + 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); @@ -172,12 +170,10 @@ static void _sysio_incore_illop(void); (int (*)(struct pnode *, char *, size_t))_sysio_incore_e_inval #define _sysio_incore_dirop_ipreadv \ (int (*)(struct inode *, \ - struct io_arguments *, \ - struct ioctx **))_sysio_incore_e_isdir + struct ioctx *))_sysio_incore_e_isdir #define _sysio_incore_dirop_ipwritev \ (int (*)(struct inode *, \ - struct io_arguments *, \ - struct ioctx **))_sysio_incore_e_isdir + struct ioctx *))_sysio_incore_e_isdir #define _sysio_incore_dirop_iodone \ (int (*)(struct ioctx *))_sysio_incore_illop #define _sysio_incore_dirop_fcntl \ @@ -1490,18 +1486,12 @@ _sysio_incore_dirop_unlink(struct pnode static int incore_doio(ssize_t (*f)(struct incore_inode *, off_t, char *, size_t), struct inode *ino, - struct io_arguments *ioargs, - struct ioctx **ioctxp) + struct ioctx *ioctx) { - struct ioctx *ioctx; const struct iovec *iov; size_t n; ssize_t cc = 0; - ioctx = _sysio_ioctx_new(ino, ioargs); - if (!ioctx) - return -ENOMEM; - iov = ioctx->ioctx_iovec; for (n = ioctx->ioctx_iovlen, iov = ioctx->ioctx_iovec; n--; @@ -1522,7 +1512,6 @@ incore_doio(ssize_t (*f)(struct incore_i ioctx->ioctx_errno = -cc; } - *ioctxp = ioctx; return 0; } @@ -1545,11 +1534,10 @@ incore_read(struct incore_inode *icino, static int _sysio_incore_filop_ipreadv(struct inode *ino, - struct io_arguments *ioargs, - struct ioctx **ioctxp) + struct ioctx *ioctx) { - return incore_doio(incore_read, ino, ioargs, ioctxp); + return incore_doio(incore_read, ino, ioctx); } static ssize_t @@ -1578,8 +1566,7 @@ incore_write(struct incore_inode *icino, static int _sysio_incore_filop_ipwritev(struct inode *ino, - struct io_arguments *ioargs, - struct ioctx **ioctxp) + struct ioctx *ioctx) { return incore_doio((ssize_t (*)(struct incore_inode *, @@ -1587,8 +1574,7 @@ _sysio_incore_filop_ipwritev(struct inod char *, size_t))incore_write, ino, - ioargs, - ioctxp); + ioctx); } static int |
From: Lee W. <lw...@us...> - 2003-10-15 18:01:33
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv9577/drivers/incore Modified Files: fs_incore.c Log Message: Eliminated the i-node number field from the inode structure. We already carry the file identifier so it was redundant. Problematic too, in that it can be 32 or 64 bits in size. This forced _sysio_i_new() and _sysio_i_find() to change -- They no longer take the i-node number as an argument. Updated the driver calls to reflect the new usage. The i-node cache is now indexed by hashing the file identifier as opposed to just using the, no longer maintained, i-node number. This caused _sysio_i_find to become 2+ percent more expensive to use. Acceptable for me. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -w -b -B -p -r1.8 -r1.9 --- fs_incore.c 13 Oct 2003 01:04:34 -0000 1.8 +++ fs_incore.c 15 Oct 2003 18:00:54 -0000 1.9 @@ -625,7 +625,6 @@ _sysio_incore_fsswop_mount(const char *s */ rooti = _sysio_i_new(fs, - icino->ici_st.st_ino, &icino->ici_fileid, icino->ici_st.st_mode, 0, @@ -827,7 +826,7 @@ _sysio_incore_dirop_lookup(struct pnode fileid.fid_data = &de->d_ino; fileid.fid_len = sizeof(de->d_ino); ino = - _sysio_i_find(ino->i_fs, de->d_ino, &fileid); + _sysio_i_find(ino->i_fs, &fileid); #ifdef notdef if (ino) goto out; @@ -848,7 +847,6 @@ _sysio_incore_dirop_lookup(struct pnode abort(); ino = _sysio_i_new(ino->i_fs, - icino->ici_st.st_ino, &icino->ici_fileid, icino->ici_st.st_mode, 0, @@ -1158,7 +1156,6 @@ _sysio_incore_dirop_mkdir(struct pnode * */ ino = _sysio_i_new(pno->p_parent->p_base->pb_ino->i_fs, - stat.st_ino, &icino->ici_fileid, stat.st_mode, 0, @@ -1301,7 +1298,6 @@ incore_create(struct pnode *pno, struct */ ino = _sysio_i_new(dino->i_fs, - st->st_ino, &icino->ici_fileid, st->st_mode, st->st_rdev, |
From: Lee W. <lw...@us...> - 2003-10-15 20:09:25
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv1369 Modified Files: fs_incore.c Log Message: The incore unlink_entry routine has duplicated code (from the recent merge?) which caused it to lower the link count twice -- From Ruth. Fixed. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -w -b -B -p -r1.9 -r1.10 --- fs_incore.c 15 Oct 2003 18:00:54 -0000 1.9 +++ fs_incore.c 15 Oct 2003 20:08:52 -0000 1.10 @@ -1233,12 +1233,6 @@ incore_unlink_entry(struct incore_inode assert(icino->ici_st.st_nlink > 2); icino->ici_st.st_nlink--; - /* - * Adjust link count. - */ - assert(icino->ici_st.st_nlink > 2); - icino->ici_st.st_nlink--; - return 0; } |
From: Lee W. <lw...@us...> - 2003-10-17 21:30:33
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv10931/drivers/incore Modified Files: fs_incore.c Log Message: Added a done bit to the IO context record to *positively* signal completion. Also, added a driver private pointer to the dsame record for handy use. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -w -b -B -p -r1.10 -r1.11 --- fs_incore.c 15 Oct 2003 20:08:52 -0000 1.10 +++ fs_incore.c 17 Oct 2003 21:30:29 -0000 1.11 @@ -1502,6 +1502,8 @@ incore_doio(ssize_t (*f)(struct incore_i ioctx->ioctx_errno = -cc; } + ioctx->ioctx_done = 1; + return 0; } |
From: Ruth K. <rk...@us...> - 2004-01-12 18:06:14
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1:/tmp/cvs-serv4404 Modified Files: fs_incore.c Log Message: allow FIFO creation Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -w -b -B -p -r1.11 -r1.12 --- fs_incore.c 17 Oct 2003 21:30:29 -0000 1.11 +++ fs_incore.c 12 Jan 2004 18:06:11 -0000 1.12 @@ -1312,7 +1312,7 @@ incore_create(struct pnode *pno, struct incore_directory_insert(I2IC(dino), &pno->p_base->pb_name, st->st_ino, - INCORE_D_TYPEOF(S_IFREG)); + INCORE_D_TYPEOF(icino->ici_st.st_mode)); if (err) { I_RELE(ino); _sysio_i_gone(ino); @@ -1625,6 +1625,8 @@ _sysio_incore_dirop_mknod(struct pnode * m = mode & S_IFMT; if (S_ISCHR(m)) m &= ~S_IFCHR; + else if (S_ISFIFO(m)) + m &= ~S_IFIFO; else if (S_ISBLK(m)) m &= ~S_IFCHR; else |
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); } |
From: Lee W. <lw...@us...> - 2004-02-14 19:49:37
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16325/drivers/incore Modified Files: fs_incore.c Log Message: + Merged in changes from namespace_assembly branch (see .../misc/init-env.sh) This provoked a bunch of bugs. See below. + Fixed a bug in _sysio_enumerate_extents(). If the IO operation was short, it would go round the loop again, mistakenly trying to fill more of the extent. + In rw.c, fixed bugs in [p]{read,write}[vx] (all the synchronous routines) that improperly propagated error returns. They were returning -errno instead of setting errno and returning -1. + In fs_native.c:doiov, fixed a bug where a zero-length IO was improperly thought to be an error. + In lseek.c:_sysio_lseek, fixed final position check to properly determine {under,over}flow. + In link.c:link, fixed the existence check. No error is returned for nonexistent files when ND_NEGOK is specified. We're supposed to check whether it's a negative entry or not. + A new macro, I_GONE, was added to inode.h. This will *try* to kill an inode but if it can't, it becomes a zombie instead. + In unlink.c:unlink, link.c:link, rename.c:rename, the driver ops were being called but the actual operation in the internal path tree was not reflected. Also, for unlink and rename, use the new I_GONE macro on the destroyed inode. + In fs_native.c:native_inop_gone, close() was always called, even when the fildes was -1. + In fs_native.c:native_inop_gone, close() was called. We really meant to call syscal(SYS_close, ...); + In namei.c:_sysio_path_walk, fixed broken symlink handling. It wasn't following symlinks anywhere if ND_NOFOLLOW was set. That flag only means that the *last* component should not be followed. + In namei.c:_sysio_path_walk, fixed buffer overrun problem for very long symlinks. + In fs_incore.c, fixed dirop_{link,rename,unlink,rmdir} because they were manipulating the system path cache and shouldn't. + In mount.c:_sysio_unmount_all we were mistakenly releasing an FS root after a failed unmount attempt. + Fixes in test_regions.c free allocated memory at the end so valgrind doesn't show a leak. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -w -b -B -p -r1.13 -r1.14 --- fs_incore.c 6 Feb 2004 20:07:29 -0000 1.13 +++ fs_incore.c 14 Feb 2004 19:42:57 -0000 1.14 @@ -1262,17 +1262,7 @@ _sysio_incore_dirop_rmdir(struct pnode * err = incore_unlink_entry(I2IC(pno->p_parent->p_base->pb_ino), &pno->p_base->pb_name); - if (err) return err; - I_RELE(ino); - - /* - * Adjust link count. - */ - assert(icino->ici_st.st_nlink > 2); - icino->ici_st.st_nlink--; - - return 0; } static int @@ -1417,9 +1407,6 @@ _sysio_incore_dirop_rename(struct pnode &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; } /* @@ -1468,11 +1455,7 @@ _sysio_incore_dirop_unlink(struct pnode err = incore_unlink_entry(I2IC(pno->p_parent->p_base->pb_ino), &pno->p_base->pb_name); - if (err) return err; - I_RELE(ino); - - return 0; } static int |
From: Lee W. <lw...@us...> - 2004-02-24 15:12:44
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32223/drivers/incore Modified Files: fs_incore.c Log Message: Cleaned out all the pointer arithmetic utilizing void pointers. No longer build the empty statvfs{64} modules. All in an attempt to make the code C99 compliant. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -w -b -B -p -r1.14 -r1.15 --- fs_incore.c 14 Feb 2004 19:42:57 -0000 1.14 +++ fs_incore.c 24 Feb 2004 14:58:26 -0000 1.15 @@ -377,7 +377,7 @@ _sysio_incore_init() /* * Move to entry for `..' */ - de = (void *)de + off; + de = (struct intnl_dirent *)((char *)de + off); de->d_reclen = INCORE_D_RECLEN(2); #ifdef _DIRENT_HAVE_D_NAMLEN de->d_namlen = 2; @@ -446,7 +446,7 @@ incore_trunc(struct incore_inode *icino, return -ENOSPC; icino->ici_data = p; if (clear && n > icino->ici_st.st_size) - (void )memset(icino->ici_data + icino->ici_st.st_size, + (void )memset((char *)icino->ici_data + icino->ici_st.st_size, 0, (size_t )(n - icino->ici_st.st_size)); out: @@ -495,12 +495,14 @@ incore_directory_new(struct incore_files sizeof(incore_dir_template)); de = icino->ici_data; de->d_ino = st->st_ino; - (void *)de += + de = + (struct intnl_dirent *)((char *)de + #ifdef _DIRENT_HAVE_D_OFF - de->d_off; + de->d_off #else - de->d_reclen; + de->d_reclen #endif + ); de->d_ino = parent->ici_st.st_ino; /* @@ -754,7 +756,7 @@ incore_directory_probe(void *data, } if (n >= siz) break; - de = data + n; + de = (struct intnl_dirent *)((char *)data + n); } return NULL; @@ -948,7 +950,7 @@ incore_directory_enumerate(struct intnl_ if (reclen > cinfo->nbytes) return de; (void *)memcpy(cinfo->data, de, reclen); - cinfo->data += reclen; + cinfo->data = (char *)cinfo->data + reclen; cinfo->nbytes -= reclen; return NULL; } @@ -973,7 +975,7 @@ _sysio_incore_dirop_getdirentries(struct *basep, (probe_ty )incore_directory_position, NULL, - icino->ici_data + *basep); + (char *)icino->ici_data + *basep); if (!de) { /* * Past EOF. @@ -984,7 +986,7 @@ _sysio_incore_dirop_getdirentries(struct copy_info.data = buf; copy_info.nbytes = nbytes; - off = (void *)de - icino->ici_data; + off = (char *)de - (char *)icino->ici_data; de = incore_directory_probe(de, icino->ici_st.st_size - off, @@ -1037,7 +1039,7 @@ incore_directory_insert(struct incore_in if (de) return -EEXIST; de = lookup_data.de; - xt = (void *)lookup_data.de - parent->ici_data; + xt = (char *)lookup_data.de - (char *)parent->ici_data; n = #ifdef _DIRENT_HAVE_D_OFF de->d_off; @@ -1057,7 +1059,7 @@ incore_directory_insert(struct incore_in err = incore_trunc(parent, xt + r + reclen, 1); if (err) return err; - de = parent->ici_data + xt; + de = (struct intnl_dirent *)((char *)parent->ici_data + xt); n = parent->ici_st.st_size; } @@ -1066,7 +1068,7 @@ incore_directory_insert(struct incore_in #else de->d_reclen = r; #endif - (void *)de += r; /* reposition */ + de = (struct intnl_dirent *)((char *)de + r); /* reposition */ xt += r; #ifndef _DIRENT_HAVE_D_OFF @@ -1213,13 +1215,13 @@ incore_unlink_entry(struct incore_inode &lookup_data); if (!de) return -ENOENT; - assert((size_t )((void *)de - - icino->ici_data) >= sizeof(incore_dir_template)); + assert((size_t )((char *)de - (char *)icino->ici_data) >= + sizeof(incore_dir_template)); #ifndef _DIRENT_HAVE_D_OFF reclen = de->d_reclen; #else off = de->d_off; - reclen = off - ((void *)de - icino->ici_data); + reclen = off - ((char *)de - (char *)icino->ici_data); #endif (void )memset(de, 0, reclen); #ifndef _DIRENT_HAVE_D_OFF @@ -1492,7 +1494,7 @@ incore_read(void *buf, size_t nbytes, n = icino->ici_st.st_size - (size_t )off; if (n > nbytes) n = nbytes; - (void )memcpy(buf, icino->ici_data + off, (size_t )n); + (void )memcpy(buf, (char *)icino->ici_data + off, (size_t )n); return (ssize_t )n; } @@ -1531,7 +1533,7 @@ incore_write(const void *buf, size_t nby if (err) return err; } - (void )memcpy(icino->ici_data + off, buf, nbytes); + (void )memcpy((char *)icino->ici_data + off, buf, nbytes); return (ssize_t )nbytes; } |
From: Lee W. <lw...@us...> - 2004-02-25 16:39:04
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23863/drivers/incore Modified Files: fs_incore.c Log Message: All mode bit masks were incorrect. Need to preserve ISUID, ISGID, ISVTX bits. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -w -b -B -p -r1.15 -r1.16 --- fs_incore.c 24 Feb 2004 14:58:26 -0000 1.15 +++ fs_incore.c 25 Feb 2004 16:23:58 -0000 1.16 @@ -545,11 +545,11 @@ _sysio_incore_fsswop_mount(const char *s * <permissions>+<owner>+<group> */ ul = strtoul(source, &cp, 0); - mode = (mode_t )ul & 0777; + mode = (mode_t )ul & 07777; if (*cp != '+' || (ul == ULONG_MAX && errno == ERANGE) || (unsigned long)mode != ul || - mode > 0777) + mode > 07777) return -EINVAL; source = cp; l = strtol(source, &cp, 0); |
From: Lee W. <lw...@us...> - 2004-04-16 20:38:42
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30430/drivers/incore Modified Files: fs_incore.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: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -w -b -B -p -r1.16 -r1.17 --- fs_incore.c 25 Feb 2004 16:23:58 -0000 1.16 +++ fs_incore.c 16 Apr 2004 20:38:33 -0000 1.17 @@ -144,6 +144,8 @@ static int _sysio_incore_dirop_unlink(st 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, + _SYSIO_OFF_T off); 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); @@ -157,29 +159,28 @@ static int _sysio_incore_inop_statvfs(st 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_inval(void); -static int _sysio_incore_e_nosys(void); -static void _sysio_incore_illop(void); #define _sysio_incore_dirop_symlink \ - (int (*)(struct pnode *, const char *))_sysio_incore_e_nosys + (int (*)(struct pnode *, const char *))_sysio_do_enosys #define _sysio_incore_dirop_readlink \ - (int (*)(struct pnode *, char *, size_t))_sysio_incore_e_inval + (int (*)(struct pnode *, char *, size_t))_sysio_do_einval #define _sysio_incore_dirop_read \ (int (*)(struct inode *, \ - struct ioctx *))_sysio_incore_e_isdir + struct ioctx *))_sysio_do_eisdir #define _sysio_incore_dirop_write \ (int (*)(struct inode *, \ - struct ioctx *))_sysio_incore_e_isdir + struct ioctx *))_sysio_do_eisdir +#define _sysio_incore_dirop_pos \ + (_SYSIO_OFF_T (*)(struct inode *, \ + _SYSIO_OFF_T))_sysio_do_eisdir #define _sysio_incore_dirop_iodone \ - (int (*)(struct ioctx *))_sysio_incore_illop + (int (*)(struct ioctx *))_sysio_do_illop #define _sysio_incore_dirop_fcntl \ - (int (*)(struct inode *, int, va_list))_sysio_incore_e_isdir + (int (*)(struct inode *, int, va_list))_sysio_do_eisdir #define _sysio_incore_dirop_ioctl \ (int (*)(struct inode *, \ unsigned long int, \ - va_list))_sysio_incore_e_isdir + va_list))_sysio_do_eisdir static struct inode_ops _sysio_incore_dir_ops = { _sysio_incore_dirop_lookup, @@ -197,6 +198,7 @@ static struct inode_ops _sysio_incore_di _sysio_incore_dirop_rename, _sysio_incore_dirop_read, _sysio_incore_dirop_write, + _sysio_incore_dirop_pos, _sysio_incore_dirop_iodone, _sysio_incore_dirop_fcntl, _sysio_incore_inop_sync, @@ -213,28 +215,28 @@ static struct inode_ops _sysio_incore_di (int (*)(struct pnode *, \ struct inode **, \ struct intent *, \ - const char *))_sysio_incore_illop + const char *))_sysio_do_illop #define _sysio_incore_filop_getdirentries \ (ssize_t (*)(struct inode *, \ char *, \ size_t, \ - _SYSIO_OFF_T *))_sysio_incore_illop + _SYSIO_OFF_T *))_sysio_do_illop #define _sysio_incore_filop_mkdir \ - (int (*)(struct pnode *, mode_t))_sysio_incore_illop + (int (*)(struct pnode *, mode_t))_sysio_do_illop #define _sysio_incore_filop_rmdir \ - (int (*)(struct pnode *))_sysio_incore_illop + (int (*)(struct pnode *))_sysio_do_illop #define _sysio_incore_filop_symlink \ - (int (*)(struct pnode *, const char *))_sysio_incore_illop + (int (*)(struct pnode *, const char *))_sysio_do_illop #define _sysio_incore_symlinkop_readlink \ - (int (*)(struct pnode *, char *, size_t))_sysio_incore_illop + (int (*)(struct pnode *, char *, size_t))_sysio_do_illop #define _sysio_incore_filop_link \ - (int (*)(struct pnode *old, struct pnode *new))_sysio_incore_illop + (int (*)(struct pnode *old, struct pnode *new))_sysio_do_illop #define _sysio_incore_filop_unlink \ - (int (*)(struct pnode *pno))_sysio_incore_illop + (int (*)(struct pnode *pno))_sysio_do_illop #define _sysio_incore_filop_rename \ - (int (*)(struct pnode *old, struct pnode *new))_sysio_incore_illop + (int (*)(struct pnode *old, struct pnode *new))_sysio_do_illop #define _sysio_incore_filop_mknod \ - (int (*)(struct pnode *pno, mode_t, dev_t))_sysio_incore_illop + (int (*)(struct pnode *pno, mode_t, dev_t))_sysio_do_illop static struct inode_ops _sysio_incore_file_ops = { _sysio_incore_filop_lookup, @@ -252,6 +254,7 @@ static struct inode_ops _sysio_incore_fi _sysio_incore_filop_rename, _sysio_incore_filop_read, _sysio_incore_filop_write, + _sysio_incore_filop_pos, _sysio_incore_filop_iodone, _sysio_incore_filop_fcntl, _sysio_incore_inop_sync, @@ -280,6 +283,7 @@ static struct inode_ops _sysio_incore_de _sysio_incore_filop_rename, _sysio_nodev_inop_read, _sysio_nodev_inop_write, + _sysio_nodev_inop_pos, _sysio_nodev_inop_iodone, _sysio_incore_filop_fcntl, _sysio_incore_inop_sync, @@ -1549,6 +1553,13 @@ _sysio_incore_filop_write(struct inode * ioctx); } +static _SYSIO_OFF_T +_sysio_incore_filop_pos(struct inode *ino __IS_UNUSED, _SYSIO_OFF_T off) +{ + + return off; +} + static int _sysio_incore_filop_iodone(struct ioctx *iocp __IS_UNUSED) { @@ -1680,34 +1691,3 @@ _sysio_incore_inop_gone(struct inode *in incore_i_destroy(icino); } - -static int -_sysio_incore_e_isdir(void) -{ - - return -EISDIR; -} - -static int -_sysio_incore_e_inval(void) -{ - - return -EINVAL; -} - -static int -_sysio_incore_e_nosys(void) -{ - - return -ENOSYS; -} - -static void -_sysio_incore_illop(void) -{ - - /* - * Uh-oh! Goodbye Bruce. - */ - abort(); -} |
From: Lee W. <lw...@us...> - 2004-07-03 05:47:21
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11075/drivers/incore Modified Files: fs_incore.c Log Message: A new, major change, to .../include/xtio.h. This is intended to be the include file for applications. It prototype all of the extended API available as well as the necessary structures. Other shanges to support this. We now need it most everywhere to build the library as well. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -w -b -B -p -r1.17 -r1.18 --- fs_incore.c 16 Apr 2004 20:38:33 -0000 1.17 +++ fs_incore.c 3 Jul 2004 05:47:12 -0000 1.18 @@ -61,6 +61,7 @@ #endif #include <sys/queue.h> +#include "xtio.h" #include "sysio.h" #include "fs.h" #include "mount.h" |
From: Ruth K. <rk...@us...> - 2004-07-26 16:38:09
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10551/drivers/incore Modified Files: fs_incore.c Log Message: fcntl fixes: fcntl may return a positive or negative value. Driver function interfaces have been changed to accomodate a returned system call value in the arguments. The return value of the driver functions is 0 for success and -errno for failure. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -w -b -B -p -r1.18 -r1.19 --- fs_incore.c 3 Jul 2004 05:47:12 -0000 1.18 +++ fs_incore.c 26 Jul 2004 16:37:59 -0000 1.19 @@ -148,7 +148,8 @@ static int _sysio_incore_filop_write(str static _SYSIO_OFF_T _sysio_incore_filop_pos(struct inode *ino, _SYSIO_OFF_T off); 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_filop_fcntl(struct inode *ino, + 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, unsigned long int request, @@ -177,7 +178,7 @@ static void _sysio_incore_inop_gone(stru #define _sysio_incore_dirop_iodone \ (int (*)(struct ioctx *))_sysio_do_illop #define _sysio_incore_dirop_fcntl \ - (int (*)(struct inode *, int, va_list))_sysio_do_eisdir + (int (*)(struct inode *, int, va_list, int *))_sysio_do_eisdir #define _sysio_incore_dirop_ioctl \ (int (*)(struct inode *, \ unsigned long int, \ @@ -1574,7 +1575,8 @@ _sysio_incore_filop_iodone(struct ioctx static int _sysio_incore_filop_fcntl(struct inode *ino __IS_UNUSED, int cmd __IS_UNUSED, - va_list ap __IS_UNUSED) + va_list ap __IS_UNUSED, + int *rtn __IS_UNUSED) { /* |
From: Lee W. <lw...@us...> - 2004-07-26 17:09:30
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16663 Modified Files: fs_incore.c Log Message: The new *rtn value/result parameter was not being set. This caused fcntl in .../src/fcntl.c to fail indeterminately. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -w -b -B -p -r1.19 -r1.20 --- fs_incore.c 26 Jul 2004 16:37:59 -0000 1.19 +++ fs_incore.c 26 Jul 2004 17:09:21 -0000 1.20 @@ -1576,12 +1576,13 @@ static int _sysio_incore_filop_fcntl(struct inode *ino __IS_UNUSED, int cmd __IS_UNUSED, va_list ap __IS_UNUSED, - int *rtn __IS_UNUSED) + int *rtn) { /* * No fcntl's supported. */ + *rtn = -1; return -ENOTTY; } |
From: Lee W. <lw...@us...> - 2004-08-27 18:11:37
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31294/drivers/incore Modified Files: fs_incore.c Log Message: Cray SPR 729924. Bad return values. Was returning the negated error code instead of -1. Fixed. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -w -b -B -p -r1.20 -r1.21 --- fs_incore.c 26 Jul 2004 17:09:21 -0000 1.20 +++ fs_incore.c 27 Aug 2004 18:11:24 -0000 1.21 @@ -165,7 +165,7 @@ static void _sysio_incore_inop_gone(stru #define _sysio_incore_dirop_symlink \ (int (*)(struct pnode *, const char *))_sysio_do_enosys #define _sysio_incore_dirop_readlink \ - (int (*)(struct pnode *, char *, size_t))_sysio_do_einval + (int (*)(struct pnode *, char *, size_t))_sysio_do_enosys #define _sysio_incore_dirop_read \ (int (*)(struct inode *, \ struct ioctx *))_sysio_do_eisdir |
From: Lee W. <lw...@us...> - 2004-09-21 16:18:53
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25715/drivers/incore Modified Files: fs_incore.c Log Message: From Henry Pierce at Cray; A chdir() to a directory without `x' permission should not succeed but does. This required that inodes now carry the full attributes -- Not just the mode bits. That's a bug change. Driver writers; 1) _sysio_i_new is altered. It needs the full intnl_stat structure now. 2) Your lookup function should refresh the inode attributes. 3) We don't keep an inode dirty bit. Hopefully, you've been pushing changes at the time of the operation instead of waiting until the inode was flushed or somesuch. Maybe you keep an internal dirty bit? Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -w -b -B -p -r1.21 -r1.22 --- fs_incore.c 27 Aug 2004 18:11:24 -0000 1.21 +++ fs_incore.c 21 Sep 2004 16:18:13 -0000 1.22 @@ -85,7 +85,6 @@ */ struct incore_inode { LIST_ENTRY(incore_inode) ici_link; /* i-nodes list link */ - unsigned ici_revalidate : 1; /* synch sys inode? */ struct intnl_stat ici_st; /* attrs */ struct file_identifier ici_fileid; /* file ID */ void *ici_data; /* file data */ @@ -419,7 +418,6 @@ incore_i_alloc(struct incore_filesys *ic icino = malloc(sizeof(struct incore_inode)); if (!icino) return NULL; - icino->ici_revalidate = 0; icino->ici_st = *st; icino->ici_fileid.fid_data = &icino->ici_st.st_ino; icino->ici_fileid.fid_len = sizeof(icino->ici_st.st_ino); @@ -634,8 +632,7 @@ _sysio_incore_fsswop_mount(const char *s rooti = _sysio_i_new(fs, &icino->ici_fileid, - icino->ici_st.st_mode, - 0, + &icino->ici_st, 1, &_sysio_incore_dir_ops, icino); @@ -809,10 +806,7 @@ _sysio_incore_dirop_lookup(struct pnode if (*inop) { icino = I2IC(*inop); assert(icino); - if (icino->ici_revalidate) { - (*inop)->i_mode = icino->ici_st.st_mode; - icino->ici_revalidate = 0; - } + (*inop)->i_stbuf = icino->ici_st; return 0; } @@ -856,8 +850,7 @@ _sysio_incore_dirop_lookup(struct pnode ino = _sysio_i_new(ino->i_fs, &icino->ici_fileid, - icino->ici_st.st_mode, - 0, + &icino->ici_st 1, ops, icino); @@ -911,7 +904,6 @@ _sysio_incore_inop_setattr(struct pnode if (mask & SETATTR_MODE) { icino->ici_st.st_mode = (icino->ici_st.st_mode & S_IFMT) | (stbuf->st_mode & 07777); - icino->ici_revalidate = 1; } if (mask & SETATTR_MTIME) icino->ici_st.st_mtime = stbuf->st_mtime; @@ -923,6 +915,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; out: return err; } @@ -1167,8 +1160,7 @@ _sysio_incore_dirop_mkdir(struct pnode * ino = _sysio_i_new(pno->p_parent->p_base->pb_ino->i_fs, &icino->ici_fileid, - stat.st_mode, - 0, + &stat, 1, &_sysio_incore_dir_ops, icino); @@ -1274,7 +1266,7 @@ _sysio_incore_dirop_rmdir(struct pnode * } static int -incore_create(struct pnode *pno, struct intnl_stat *st) +incore_create(struct pnode *pno, struct intnl_stat *stat) { struct inode *dino, *ino; struct incore_inode *icino; @@ -1283,7 +1275,7 @@ incore_create(struct pnode *pno, struct dino = pno->p_parent->p_base->pb_ino; assert(dino); - icino = incore_i_alloc(FS2ICFS(dino->i_fs), st); + icino = incore_i_alloc(FS2ICFS(dino->i_fs), stat); if (!icino) return -ENOSPC; @@ -1293,10 +1285,9 @@ incore_create(struct pnode *pno, struct ino = _sysio_i_new(dino->i_fs, &icino->ici_fileid, - st->st_mode, - st->st_rdev, + stat, 1, - S_ISREG(st->st_mode) + S_ISREG(stat->st_mode) ? &_sysio_incore_file_ops : &_sysio_incore_dev_ops, icino); @@ -1311,7 +1302,7 @@ incore_create(struct pnode *pno, struct err = incore_directory_insert(I2IC(dino), &pno->p_base->pb_name, - st->st_ino, + stat->st_ino, INCORE_D_TYPEOF(icino->ici_st.st_mode)); if (err) { I_RELE(ino); @@ -1372,7 +1363,7 @@ _sysio_incore_dirop_link(struct pnode *o int err; assert(!new->p_base->pb_ino); - assert(!S_ISDIR(old->p_base->pb_ino->i_mode)); + assert(!S_ISDIR(old->p_base->pb_ino->i_stbuf.st_mode)); /* * Can bump the link count? |
From: Lee W. <lw...@us...> - 2005-01-25 00:38:07
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22054/drivers/incore Modified Files: fs_incore.c Log Message: Finish support for compile-time selection of external names. There were many alias directives that had not been modified to use SYSIO_INTERFACE_NAME. There were some calls that needed that macro applied. The include files needed some massaging. Particularly xtio.h. One big gotcha; In libsysio, xtio.h must now be included *after* sysio.h or it will redefine SYSIO_INTERFACE_NAME. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -w -b -B -p -r1.22 -r1.23 --- fs_incore.c 21 Sep 2004 16:18:13 -0000 1.22 +++ fs_incore.c 25 Jan 2005 00:36:47 -0000 1.23 @@ -61,8 +61,8 @@ #endif #include <sys/queue.h> -#include "xtio.h" #include "sysio.h" +#include "xtio.h" #include "fs.h" #include "mount.h" #include "inode.h" |
From: Lee W. <lw...@us...> - 2005-08-04 20:17:17
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4518/drivers/incore Modified Files: fs_incore.c Log Message: Removed the internal getdirentries inode operation. The getdirentries function does not return the *next* block in it's basep argument. It simply return the cookie for the current block. We needed one that returns the *next*, so a new interface called filldirentries is present with this change. It takes, as it's second argument, a pointer to a value/result pair. The value should be set to the position to be read. The result is the position of the next block. All the included drivers have been updated. External drivers will require similar updates. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -w -b -B -p -r1.23 -r1.24 --- fs_incore.c 25 Jan 2005 00:36:47 -0000 1.23 +++ fs_incore.c 4 Aug 2005 20:17:09 -0000 1.24 @@ -131,10 +131,10 @@ static int _sysio_incore_inop_setattr(st struct inode *ino, unsigned mask, struct intnl_stat *stbuf); -static ssize_t _sysio_incore_dirop_getdirentries(struct inode *ino, +static ssize_t _sysio_incore_dirop_filldirentries(struct inode *ino, + _SYSIO_OFF_T *posp, char *buf, - size_t nbytes, - _SYSIO_OFF_T *basep); + 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); @@ -187,7 +187,7 @@ static struct inode_ops _sysio_incore_di _sysio_incore_dirop_lookup, _sysio_incore_inop_getattr, _sysio_incore_inop_setattr, - _sysio_incore_dirop_getdirentries, + _sysio_incore_dirop_filldirentries, _sysio_incore_dirop_mkdir, _sysio_incore_dirop_rmdir, _sysio_incore_dirop_symlink, @@ -217,11 +217,11 @@ static struct inode_ops _sysio_incore_di struct inode **, \ struct intent *, \ const char *))_sysio_do_illop -#define _sysio_incore_filop_getdirentries \ +#define _sysio_incore_filop_filldirentries \ (ssize_t (*)(struct inode *, \ + _SYSIO_OFF_T *, \ char *, \ - size_t, \ - _SYSIO_OFF_T *))_sysio_do_illop + size_t))_sysio_do_illop #define _sysio_incore_filop_mkdir \ (int (*)(struct pnode *, mode_t))_sysio_do_illop #define _sysio_incore_filop_rmdir \ @@ -243,7 +243,7 @@ static struct inode_ops _sysio_incore_fi _sysio_incore_filop_lookup, _sysio_incore_inop_getattr, _sysio_incore_inop_setattr, - _sysio_incore_filop_getdirentries, + _sysio_incore_filop_filldirentries, _sysio_incore_filop_mkdir, _sysio_incore_filop_rmdir, _sysio_incore_filop_symlink, @@ -272,7 +272,7 @@ static struct inode_ops _sysio_incore_de _sysio_incore_filop_lookup, _sysio_incore_inop_getattr, _sysio_incore_inop_setattr, - _sysio_incore_filop_getdirentries, + _sysio_incore_filop_filldirentries, _sysio_incore_filop_mkdir, _sysio_incore_filop_rmdir, _sysio_incore_filop_symlink, @@ -955,31 +955,30 @@ incore_directory_enumerate(struct intnl_ } static ssize_t -_sysio_incore_dirop_getdirentries(struct inode *ino, +_sysio_incore_dirop_filldirentries(struct inode *ino, + _SYSIO_OFF_T *posp, char *buf, - size_t nbytes, - _SYSIO_OFF_T *basep) + size_t nbytes) { struct incore_inode *icino = I2IC(ino); off_t off; struct intnl_dirent *de; struct copy_info copy_info; - if (*basep > icino->ici_st.st_size) + if (*posp >= icino->ici_st.st_size) return 0; de = incore_directory_probe(icino->ici_data, icino->ici_st.st_size, - *basep, + *posp, (probe_ty )incore_directory_position, NULL, - (char *)icino->ici_data + *basep); + (char *)icino->ici_data + *posp); if (!de) { /* * Past EOF. */ - *basep = 0; return 0; } @@ -997,7 +996,7 @@ _sysio_incore_dirop_getdirentries(struct icino->ici_st.st_atime = time(NULL); if (!nbytes) return -EOVERFLOW; - *basep = nbytes; + *posp += nbytes; return (ssize_t )nbytes; } |
From: Lee W. <lw...@us...> - 2007-03-09 19:35:31
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv32320/drivers/incore Modified Files: fs_incore.c Log Message: Various permission checks are implemented in the library now. When run as a normal user (almost always the case) we now need a way to create incore file systems with owner and group set to that of the creator instead of some hard value from an init string. This change: 1) Makes the user and group modifiers to the type argument optional. 2) Changes the syntax of that modifier -- BEWARE! It is now [+<uid>][-<gid>]. Existing init strings will definately break with this change. I hate saying it but it will be because "it's not a bug, it's a feature." Ugh. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -w -b -B -p -r1.24 -r1.25 --- fs_incore.c 4 Aug 2005 20:17:09 -0000 1.24 +++ fs_incore.c 9 Mar 2007 19:35:27 -0000 1.25 @@ -546,29 +546,40 @@ _sysio_incore_fsswop_mount(const char *s * Source is a specification for the root attributes of this * new file system in the format: * - * <permissions>+<owner>+<group> + * <permissions>[+<owner>][-<group>] */ ul = strtoul(source, &cp, 0); mode = (mode_t )ul & 07777; - if (*cp != '+' || - (ul == ULONG_MAX && errno == ERANGE) || + uid = getuid(); /* default */ + gid = getgid(); /* default */ + while (*cp != '\0') { + /* + * Get user and/or group. + */ + if (*cp == '+') { + if ((ul == ULONG_MAX && errno == ERANGE) || (unsigned long)mode != ul || mode > 07777) return -EINVAL; source = cp; l = strtol(source, &cp, 0); uid = (uid_t )l; - if (*cp != '+' || - ((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE) || + if (((l == LONG_MIN || l == LONG_MAX) && + errno == ERANGE) || (long )uid != l) return -EINVAL; + } + if (*cp == '-') { source = cp; l = strtol(source, &cp, 0); gid = (gid_t )l; - if (*cp || - ((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE) || + if (((l == LONG_MIN || l == LONG_MAX) && + errno == ERANGE) || (long )gid != l) return -EINVAL; + } + return -EINVAL; + } err = 0; |
From: Lee W. <lw...@us...> - 2007-03-09 23:15:40
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv31045/drivers/incore Modified Files: fs_incore.c Log Message: Nope. I'm not going to do it. I just can't break the backward compatibility in good conscience. The incore type mount directive must either have both uid and gid or neither. If both, the original syntax is used. Specifically, the usage now is: "incore:[+<uid>+<gid>] Which is backward compatible. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -w -b -B -p -r1.25 -r1.26 --- fs_incore.c 9 Mar 2007 19:35:27 -0000 1.25 +++ fs_incore.c 9 Mar 2007 23:15:37 -0000 1.26 @@ -552,12 +552,12 @@ _sysio_incore_fsswop_mount(const char *s mode = (mode_t )ul & 07777; uid = getuid(); /* default */ gid = getgid(); /* default */ - while (*cp != '\0') { + if (*cp != '\0') { /* * Get user and/or group. */ - if (*cp == '+') { - if ((ul == ULONG_MAX && errno == ERANGE) || + if (*cp != '+' || + (ul == ULONG_MAX && errno == ERANGE) || (unsigned long)mode != ul || mode > 07777) return -EINVAL; @@ -568,8 +568,8 @@ _sysio_incore_fsswop_mount(const char *s errno == ERANGE) || (long )uid != l) return -EINVAL; - } - if (*cp == '-') { + if (*cp != '+') + return -EINVAL; source = cp; l = strtol(source, &cp, 0); gid = (gid_t )l; @@ -577,7 +577,7 @@ _sysio_incore_fsswop_mount(const char *s errno == ERANGE) || (long )gid != l) return -EINVAL; - } + if (*cp != '\0') return -EINVAL; } |
From: Lee W. <lw...@us...> - 2007-03-14 19:14:39
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv5568/drivers/incore Modified Files: fs_incore.c Log Message: Fixed a serious bug reported by Wally Wang at Cray (SPR #731860): The incore driver will match a directory entry containing a name equal to or longer than the one we are searching for. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -w -b -B -p -r1.26 -r1.27 --- fs_incore.c 9 Mar 2007 23:15:37 -0000 1.26 +++ fs_incore.c 14 Mar 2007 19:14:33 -0000 1.27 @@ -778,18 +778,29 @@ incore_directory_probe(void *data, static struct intnl_dirent * incore_directory_match(struct intnl_dirent *de, - size_t reclen __IS_UNUSED, + size_t reclen, struct lookup_data *ld) { + size_t len; #if defined(BSD) || defined(REDSTORM) if (IFTODT(de->d_type) == DT_WHT) return NULL; #endif - if ( #ifdef _DIRENT_HAVE_D_NAMLEN - ld->name->len == de->d_namlen && + len = de->d_namlen; +#else + { + const char *cp, *end; + + cp = de->d_name; + end = (const char *)de + reclen; + while (cp < end && *cp != '\0') + cp++; + len = cp - de->d_name; + } #endif + if (ld->name->len == len && strncmp(de->d_name, ld->name->name, ld->name->len) == 0) return de; ld->de = de; |
From: Lee W. <lw...@us...> - 2007-04-12 19:15:41
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv25122/drivers/incore Modified Files: fs_incore.c Log Message: Too small a buffer passed would result in a premature EOF. Per Cray SPR #734717. The directory enumeration routine now tracks the number of valid copies it could have made. The filldirentries routine now checks that counter. If non-zero but no data was copied, it will return the proper "invalid argument" error. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -w -b -B -p -r1.27 -r1.28 --- fs_incore.c 14 Mar 2007 19:14:33 -0000 1.27 +++ fs_incore.c 12 Apr 2007 19:15:37 -0000 1.28 @@ -954,20 +954,29 @@ incore_directory_position(struct intnl_d struct copy_info { void *data; size_t nbytes; + unsigned count; }; /* * Eumeration callback. * * Note: - * On those systems supporting white-out entries, they are returned. On - * systems without, they are not. + * Whiteout entries are never returned. */ static void * incore_directory_enumerate(struct intnl_dirent *de, size_t reclen, struct copy_info *cinfo) { +#ifdef DT_WHT + if (de->d_type == DT_WHT) { + /* + * Keep going but skip the copy. + */ + return NULL; + } +#endif + cinfo->count++; if (reclen > cinfo->nbytes) return de; (void *)memcpy(cinfo->data, de, reclen); @@ -1006,6 +1015,7 @@ _sysio_incore_dirop_filldirentries(struc copy_info.data = buf; copy_info.nbytes = nbytes; + copy_info.count = 0; off = (char *)de - (char *)icino->ici_data; de = incore_directory_probe(de, @@ -1014,10 +1024,14 @@ _sysio_incore_dirop_filldirentries(struc (probe_ty )incore_directory_enumerate, NULL, ©_info); - nbytes -= copy_info.nbytes; icino->ici_st.st_atime = time(NULL); + if (nbytes == copy_info.nbytes && copy_info.count) + return -EINVAL; + nbytes -= copy_info.nbytes; +#if 0 if (!nbytes) return -EOVERFLOW; +#endif *posp += nbytes; return (ssize_t )nbytes; } |
From: Lee W. <lw...@us...> - 2007-04-30 16:52:27
|
Update of /cvsroot/libsysio/libsysio/drivers/incore In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv2000/drivers/incore Modified Files: fs_incore.c Log Message: Merged "unification" branch. First, the changes alter the core to perform pnode-ops by pnode. However, it maintains the pre-existing interface in order to minimize driver changes. Second, more detailed tracing information is available now in the form of a tag, indicating which function the data is from, as well as arguments and return data. Note1: The S_IFDIR bit is no longer set when the pnode-op mkdir function is called. If you need that, set it in your driver. Note2: It is possible to encounter a disconnected tree in _sysio_pb_path. If so, it returns an empty string. This *might* be good enough for your driver. If not, you'll need a change for this as well -- In fact, you should go ahead and change it anyway. Instead of _sysio_pb_path, use _sysio_pb_pathof. This new function takes the base pnode and a pointer to a string. It returns an integer. The usual zero on success or a negated errno on failure. Note3: Sockets support is horribly broken and won't build. As far as I know, this was never used. Unless somebody tells me differently, sockets support will be deprecated in the next release. Otherwise, let me know and I'll fix it. Index: fs_incore.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -w -b -B -p -r1.28 -r1.29 --- fs_incore.c 12 Apr 2007 19:15:37 -0000 1.28 +++ fs_incore.c 30 Apr 2007 16:52:19 -0000 1.29 @@ -212,11 +212,10 @@ static struct inode_ops _sysio_incore_di _sysio_incore_inop_gone }; -#define _sysio_incore_filop_lookup \ - (int (*)(struct pnode *, \ - struct inode **, \ - struct intent *, \ - const char *))_sysio_do_illop +static int _sysio_incore_filop_lookup(struct pnode *pno, + struct inode **inop, + struct intent *intnt, + const char *path); #define _sysio_incore_filop_filldirentries \ (ssize_t (*)(struct inode *, \ _SYSIO_OFF_T *, \ @@ -888,6 +887,26 @@ out: } static int +_sysio_incore_filop_lookup(struct pnode *pno __IS_UNUSED, + struct inode **inop, + struct intent *intnt __IS_UNUSED, + const char *path __IS_UNUSED) +{ + struct incore_inode *icino; + + /* + * We revalidate only. + */ + if (!*inop) + return -ENOTDIR; + + icino = I2IC(*inop); + assert(icino); + (*inop)->i_stbuf = icino->ici_st; + return 0; +} + +static int _sysio_incore_inop_getattr(struct pnode *pno, struct inode *ino, struct intnl_stat *stbuf) |