[Libsysio-commit] HEAD: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
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? |