/* lfs_vfsops.c 6.3 84/02/07 */
register struct inode
*ip
;
uap
= (struct a
*)u
.u_ap
;
u
.u_error
= getmdev(&dev
);
u
.u_dirp
= (caddr_t
)uap
->freg
;
ip
= namei(uchar
, LOOKUP
| NOCACHE
, 1);
if (ip
->i_count
!=1 || (ip
->i_mode
&IFMT
) != IFDIR
) {
fs
= mountfs(dev
, uap
->ronly
, ip
);
for (cp
= fs
->fs_fsmnt
; cp
< &fs
->fs_fsmnt
[sizeof(fs
->fs_fsmnt
) - 2]; )
if ((*cp
++ = uchar()) == 0)
u
.u_dirp
--; /* get 0 again */
/* this routine has lousy error codes */
/* this routine has races if running twice */
register struct mount
*mp
= 0;
register struct buf
*bp
= 0;
(*bdevsw
[major(dev
)].d_open
)(dev
, ronly
? FREAD
: FREAD
|FWRITE
);
tp
= bread(dev
, SBLOCK
, SBSIZE
);
if (tp
->b_flags
& B_ERROR
)
for (mp
= &mount
[0]; mp
< &mount
[NMOUNT
]; mp
++)
if (mp
->m_bufp
!= 0 && dev
== mp
->m_dev
) {
for (mp
= &mount
[0]; mp
< &mount
[NMOUNT
]; mp
++)
mp
->m_bufp
= tp
; /* just to reserve this slot */
bp
= geteblk((int)fs
->fs_sbsize
);
bcopy((caddr_t
)tp
->b_un
.b_addr
, (caddr_t
)bp
->b_un
.b_addr
,
if (fs
->fs_magic
!= FS_MAGIC
|| fs
->fs_bsize
> MAXBSIZE
)
fs
->fs_ronly
= (ronly
!= 0);
blks
= howmany(fs
->fs_cssize
, fs
->fs_fsize
);
space
= wmemall(vmemall
, (int)fs
->fs_cssize
);
for (i
= 0; i
< blks
; i
+= fs
->fs_frag
) {
if (i
+ fs
->fs_frag
> blks
)
size
= (blks
- i
) * fs
->fs_fsize
;
tp
= bread(dev
, fsbtodb(fs
, fs
->fs_csaddr
+ i
), size
);
if (tp
->b_flags
&B_ERROR
) {
wmemfree(space
, (int)fs
->fs_cssize
);
bcopy((caddr_t
)tp
->b_un
.b_addr
, space
, (u_int
)size
);
fs
->fs_csp
[i
/ fs
->fs_frag
] = (struct csum
*)space
;
register struct mount
*mp
;
int stillopen
, flag
, error
;
register struct inode
*ip
;
for (mp
= &mount
[0]; mp
< &mount
[NMOUNT
]; mp
++)
if (mp
->m_bufp
!= NULL
&& dev
== mp
->m_dev
)
xumount(dev
); /* remove unused sticky files from text table */
nchinval(dev
); /* flush the name cache */
if ((stillopen
= iflush(dev
, mp
->m_qinod
)) < 0 && !forcibly
)
if ((stillopen
= iflush(dev
)) < 0 && !forcibly
)
return (EBUSY
); /* XXX */
* Here we have to iflush again to get rid of the quota inode.
* A drag, but it would be ugly to cheat, & this doesn't happen often
(void)iflush(dev
, (struct inode
*)NULL
);
fs
= mp
->m_bufp
->b_un
.b_fs
;
wmemfree((caddr_t
)fs
->fs_csp
[0], (int)fs
->fs_cssize
);
(*bdevsw
[major(dev
)].d_close
)(dev
, flag
);
register struct fs
*fs
= mp
->m_bufp
->b_un
.b_fs
;
bp
= getblk(mp
->m_dev
, SBLOCK
, (int)fs
->fs_sbsize
);
bcopy((caddr_t
)fs
, bp
->b_un
.b_addr
, (u_int
)fs
->fs_sbsize
);
blks
= howmany(fs
->fs_cssize
, fs
->fs_fsize
);
space
= (caddr_t
)fs
->fs_csp
[0];
for (i
= 0; i
< blks
; i
+= fs
->fs_frag
) {
if (i
+ fs
->fs_frag
> blks
)
size
= (blks
- i
) * fs
->fs_fsize
;
bp
= getblk(mp
->m_dev
, fsbtodb(fs
, fs
->fs_csaddr
+ i
), size
);
bcopy(space
, bp
->b_un
.b_addr
, (u_int
)size
);
* Common code for mount and umount.
* Check that the user's argument is a reasonable
* thing on which to mount, and return the device number if so.
register struct inode
*ip
;
ip
= namei(uchar
, LOOKUP
, 1);
if ((ip
->i_mode
&IFMT
) != IFBLK
) {
if (major(dev
) >= nblkdev
)