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
Add copyright
[unix-history]
/
usr
/
src
/
sys
/
ufs
/
lfs
/
lfs_vfsops.c
diff --git
a/usr/src/sys/ufs/lfs/lfs_vfsops.c
b/usr/src/sys/ufs/lfs/lfs_vfsops.c
index
f154e58
..
66e84b2
100644
(file)
--- a/
usr/src/sys/ufs/lfs/lfs_vfsops.c
+++ b/
usr/src/sys/ufs/lfs/lfs_vfsops.c
@@
-1,17
+1,22
@@
-/* lfs_vfsops.c 6.4 84/06/26 */
+/*
+ * Copyright (c) 1982 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ * @(#)lfs_vfsops.c 6.11 (Berkeley) %G%
+ */
-#include "../h/param.h"
-#include "../h/systm.h"
-#include "../h/dir.h"
-#include "../h/user.h"
-#include "../h/inode.h"
-#include "../h/proc.h"
-#include "../h/fs.h"
-#include "../h/buf.h"
-#include "../h/mount.h"
-#include "../h/file.h"
-#include "../h/nami.h"
-#include "../h/conf.h"
+#include "param.h"
+#include "systm.h"
+#include "dir.h"
+#include "user.h"
+#include "inode.h"
+#include "proc.h"
+#include "fs.h"
+#include "buf.h"
+#include "mount.h"
+#include "file.h"
+#include "conf.h"
smount()
{
smount()
{
@@
-19,33
+24,38
@@
smount()
char *fspec;
char *freg;
int ronly;
char *fspec;
char *freg;
int ronly;
- } *uap;
+ } *uap
= (struct a *)u.u_ap
;
dev_t dev;
register struct inode *ip;
register struct fs *fs;
register char *cp;
dev_t dev;
register struct inode *ip;
register struct fs *fs;
register char *cp;
+ register struct nameidata *ndp = &u.u_nd;
+ u_int len;
- uap = (struct a *)u.u_ap;
- u.u_error = getmdev(&dev);
+ u.u_error = getmdev(&dev, uap->fspec);
if (u.u_error)
return;
if (u.u_error)
return;
- u.u_dirp = (caddr_t)uap->freg;
- ip = namei(uchar, LOOKUP | NOCACHE, 1);
+ ndp->ni_nameiop = LOOKUP | NOCACHE | FOLLOW;
+ ndp->ni_segflg = UIO_USERSPACE;
+ ndp->ni_dirp = (caddr_t)uap->freg;
+ ip = namei(ndp);
if (ip == NULL)
return;
if (ip == NULL)
return;
- if (ip->i_count
!=1 || (ip->i_mode&IFMT) != IFDIR
) {
+ if (ip->i_count
!= 1
) {
iput(ip);
u.u_error = EBUSY;
return;
}
iput(ip);
u.u_error = EBUSY;
return;
}
+ if ((ip->i_mode&IFMT) != IFDIR) {
+ iput(ip);
+ u.u_error = ENOTDIR;
+ return;
+ }
fs = mountfs(dev, uap->ronly, ip);
if (fs == 0)
return;
fs = mountfs(dev, uap->ronly, ip);
if (fs == 0)
return;
- u.u_dirp = uap->freg;
- for (cp = fs->fs_fsmnt; cp < &fs->fs_fsmnt[sizeof(fs->fs_fsmnt) - 2]; )
- if ((*cp++ = uchar()) == 0)
- u.u_dirp--; /* get 0 again */
- *cp = 0;
+ (void) copyinstr(uap->freg, fs->fs_fsmnt, sizeof(fs->fs_fsmnt)-1, &len);
+ bzero(fs->fs_fsmnt + len, sizeof (fs->fs_fsmnt) - len);
}
/* this routine has races if running twice */
}
/* this routine has races if running twice */
@@
-63,11
+73,13
@@
mountfs(dev, ronly, ip)
caddr_t space;
int i, size;
register error;
caddr_t space;
int i, size;
register error;
+ int needclose = 0;
error =
(*bdevsw[major(dev)].d_open)(dev, ronly ? FREAD : FREAD|FWRITE);
if (error)
goto out;
error =
(*bdevsw[major(dev)].d_open)(dev, ronly ? FREAD : FREAD|FWRITE);
if (error)
goto out;
+ needclose = 1;
tp = bread(dev, SBLOCK, SBSIZE);
if (tp->b_flags & B_ERROR)
goto out;
tp = bread(dev, SBLOCK, SBSIZE);
if (tp->b_flags & B_ERROR)
goto out;
@@
-118,7
+130,7
@@
found:
goto out;
}
bcopy((caddr_t)tp->b_un.b_addr, space, (u_int)size);
goto out;
}
bcopy((caddr_t)tp->b_un.b_addr, space, (u_int)size);
- fs->fs_csp[
i / fs->fs_frag
] = (struct csum *)space;
+ fs->fs_csp[
fragstoblks(fs, i)
] = (struct csum *)space;
space += size;
brelse(tp);
tp = 0;
space += size;
brelse(tp);
tp = 0;
@@
-141,6
+153,9
@@
out:
brelse(bp);
if (tp)
brelse(tp);
brelse(bp);
if (tp)
brelse(tp);
+ if (needclose)
+ (*bdevsw[major(dev)].d_close)(dev, ronly ? FREAD : FREAD|FWRITE);
+ binval(dev);
u.u_error = error;
return (0);
}
u.u_error = error;
return (0);
}
@@
-149,12
+164,13
@@
umount()
{
struct a {
char *fspec;
{
struct a {
char *fspec;
- };
+ }
*uap = (struct a *)u.u_ap
;
- u.u_error = unmount1(0);
+ u.u_error = unmount1(
uap->fspec,
0);
}
}
-unmount1(forcibly)
+unmount1(fname, forcibly)
+ caddr_t fname;
int forcibly;
{
dev_t dev;
int forcibly;
{
dev_t dev;
@@
-163,7
+179,7
@@
unmount1(forcibly)
register struct inode *ip;
register struct fs *fs;
register struct inode *ip;
register struct fs *fs;
- error = getmdev(&dev);
+ error = getmdev(&dev
, fname
);
if (error)
return (error);
for (mp = &mount[0]; mp < &mount[NMOUNT]; mp++)
if (error)
return (error);
for (mp = &mount[0]; mp < &mount[NMOUNT]; mp++)
@@
-237,17
+253,25
@@
sbupdate(mp)
* Check that the user's argument is a reasonable
* thing on which to mount, and return the device number if so.
*/
* Check that the user's argument is a reasonable
* thing on which to mount, and return the device number if so.
*/
-getmdev(pdev)
+getmdev(pdev, fname)
+ caddr_t fname;
dev_t *pdev;
{
dev_t dev;
register struct inode *ip;
dev_t *pdev;
{
dev_t dev;
register struct inode *ip;
+ register struct nameidata *ndp = &u.u_nd;
if (!suser())
return (u.u_error);
if (!suser())
return (u.u_error);
- ip = namei(uchar, LOOKUP, 1);
- if (ip == NULL)
+ ndp->ni_nameiop = LOOKUP | FOLLOW;
+ ndp->ni_segflg = UIO_USERSPACE;
+ ndp->ni_dirp = fname;
+ ip = namei(ndp);
+ if (ip == NULL) {
+ if (u.u_error == ENOENT)
+ return (ENODEV); /* needs translation */
return (u.u_error);
return (u.u_error);
+ }
if ((ip->i_mode&IFMT) != IFBLK) {
iput(ip);
return (ENOTBLK);
if ((ip->i_mode&IFMT) != IFBLK) {
iput(ip);
return (ENOTBLK);