projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fstat for ports now in pipe.c
[unix-history]
/
usr
/
src
/
sys
/
ufs
/
lfs
/
lfs_vnops.c
diff --git
a/usr/src/sys/ufs/lfs/lfs_vnops.c
b/usr/src/sys/ufs/lfs/lfs_vnops.c
index
90eef19
..
bd1fc0c
100644
(file)
--- a/
usr/src/sys/ufs/lfs/lfs_vnops.c
+++ b/
usr/src/sys/ufs/lfs/lfs_vnops.c
@@
-1,4
+1,4
@@
-/* lfs_vnops.c 4.1
%G%
*/
+/* lfs_vnops.c 4.1
0 81/04/28
*/
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
@@
-30,7
+30,11
@@
fstat()
fp = getf(uap->fdes);
if(fp == NULL)
return;
fp = getf(uap->fdes);
if(fp == NULL)
return;
- stat1(fp->f_inode, uap->sb, fp->f_flag&FPIPE? fp->f_un.f_offset: 0);
+ if (fp->f_flag&FPORT) {
+ ptstat(fp);
+ return;
+ }
+ stat1(fp->f_inode, uap->sb);
}
/*
}
/*
@@
-48,7
+52,7
@@
stat()
ip = namei(uchar, 0);
if(ip == NULL)
return;
ip = namei(uchar, 0);
if(ip == NULL)
return;
- stat1(ip, uap->sb
, (off_t)0
);
+ stat1(ip, uap->sb);
iput(ip);
}
iput(ip);
}
@@
-56,10
+60,9
@@
stat()
* The basic routine for fstat and stat:
* get the inode and pass appropriate parts back.
*/
* The basic routine for fstat and stat:
* get the inode and pass appropriate parts back.
*/
-stat1(ip, ub
, pipeadj
)
+stat1(ip, ub)
register struct inode *ip;
struct stat *ub;
register struct inode *ip;
struct stat *ub;
-off_t pipeadj;
{
register struct dinode *dp;
register struct buf *bp;
{
register struct dinode *dp;
register struct buf *bp;
@@
-76,7
+79,7
@@
off_t pipeadj;
ds.st_uid = ip->i_uid;
ds.st_gid = ip->i_gid;
ds.st_rdev = (dev_t)ip->i_un.i_rdev;
ds.st_uid = ip->i_uid;
ds.st_gid = ip->i_gid;
ds.st_rdev = (dev_t)ip->i_un.i_rdev;
- ds.st_size = ip->i_size
- pipeadj
;
+ ds.st_size = ip->i_size;
/*
* next the dates in the disk
*/
/*
* next the dates in the disk
*/
@@
-135,8
+138,7
@@
dup()
/*
* the mount system call.
*/
/*
* the mount system call.
*/
-smount()
-{
+smount() {
dev_t dev;
register struct inode *ip;
register struct mount *mp;
dev_t dev;
register struct inode *ip;
register struct mount *mp;
@@
-148,6
+150,7
@@
smount()
char *freg;
int ronly;
} *uap;
char *freg;
int ronly;
} *uap;
+ register char *cp;
uap = (struct a *)u.u_ap;
dev = getmdev();
uap = (struct a *)u.u_ap;
dev = getmdev();
@@
-181,14
+184,19
@@
smount()
}
mp->m_inodp = ip;
mp->m_dev = dev;
}
mp->m_inodp = ip;
mp->m_dev = dev;
-
mp->m_bufp = geteblk()
;
-
bcopy((caddr_t)bp->b_un.b_addr, mp->m_bufp->b_un.b_addr, BSIZE)
;
- fp =
mp->m_buf
p->b_un.b_filsys;
+
bp->b_flags |= B_LOCKED
;
+
mp->m_bufp = bp
;
+ fp =
b
p->b_un.b_filsys;
fp->s_ilock = 0;
fp->s_flock = 0;
fp->s_ronly = uap->ronly & 1;
fp->s_nbehind = 0;
fp->s_lasti = 1;
fp->s_ilock = 0;
fp->s_flock = 0;
fp->s_ronly = uap->ronly & 1;
fp->s_nbehind = 0;
fp->s_lasti = 1;
+ u.u_dirp = uap->freg;
+ for (cp = fp->s_fsmnt; cp < &fp->s_fsmnt[sizeof (fp->s_fsmnt) - 1]; )
+ if ((*cp++ = uchar()) == 0)
+ u.u_dirp--; /* get 0 again */
+ *cp = 0;
brelse(bp);
ip->i_flag |= IMOUNT;
prele(ip);
brelse(bp);
ip->i_flag |= IMOUNT;
prele(ip);
@@
-209,6
+217,7
@@
sumount()
register struct inode *ip;
register struct mount *mp;
struct buf *bp;
register struct inode *ip;
register struct mount *mp;
struct buf *bp;
+ int stillopen, flag;
register struct a {
char *fspec;
};
register struct a {
char *fspec;
};
@@
-225,20
+234,29
@@
sumount()
return;
found:
return;
found:
- for(ip = &inode[0]; ip < &inode[NINODE]; ip++)
- if(ip->i_number != 0 && dev == ip->i_dev) {
+ stillopen = 0;
+ for(ip = inode; ip < inodeNINODE; ip++)
+ if (ip->i_number != 0 && dev == ip->i_dev) {
u.u_error = EBUSY;
return;
u.u_error = EBUSY;
return;
- }
- mpurge(mp - &mount[0]);
-
(*bdevsw[major(dev)].d_close)(dev, 0)
;
+ }
else if (ip->i_number != 0 && (ip->i_mode&IFMT) == IFBLK &&
+ ip->i_un.i_rdev == dev)
+
stillopen++
;
ip = mp->m_inodp;
ip->i_flag &= ~IMOUNT;
plock(ip);
iput(ip);
ip = mp->m_inodp;
ip->i_flag &= ~IMOUNT;
plock(ip);
iput(ip);
- bp = mp->m_bufp;
+ if ((bp = getblk(dev, SUPERB)) != mp->m_bufp)
+ panic("umount");
+ bp->b_flags &= ~B_LOCKED;
+ flag = !bp->b_un.b_filsys->s_ronly;
mp->m_bufp = NULL;
brelse(bp);
mp->m_bufp = NULL;
brelse(bp);
+ mpurge(mp - &mount[0]);
+ if (!stillopen) {
+ (*bdevsw[major(dev)].d_close)(dev, flag);
+ binval(dev);
+ }
}
/*
}
/*
@@
-252,10
+270,8
@@
getmdev()
dev_t dev;
register struct inode *ip;
dev_t dev;
register struct inode *ip;
-#ifdef UCB
if (!suser())
return(NODEV);
if (!suser())
return(NODEV);
-#endif
ip = namei(uchar, 0);
if(ip == NULL)
return(NODEV);
ip = namei(uchar, 0);
if(ip == NULL)
return(NODEV);