X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/cfef43737c9be4fd12e0f4cb87d50ed730391313..c43604c7566af0a35bc20cea474e88e0ad5fde69:/usr/src/sys/ufs/ffs/ufs_vnops.c diff --git a/usr/src/sys/ufs/ffs/ufs_vnops.c b/usr/src/sys/ufs/ffs/ufs_vnops.c index f7f51d5278..a1818b5d2e 100644 --- a/usr/src/sys/ufs/ffs/ufs_vnops.c +++ b/usr/src/sys/ufs/ffs/ufs_vnops.c @@ -4,7 +4,7 @@ * * %sccs.include.redist.c% * - * @(#)ufs_vnops.c 7.72 (Berkeley) %G% + * @(#)ufs_vnops.c 7.109 (Berkeley) %G% */ #include @@ -19,9 +19,12 @@ #include #include #include -#include -#include #include +#include + +#include + +#include #include #include @@ -30,21 +33,10 @@ #include #include -int ufs_chmod __P((struct vnode *, int, struct proc *)); -int ufs_chown __P((struct vnode *, u_int, u_int, struct proc *)); - -enum vtype iftovt_tab[16] = { - VNON, VFIFO, VCHR, VNON, VDIR, VNON, VBLK, VNON, - VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VBAD, -}; -int vttoif_tab[9] = { - 0, IFREG, IFDIR, IFBLK, IFCHR, IFLNK, IFSOCK, IFIFO, IFMT, -}; +static int ufs_chmod __P((struct vnode *, int, struct ucred *, struct proc *)); +static int ufs_chown + __P((struct vnode *, uid_t, gid_t, struct ucred *, struct proc *)); -#ifdef _NOQUAD -#define SETHIGH(q, h) (q).val[_QUAD_HIGHWORD] = (h) -#define SETLOW(q, l) (q).val[_QUAD_LOWWORD] = (l) -#else /* QUAD */ union _qcvt { quad_t qcvt; long val[2]; @@ -61,23 +53,24 @@ union _qcvt { tmp.val[_QUAD_LOWWORD] = (l); \ (q) = tmp.qcvt; \ } -#endif /* QUAD */ /* * Create a regular file */ int -ufs_create(dvp, vpp, cnp, vap) /* converted to CN. */ -/* was: ufs_create(ndp, vap, p) */ - struct vnode *dvp; - struct vnode **vpp; - struct componentname *cnp; - struct vattr *vap; +ufs_create(ap) + struct vop_create_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; + } */ *ap; { int error; if (error = - ufs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode), dvp, vpp, cnp)) + ufs_makeinode(MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode), + ap->a_dvp, ap->a_vpp, ap->a_cnp)) return (error); return (0); } @@ -87,18 +80,22 @@ ufs_create(dvp, vpp, cnp, vap) /* converted to CN. */ */ /* ARGSUSED */ int -ufs_mknod(dvp, vpp, cnp, vap) /* converted to CN. */ -/* was: ufs_mknod(ndp, vap, cred, p) */ - struct vnode *dvp; - struct vnode **vpp; - struct componentname *cnp; - struct vattr *vap; +ufs_mknod(ap) + struct vop_mknod_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; + } */ *ap; { + register struct vattr *vap = ap->a_vap; + register struct vnode **vpp = ap->a_vpp; register struct inode *ip; int error; if (error = - ufs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode), dvp, vpp, cnp)) + ufs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode), + ap->a_dvp, vpp, ap->a_cnp)) return (error); ip = VTOI(*vpp); ip->i_flag |= IACC|IUPD|ICHG; @@ -128,11 +125,13 @@ ufs_mknod(dvp, vpp, cnp, vap) /* converted to CN. */ */ /* ARGSUSED */ int -ufs_open(vp, mode, cred, p) - struct vnode *vp; - int mode; - struct ucred *cred; - struct proc *p; +ufs_open(ap) + struct vop_open_args /* { + struct vnode *a_vp; + int a_mode; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { return (0); @@ -145,15 +144,17 @@ ufs_open(vp, mode, cred, p) */ /* ARGSUSED */ int -ufs_close(vp, fflag, cred, p) - struct vnode *vp; - int fflag; - struct ucred *cred; - struct proc *p; +ufs_close(ap) + struct vop_close_args /* { + struct vnode *a_vp; + int a_fflag; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { - register struct inode *ip; + register struct vnode *vp = ap->a_vp; + register struct inode *ip = VTOI(vp); - ip = VTOI(vp); if (vp->v_usecount > 1 && !(ip->i_flag & ILOCKED)) ITIMES(ip, &time, &time); return (0); @@ -165,13 +166,18 @@ ufs_close(vp, fflag, cred, p) * super user is granted all permissions. */ int -ufs_access(vp, mode, cred, p) - struct vnode *vp; - register int mode; - struct ucred *cred; - struct proc *p; +ufs_access(ap) + struct vop_access_args /* { + struct vnode *a_vp; + int a_mode; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { + register struct vnode *vp = ap->a_vp; register struct inode *ip = VTOI(vp); + register struct ucred *cred = ap->a_cred; + mode_t mode = ap->a_mode; register gid_t *gp; int i, error; @@ -217,15 +223,18 @@ found: /* ARGSUSED */ int -ufs_getattr(vp, vap, cred, p) - struct vnode *vp; - register struct vattr *vap; - struct ucred *cred; - struct proc *p; +ufs_getattr(ap) + struct vop_getattr_args /* { + struct vnode *a_vp; + struct vattr *a_vap; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { - register struct inode *ip; + register struct vnode *vp = ap->a_vp; + register struct inode *ip = VTOI(vp); + register struct vattr *vap = ap->a_vap; - ip = VTOI(vp); ITIMES(ip, &time, &time); /* * Copy from inode table @@ -237,18 +246,10 @@ ufs_getattr(vp, vap, cred, p) vap->va_uid = ip->i_uid; vap->va_gid = ip->i_gid; vap->va_rdev = (dev_t)ip->i_rdev; -#ifdef tahoe - vap->va_size = ip->i_size; - vap->va_size_rsv = 0; -#else - vap->va_qsize = ip->i_din.di_qsize; -#endif - vap->va_atime.tv_sec = ip->i_atime; - vap->va_atime.tv_usec = 0; - vap->va_mtime.tv_sec = ip->i_mtime; - vap->va_mtime.tv_usec = 0; - vap->va_ctime.tv_sec = ip->i_ctime; - vap->va_ctime.tv_usec = 0; + vap->va_size = ip->i_din.di_size; + vap->va_atime = ip->i_atime; + vap->va_mtime = ip->i_mtime; + vap->va_ctime = ip->i_ctime; vap->va_flags = ip->i_flags; vap->va_gen = ip->i_gen; /* this doesn't belong here */ @@ -259,9 +260,6 @@ ufs_getattr(vp, vap, cred, p) else vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize; vap->va_bytes = dbtob(ip->i_blocks); -#ifdef _NOQUAD - vap->va_bytes_rsv = 0; -#endif vap->va_type = vp->v_type; vap->va_filerev = ip->i_modrev; return (0); @@ -271,13 +269,20 @@ ufs_getattr(vp, vap, cred, p) * Set attribute vnode op. called from several syscalls */ int -ufs_setattr(vp, vap, cred, p) - register struct vnode *vp; - register struct vattr *vap; - register struct ucred *cred; - struct proc *p; +ufs_setattr(ap) + struct vop_setattr_args /* { + struct vnode *a_vp; + struct vattr *a_vap; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { - register struct inode *ip; + register struct vattr *vap = ap->a_vap; + register struct vnode *vp = ap->a_vp; + register struct inode *ip = VTOI(vp); + register struct ucred *cred = ap->a_cred; + register struct proc *p = ap->a_p; + struct timeval atimeval, mtimeval; int error; /* @@ -292,31 +297,34 @@ ufs_setattr(vp, vap, cred, p) /* * Go through the fields and update iff not VNOVAL. */ - if (vap->va_uid != (u_short)VNOVAL || vap->va_gid != (u_short)VNOVAL) - if (error = ufs_chown(vp, vap->va_uid, vap->va_gid, p)) + if (vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL) + if (error = ufs_chown(vp, vap->va_uid, vap->va_gid, cred, p)) return (error); if (vap->va_size != VNOVAL) { if (vp->v_type == VDIR) return (EISDIR); - if (error = VOP_TRUNCATE(vp, vap->va_size, 0)) /* IO_SYNC? */ + if (error = VOP_TRUNCATE(vp, vap->va_size, 0, cred, p)) return (error); } ip = VTOI(vp); - if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) { + if (vap->va_atime.ts_sec != VNOVAL || vap->va_mtime.ts_sec != VNOVAL) { if (cred->cr_uid != ip->i_uid && (error = suser(cred, &p->p_acflag))) return (error); - if (vap->va_atime.tv_sec != VNOVAL) + if (vap->va_atime.ts_sec != VNOVAL) ip->i_flag |= IACC; - if (vap->va_mtime.tv_sec != VNOVAL) - ip->i_flag |= IUPD; - ip->i_flag |= ICHG; - if (error = VOP_UPDATE(vp, &vap->va_atime, &vap->va_mtime, 1)) + if (vap->va_mtime.ts_sec != VNOVAL) + ip->i_flag |= IUPD | ICHG; + atimeval.tv_sec = vap->va_atime.ts_sec; + atimeval.tv_usec = vap->va_atime.ts_nsec / 1000; + mtimeval.tv_sec = vap->va_mtime.ts_sec; + mtimeval.tv_usec = vap->va_mtime.ts_nsec / 1000; + if (error = VOP_UPDATE(vp, &atimeval, &mtimeval, 1)) return (error); } error = 0; - if (vap->va_mode != (u_short)VNOVAL) - error = ufs_chmod(vp, (int)vap->va_mode, p); + if (vap->va_mode != (mode_t)VNOVAL) + error = ufs_chmod(vp, (int)vap->va_mode, cred, p); if (vap->va_flags != VNOVAL) { if (cred->cr_uid != ip->i_uid && (error = suser(cred, &p->p_acflag))) @@ -337,12 +345,12 @@ ufs_setattr(vp, vap, cred, p) * Inode must be locked before calling. */ static int -ufs_chmod(vp, mode, p) +ufs_chmod(vp, mode, cred, p) register struct vnode *vp; register int mode; + register struct ucred *cred; struct proc *p; { - register struct ucred *cred = p->p_ucred; register struct inode *ip = VTOI(vp); int error; @@ -368,14 +376,14 @@ ufs_chmod(vp, mode, p) * inode must be locked prior to call. */ static int -ufs_chown(vp, uid, gid, p) +ufs_chown(vp, uid, gid, cred, p) register struct vnode *vp; - u_int uid; - u_int gid; + uid_t uid; + gid_t gid; + struct ucred *cred; struct proc *p; { register struct inode *ip = VTOI(vp); - register struct ucred *cred = p->p_ucred; uid_t ouid; gid_t ogid; int error = 0; @@ -384,9 +392,9 @@ ufs_chown(vp, uid, gid, p) long change; #endif - if (uid == (u_short)VNOVAL) + if (uid == (uid_t)VNOVAL) uid = ip->i_uid; - if (gid == (u_short)VNOVAL) + if (gid == (gid_t)VNOVAL) gid = ip->i_gid; /* * If we don't own the file, are trying to change the owner @@ -472,13 +480,15 @@ good: /* ARGSUSED */ int -ufs_ioctl(vp, com, data, fflag, cred, p) - struct vnode *vp; - int com; - caddr_t data; - int fflag; - struct ucred *cred; - struct proc *p; +ufs_ioctl(ap) + struct vop_ioctl_args /* { + struct vnode *a_vp; + int a_command; + caddr_t a_data; + int a_fflag; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { return (ENOTTY); @@ -486,11 +496,14 @@ ufs_ioctl(vp, com, data, fflag, cred, p) /* ARGSUSED */ int -ufs_select(vp, which, fflags, cred, p) - struct vnode *vp; - int which, fflags; - struct ucred *cred; - struct proc *p; +ufs_select(ap) + struct vop_select_args /* { + struct vnode *a_vp; + int a_which; + int a_fflags; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { /* @@ -506,11 +519,13 @@ ufs_select(vp, which, fflags, cred, p) */ /* ARGSUSED */ int -ufs_mmap(vp, fflags, cred, p) - struct vnode *vp; - int fflags; - struct ucred *cred; - struct proc *p; +ufs_mmap(ap) + struct vop_mmap_args /* { + struct vnode *a_vp; + int a_fflags; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { return (EINVAL); @@ -523,10 +538,13 @@ ufs_mmap(vp, fflags, cred, p) */ /* ARGSUSED */ int -ufs_seek(vp, oldoff, newoff, cred) - struct vnode *vp; - off_t oldoff, newoff; - struct ucred *cred; +ufs_seek(ap) + struct vop_seek_args /* { + struct vnode *a_vp; + off_t a_oldoff; + off_t a_newoff; + struct ucred *a_cred; + } */ *ap; { return (0); @@ -538,17 +556,19 @@ ufs_seek(vp, oldoff, newoff, cred) * in unlinking directories. */ int -ufs_remove(dvp, vp, cnp) /* converted to CN. */ -/* old: ufs_remove(ndp, p) */ - struct vnode *dvp, *vp; - struct componentname *cnp; +ufs_remove(ap) + struct vop_remove_args /* { + struct vnode *a_dvp; + struct vnode *a_vp; + struct componentname *a_cnp; + } */ *ap; { register struct inode *ip, *dp; int error; - ip = VTOI(vp); - dp = VTOI(dvp); - error = ufs_dirremove(dvp, cnp); + ip = VTOI(ap->a_vp); + dp = VTOI(ap->a_dvp); + error = ufs_dirremove(ap->a_dvp, ap->a_cnp); if (!error) { ip->i_nlink--; ip->i_flag |= ICHG; @@ -565,35 +585,50 @@ ufs_remove(dvp, vp, cnp) /* converted to CN. */ * link vnode call */ int -ufs_link(vp, tdvp, cnp) /* converted to CN. */ -/* old: ufs_link(vp, ndp, p) */ - register struct vnode *vp; /* source vnode */ - struct vnode *tdvp; - struct componentname *cnp; +ufs_link(ap) + struct vop_link_args /* { + struct vnode *a_vp; + struct vnode *a_tdvp; + struct componentname *a_cnp; + } */ *ap; { + register struct vnode *vp = ap->a_vp; + register struct vnode *tdvp = ap->a_tdvp; + register struct componentname *cnp = ap->a_cnp; register struct inode *ip; + struct timeval tv; int error; -#ifdef DIANOSTIC + if (vp->v_mount != tdvp->v_mount) { + VOP_ABORTOP(vp, cnp); + if (tdvp == vp) + vrele(vp); + else + vput(vp); + return (EXDEV); + } + +#ifdef DIAGNOSTIC if ((cnp->cn_flags & HASBUF) == 0) panic("ufs_link: no name"); #endif - ip = VTOI(vp); - if ((unsigned short)ip->i_nlink >= LINK_MAX) { + ip = VTOI(tdvp); + if ((nlink_t)ip->i_nlink >= LINK_MAX) { free(cnp->cn_pnbuf, M_NAMEI); return (EMLINK); } - if (tdvp != vp) + if (vp != tdvp) ILOCK(ip); ip->i_nlink++; ip->i_flag |= ICHG; - error = VOP_UPDATE(vp, &time, &time, 1); + tv = time; + error = VOP_UPDATE(tdvp, &tv, &tv, 1); if (!error) - error = ufs_direnter(ip, tdvp, cnp); - if (tdvp != vp) + error = ufs_direnter(ip, vp, cnp); + if (vp != tdvp) IUNLOCK(ip); FREE(cnp->cn_pnbuf, M_NAMEI); - vput(tdvp); + vput(vp); if (error) { ip->i_nlink--; ip->i_flag |= ICHG; @@ -608,26 +643,27 @@ ufs_link(vp, tdvp, cnp) /* converted to CN. */ * Used by lookup to re-aquire things. */ int -relookup(dvp, vpp, cnp) /* converted to CN */ +relookup(dvp, vpp, cnp) struct vnode *dvp, **vpp; struct componentname *cnp; { - register char *cp; /* pointer into pathname argument */ register struct vnode *dp = 0; /* the directory we are searching */ struct vnode *tdp; /* saved dp */ struct mount *mp; /* mount table entry */ int docache; /* == 0 do not cache last component */ int wantparent; /* 1 => wantparent or lockparent flag */ int rdonly; /* lookup read-only flag bit */ + char *cp; /* DEBUG: check name ptr/len */ + int newhash; /* DEBUG: check name hash */ int error = 0; - int newhash; /* * Setup: break out flag bits into variables. */ wantparent = cnp->cn_flags & (LOCKPARENT|WANTPARENT); docache = (cnp->cn_flags & NOCACHE) ^ NOCACHE; - if (cnp->cn_nameiop == DELETE || (wantparent && cnp->cn_nameiop != CREATE)) + if (cnp->cn_nameiop == DELETE || + (wantparent && cnp->cn_nameiop != CREATE)) docache = 0; rdonly = cnp->cn_flags & RDONLY; cnp->cn_flags &= ~ISSYMLINK; @@ -644,36 +680,16 @@ relookup(dvp, vpp, cnp) /* converted to CN */ * the name set the SAVENAME flag. When done, they assume * responsibility for freeing the pathname buffer. */ -/* NEEDWORK: is hash computed needed */ - newhash = 0; - for (cp = cnp->cn_nameptr; *cp != 0 && *cp != '/'; cp++) +#ifdef NAMEI_DIAGNOSTIC + for (newhash = 0, cp = cnp->cn_nameptr; *cp != 0 && *cp != '/'; cp++) newhash += (unsigned char)*cp; if (newhash != cnp->cn_hash) panic("relookup: bad hash"); if (cnp->cn_namelen != cp - cnp->cn_nameptr) panic ("relookup: bad len"); - if (cnp->cn_namelen >= NAME_MAX) { - error = ENAMETOOLONG; - goto bad; - } -#ifdef NAMEI_DIAGNOSTIC /* NEEDSWORK: should go */ - { char c = *cp; - *cp = '\0'; + if (*cp != 0) + panic("relookup: not last component"); printf("{%s}: ", cnp->cn_nameptr); - *cp = c; } -#endif -#if 0 - cnp->cn_pathlen -= cnp->cn_namelen; - ndp->ni_next = cp; -#endif -#if 0 - cnp->cn_flags |= MAKEENTRY; - if (*cp == '\0' && docache == 0) - cnp->cn_flags &= ~MAKEENTRY; - if (cnp->cn_namelen == 2 && - cnp->ni_nameptr[1] == '.' && cnp->cn_nameptr[0] == '.') - cnp->cn_flags |= ISDOTDOT; - else cnp->cn_flags &= ~ISDOTDOT; #endif /* @@ -698,37 +714,6 @@ relookup(dvp, vpp, cnp) /* converted to CN */ return (0); } - /* - * Handle "..": two special cases. - * 1. If at root directory (e.g. after chroot) - * then ignore it so can't get out. - * 2. If this vnode is the root of a mounted - * filesystem, then replace it with the - * vnode which was mounted on so we take the - * .. in the other file system. - */ -#if 0 - /* This shouldn't happen because rename throws out .. */ - /* NEEDSWORK: what to do about this? */ - if (cnp->cn_flags & ISDOTDOT) { - for (;;) { - if (dp == ndp->ni_rootdir) { - ndp->ni_dvp = dp; - ndp->ni_vp = dp; - VREF(dp); - goto nextname; - } - if ((dp->v_flag & VROOT) == 0 || - (cnp->cn_flags & NOCROSSMOUNT)) - break; - tdp = dp; - dp = dp->v_mount->mnt_vnodecovered; - vput(tdp); - VREF(dp); - VOP_LOCK(dp); - } - } -#endif if (cnp->cn_flags & ISDOTDOT) panic ("relookup: lookup on dot-dot"); @@ -740,11 +725,7 @@ relookup(dvp, vpp, cnp) /* converted to CN */ if (*vpp != NULL) panic("leaf should be empty"); #endif -#ifdef NAMEI_DIAGNOSTIC - printf("not found\n"); -#endif - if (cnp->cn_nameiop == LOOKUP || cnp->cn_nameiop == DELETE || - error != ENOENT || *cp != 0) + if (error != EJUSTRETURN) goto bad; /* * If creating and at end of pathname, then can consider @@ -754,94 +735,27 @@ relookup(dvp, vpp, cnp) /* converted to CN */ error = EROFS; goto bad; } + /* ASSERT(dvp == ndp->ni_startdir) */ + if (cnp->cn_flags & SAVESTART) + VREF(dvp); /* * We return with ni_vp NULL to indicate that the entry * doesn't currently exist, leaving a pointer to the * (possibly locked) directory inode in ndp->ni_dvp. */ -#ifdef JOHNH - /* - * no need because we don't need to do another lookup. - * NEEDSWORK: don't do release. - * but wait...let's try it a different way. - */ - if (cnp->cn_flags & SAVESTART) { -#if 0 - ndp->ni_startdir = ndp->ni_dvp; - VREF(ndp->ni_startdir); -#else - /* - * startdir == dvp, always - */ - VREF(dvp); -#endif - } -#endif return (0); } -#ifdef NAMEI_DIAGNOSTIC - printf("found\n"); -#endif - dp = *vpp; + +#ifdef DIAGNOSTIC /* * Check for symbolic link */ -#if 0 - if ((dp->v_type == VLNK) && - ((cnp->cn_flags & FOLLOW) || *ndp->ni_next == '/')) { - cnp->cn_flags |= ISSYMLINK; - return (0); - } -#endif - if (dp->v_type == VLNK) { + if (dp->v_type == VLNK && (cnp->cn_flags & FOLLOW)) panic ("relookup: symlink found.\n"); - }; - - /* - * Check to see if the vnode has been mounted on; - * if so find the root of the mounted file system. - */ -#if 0 - /* NEEDSWORK: mounts should not be crossed in cnlookup */ - /* - * Checked for in rename (returns EXDEV). - */ -mntloop: - while (dp->v_type == VDIR && (mp = dp->v_mountedhere) && - (cnp->cn_flags & NOCROSSMOUNT) == 0) { - if (mp->mnt_flag & MNT_MLOCK) { - mp->mnt_flag |= MNT_MWAIT; - sleep((caddr_t)mp, PVFS); - goto mntloop; - } - if (error = VFS_ROOT(dp->v_mountedhere, &tdp)) - goto bad2; - vput(dp); - ndp->ni_vp = dp = tdp; - } #endif - if (dp->v_type == VDIR && (dp->v_mountedhere)) - panic ("relookup: mount point encountered."); - nextname: - /* - * Not a symbolic link. If more pathname, - * continue at next component, else return. - */ -#if 0 - if (*ndp->ni_next == '/') { - cnp->cn_nameptr = ndp->ni_next; - while (*cnp->cn_nameptr == '/') { - ndp->ni_nameptr++; - ndp->ni_pathlen--; - } - vrele(ndp->ni_dvp); - goto dirloop; - } -#endif - /* * Check for read-only file systems. */ @@ -857,14 +771,9 @@ nextname: goto bad2; } } - if (cnp->cn_flags & SAVESTART) { -#if 0 - ndp->ni_startdir = ndp->ni_dvp; - VREF(ndp->ni_startdir); -#endif - /* ASSERT(dvp==ndp->ni_startdir) */ + /* ASSERT(dvp == ndp->ni_startdir) */ + if (cnp->cn_flags & SAVESTART) VREF(dvp); - } if (!wantparent) vrele(dvp); @@ -908,21 +817,47 @@ bad: * directory. */ int -ufs_rename(fdvp, fvp, fcnp, - tdvp, tvp, tcnp) /* converted to CN. */ -/* old: ufs_rename(fndp, tndp, p) */ - struct vnode *fdvp, *fvp; - struct componentname *fcnp; - struct vnode *tdvp, *tvp; - struct componentname *tcnp; +ufs_rename(ap) + struct vop_rename_args /* { + struct vnode *a_fdvp; + struct vnode *a_fvp; + struct componentname *a_fcnp; + struct vnode *a_tdvp; + struct vnode *a_tvp; + struct componentname *a_tcnp; + } */ *ap; { + struct vnode *tvp = ap->a_tvp; + register struct vnode *tdvp = ap->a_tdvp; + struct vnode *fvp = ap->a_fvp; + register struct vnode *fdvp = ap->a_fdvp; + register struct componentname *tcnp = ap->a_tcnp; + register struct componentname *fcnp = ap->a_fcnp; register struct inode *ip, *xp, *dp; struct dirtemplate dirbuf; + struct timeval tv; int doingdirectory = 0, oldparent = 0, newparent = 0; int error = 0; int fdvpneedsrele = 1, tdvpneedsrele = 1; + u_char namlen; + + /* Check for cross-device rename */ + if ((fvp->v_mount != tdvp->v_mount) || + (tvp && (fvp->v_mount != tvp->v_mount))) { + VOP_ABORTOP(tdvp, tcnp); /* XXX, why not in NFS? */ + if (tdvp == tvp) + vrele(tdvp); + else + vput(tdvp); + if (tvp) + vput(tvp); + VOP_ABORTOP(fdvp, fcnp); /* XXX, why not in NFS? */ + vrele(fdvp); + vrele(fvp); + return (EXDEV); + } -#ifdef DIANOSTIC +#ifdef DIAGNOSTIC if ((tcnp->cn_flags & HASBUF) == 0 || (fcnp->cn_flags & HASBUF) == 0) panic("ufs_rename: no name"); @@ -951,7 +886,8 @@ ufs_rename(fdvp, fvp, fcnp, * Avoid ".", "..", and aliases of "." for obvious reasons. */ if ((fcnp->cn_namelen == 1 && fcnp->cn_nameptr[0] == '.') || - dp == ip || (fcnp->cn_flags&ISDOTDOT) || (ip->i_flag & IRENAME)) { + dp == ip || (fcnp->cn_flags&ISDOTDOT) || + (ip->i_flag & IRENAME)) { VOP_ABORTOP(tdvp, tcnp); vput(tdvp); if (tvp) @@ -975,7 +911,8 @@ ufs_rename(fdvp, fvp, fcnp, */ ip->i_nlink++; ip->i_flag |= ICHG; - error = VOP_UPDATE(fvp, &time, &time, 1); + tv = time; + error = VOP_UPDATE(fvp, &tv, &tv, 1); IUNLOCK(ip); /* @@ -1000,7 +937,7 @@ ufs_rename(fdvp, fvp, fcnp, newparent = dp->i_number; if (doingdirectory && newparent) { VOP_LOCK(fvp); - error = ufs_access(fvp, VWRITE, tcnp->cn_cred, tcnp->cn_proc); + error = VOP_ACCESS(fvp, VWRITE, tcnp->cn_cred, tcnp->cn_proc); VOP_UNLOCK(fvp); if (error) goto bad; @@ -1034,20 +971,20 @@ ufs_rename(fdvp, fvp, fcnp, * parent we don't fool with the link count. */ if (doingdirectory && newparent) { - if ((unsigned short)dp->i_nlink >= LINK_MAX) { + if ((nlink_t)dp->i_nlink >= LINK_MAX) { error = EMLINK; goto bad; } dp->i_nlink++; dp->i_flag |= ICHG; - if (error = VOP_UPDATE(ITOV(dp), &time, &time, 1)) + if (error = VOP_UPDATE(ITOV(dp), &tv, &tv, 1)) goto bad; } if (error = ufs_direnter(ip, tdvp, tcnp)) { if (doingdirectory && newparent) { dp->i_nlink--; dp->i_flag |= ICHG; - (void)VOP_UPDATE(ITOV(dp), &time, &time, 1); + (void)VOP_UPDATE(ITOV(dp), &tv, &tv, 1); } goto bad; } @@ -1119,7 +1056,8 @@ ufs_rename(fdvp, fvp, fcnp, if (doingdirectory) { if (--xp->i_nlink != 0) panic("rename: linked directory"); - error = VOP_TRUNCATE(ITOV(xp), (u_long)0, IO_SYNC); + error = VOP_TRUNCATE(ITOV(xp), (off_t)0, IO_SYNC, + tcnp->cn_cred, tcnp->cn_proc); } xp->i_flag |= ICHG; ufs_iput(xp); @@ -1135,7 +1073,7 @@ unlinkit: if ((fcnp->cn_flags & SAVESTART) == 0) panic("ufs_rename: lost from startdir"); p->p_spare[1]--; - (void) relookup(fdvp, &fvp, fcnp); /* NEEDSWORK: startdir stuff */ + (void) relookup(fdvp, &fvp, fcnp); if (fvp != NULL) { xp = VTOI(fvp); dp = VTOI(fdvp); @@ -1176,10 +1114,18 @@ unlinkit: UIO_SYSSPACE, IO_NODELOCKED, tcnp->cn_cred, (int *)0, (struct proc *)0); if (error == 0) { - if (dirbuf.dotdot_namlen != 2 || +# if (BYTE_ORDER == LITTLE_ENDIAN) + if (fvp->v_mount->mnt_maxsymlinklen <= 0) + namlen = dirbuf.dotdot_type; + else + namlen = dirbuf.dotdot_namlen; +# else + namlen = dirbuf.dotdot_namlen; +# endif + if (namlen != 2 || dirbuf.dotdot_name[0] != '.' || dirbuf.dotdot_name[1] != '.') { - ufs_dirbad(xp, 12, + ufs_dirbad(xp, (doff_t)12, "rename: mangled dir"); } else { dirbuf.dotdot_ino = newparent; @@ -1223,6 +1169,10 @@ out: * A virgin directory (no blushing please). */ static struct dirtemplate mastertemplate = { + 0, 12, DT_DIR, 1, ".", + 0, DIRBLKSIZ - 12, DT_DIR, 2, ".." +}; +static struct odirtemplate omastertemplate = { 0, 12, 1, ".", 0, DIRBLKSIZ - 12, 2, ".." }; @@ -1231,25 +1181,29 @@ static struct dirtemplate mastertemplate = { * Mkdir system call */ int -ufs_mkdir(dvp, vpp, cnp, vap) /* converted to CN. */ -/* was: ufs_mkdir(cnp, vap) */ - struct vnode *dvp; - struct vnode **vpp; - struct componentname *cnp; - struct vattr *vap; +ufs_mkdir(ap) + struct vop_mkdir_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; + } */ *ap; { + register struct vnode *dvp = ap->a_dvp; + register struct vattr *vap = ap->a_vap; + register struct componentname *cnp = ap->a_cnp; register struct inode *ip, *dp; struct vnode *tvp; - struct dirtemplate dirtemplate; - int error; - int dmode; + struct dirtemplate dirtemplate, *dtp; + struct timeval tv; + int error, dmode; -#ifdef DIANOSTIC +#ifdef DIAGNOSTIC if ((cnp->cn_flags & HASBUF) == 0) panic("ufs_mkdir: no name"); #endif dp = VTOI(dvp); - if ((unsigned short)dp->i_nlink >= LINK_MAX) { + if ((nlink_t)dp->i_nlink >= LINK_MAX) { free(cnp->cn_pnbuf, M_NAMEI); ufs_iput(dp); return (EMLINK); @@ -1283,7 +1237,8 @@ ufs_mkdir(dvp, vpp, cnp, vap) /* converted to CN. */ ip->i_mode = dmode; ITOV(ip)->v_type = VDIR; /* Rest init'd in iget() */ ip->i_nlink = 2; - error = VOP_UPDATE(ITOV(ip), &time, &time, 1); + tv = time; + error = VOP_UPDATE(ITOV(ip), &tv, &tv, 1); /* * Bump link count in parent directory @@ -1293,11 +1248,15 @@ ufs_mkdir(dvp, vpp, cnp, vap) /* converted to CN. */ */ dp->i_nlink++; dp->i_flag |= ICHG; - if (error = VOP_UPDATE(ITOV(dp), &time, &time, 1)) + if (error = VOP_UPDATE(ITOV(dp), &tv, &tv, 1)) goto bad; /* Initialize directory with "." and ".." from static template. */ - dirtemplate = mastertemplate; + if (dvp->v_mount->mnt_maxsymlinklen > 0) + dtp = &mastertemplate; + else + dtp = (struct dirtemplate *)&omastertemplate; + dirtemplate = *dtp; dirtemplate.dot_ino = ip->i_number; dirtemplate.dotdot_ino = dp->i_number; error = vn_rdwr(UIO_WRITE, ITOV(ip), (caddr_t)&dirtemplate, @@ -1330,7 +1289,7 @@ bad: ip->i_flag |= ICHG; ufs_iput(ip); } else - *vpp = ITOV(ip); + *ap->a_vpp = ITOV(ip); FREE(cnp->cn_pnbuf, M_NAMEI); ufs_iput(dp); return (error); @@ -1340,15 +1299,19 @@ bad: * Rmdir system call. */ int -ufs_rmdir(dvp, vp, cnp) /* converted to CN. */ -/* old: ufs_rmdir(ndp, p) */ - struct vnode *dvp, *vp; - struct componentname *cnp; +ufs_rmdir(ap) + struct vop_rmdir_args /* { + struct vnode *a_dvp; + struct vnode *a_vp; + struct componentname *a_cnp; + } */ *ap; { + register struct vnode *dvp = ap->a_dvp; + register struct componentname *cnp = ap->a_cnp; register struct inode *ip, *dp; int error; - ip = VTOI(vp); + ip = VTOI(ap->a_vp); dp = VTOI(dvp); /* * No rmdir "." please. @@ -1395,7 +1358,8 @@ ufs_rmdir(dvp, vp, cnp) /* converted to CN. */ * worry about them later. */ ip->i_nlink -= 2; - error = VOP_TRUNCATE(vp, (u_long)0, IO_SYNC); + error = VOP_TRUNCATE(ap->a_vp, (off_t)0, IO_SYNC, cnp->cn_cred, + cnp->cn_proc); cache_purge(ITOV(ip)); out: if (dvp) @@ -1408,35 +1372,55 @@ out: * symlink -- make a symbolic link */ int -ufs_symlink(dvp, vpp, cnp, vap, target) /* converted to CN. */ -/* old: ufs_symlink(ndp, vap, target, p) */ - struct vnode *dvp; - struct vnode **vpp; - struct componentname *cnp; - struct vattr *vap; - char *target; +ufs_symlink(ap) + struct vop_symlink_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; + char *a_target; + } */ *ap; { - int error; + register struct vnode *vp, **vpp = ap->a_vpp; + register struct inode *ip; + int len, error; - if (error = ufs_makeinode(IFLNK | vap->va_mode, dvp, vpp, cnp)) + if (error = ufs_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp, + vpp, ap->a_cnp)) return (error); - error = vn_rdwr(UIO_WRITE, *vpp, target, strlen(target), (off_t)0, - UIO_SYSSPACE, IO_NODELOCKED, cnp->cn_cred, (int *)0, - (struct proc *)0); - vput(*vpp); + vp = *vpp; + len = strlen(ap->a_target); + if (len < vp->v_mount->mnt_maxsymlinklen) { + ip = VTOI(vp); + bcopy(ap->a_target, (char *)ip->i_shortlink, len); + ip->i_size = len; + ip->i_flag |= IUPD|ICHG; + } else + error = vn_rdwr(UIO_WRITE, vp, ap->a_target, len, (off_t)0, + UIO_SYSSPACE, IO_NODELOCKED, ap->a_cnp->cn_cred, (int *)0, + (struct proc *)0); + vput(vp); return (error); } /* - * Vnode op for read and write + * Vnode op for reading directories. + * + * The routine below assumes that the on-disk format of a directory + * is the same as that defined by . If the on-disk + * format changes, then it will be necessary to do a conversion + * from the on-disk format that read returns to the format defined + * by . */ int -ufs_readdir(vp, uio, cred, eofflagp) - struct vnode *vp; - register struct uio *uio; - struct ucred *cred; - int *eofflagp; +ufs_readdir(ap) + struct vop_readdir_args /* { + struct vnode *a_vp; + struct uio *a_uio; + struct ucred *a_cred; + } */ *ap; { + register struct uio *uio = ap->a_uio; int count, lost, error; count = uio->uio_resid; @@ -1446,12 +1430,49 @@ ufs_readdir(vp, uio, cred, eofflagp) return (EINVAL); uio->uio_resid = count; uio->uio_iov->iov_len = count; - error = VOP_READ(vp, uio, 0, cred); +# if (BYTE_ORDER == LITTLE_ENDIAN) + if (ap->a_vp->v_mount->mnt_maxsymlinklen > 0) { + error = VOP_READ(ap->a_vp, uio, 0, ap->a_cred); + } else { + struct dirent *dp, *edp; + struct uio auio; + struct iovec aiov; + caddr_t dirbuf; + int readcnt; + u_char tmp; + + auio = *uio; + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + auio.uio_segflg = UIO_SYSSPACE; + aiov.iov_len = count; + MALLOC(dirbuf, caddr_t, count, M_TEMP, M_WAITOK); + aiov.iov_base = dirbuf; + error = VOP_READ(ap->a_vp, &auio, 0, ap->a_cred); + if (error == 0) { + readcnt = count - auio.uio_resid; + edp = (struct dirent *)&dirbuf[readcnt]; + for (dp = (struct dirent *)dirbuf; dp < edp; ) { + tmp = dp->d_namlen; + dp->d_namlen = dp->d_type; + dp->d_type = tmp; + if (dp->d_reclen > 0) { + dp = (struct dirent *) + ((char *)dp + dp->d_reclen); + } else { + error = EIO; + break; + } + } + if (dp >= edp) + error = uiomove(dirbuf, readcnt, uio); + } + FREE(dirbuf, M_TEMP); + } +# else + error = VOP_READ(ap->a_vp, uio, 0, ap->a_cred); +# endif uio->uio_resid += lost; - if ((VTOI(vp)->i_size - uio->uio_offset) <= 0) - *eofflagp = 1; - else - *eofflagp = 0; return (error); } @@ -1459,13 +1480,23 @@ ufs_readdir(vp, uio, cred, eofflagp) * Return target name of a symbolic link */ int -ufs_readlink(vp, uiop, cred) - struct vnode *vp; - struct uio *uiop; - struct ucred *cred; +ufs_readlink(ap) + struct vop_readlink_args /* { + struct vnode *a_vp; + struct uio *a_uio; + struct ucred *a_cred; + } */ *ap; { + register struct vnode *vp = ap->a_vp; + register struct inode *ip = VTOI(vp); + int isize; - return (VOP_READ(vp, uiop, 0, cred)); + isize = ip->i_size; + if (isize < vp->v_mount->mnt_maxsymlinklen) { + uiomove((char *)ip->i_shortlink, isize, ap->a_uio); + return (0); + } + return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred)); } /* @@ -1474,12 +1505,14 @@ ufs_readlink(vp, uiop, cred) */ /* ARGSUSED */ int -ufs_abortop(dvp, cnp) /* converted to CN. */ - struct vnode *dvp; - struct componentname *cnp; +ufs_abortop(ap) + struct vop_abortop_args /* { + struct vnode *a_dvp; + struct componentname *a_cnp; + } */ *ap; { - if ((cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) - FREE(cnp->cn_pnbuf, M_NAMEI); + if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) + FREE(ap->a_cnp->cn_pnbuf, M_NAMEI); return (0); } @@ -1487,10 +1520,12 @@ ufs_abortop(dvp, cnp) /* converted to CN. */ * Lock an inode. */ int -ufs_lock(vp) - struct vnode *vp; +ufs_lock(ap) + struct vop_lock_args /* { + struct vnode *a_vp; + } */ *ap; { - register struct inode *ip = VTOI(vp); + register struct inode *ip = VTOI(ap->a_vp); ILOCK(ip); return (0); @@ -1500,10 +1535,12 @@ ufs_lock(vp) * Unlock an inode. */ int -ufs_unlock(vp) - struct vnode *vp; +ufs_unlock(ap) + struct vop_unlock_args /* { + struct vnode *a_vp; + } */ *ap; { - register struct inode *ip = VTOI(vp); + register struct inode *ip = VTOI(ap->a_vp); if (!(ip->i_flag & ILOCKED)) panic("ufs_unlock NOT LOCKED"); @@ -1515,11 +1552,13 @@ ufs_unlock(vp) * Check for a locked inode. */ int -ufs_islocked(vp) - struct vnode *vp; +ufs_islocked(ap) + struct vop_islocked_args /* { + struct vnode *a_vp; + } */ *ap; { - if (VTOI(vp)->i_flag & ILOCKED) + if (VTOI(ap->a_vp)->i_flag & ILOCKED) return (1); return (0); } @@ -1528,23 +1567,28 @@ ufs_islocked(vp) * Calculate the logical to physical mapping if not done already, * then call the device strategy routine. */ -int checkoverlap = 0; - int -ufs_strategy(bp) - register struct buf *bp; +ufs_strategy(ap) + struct vop_strategy_args /* { + struct buf *a_bp; + } */ *ap; { + register struct buf *bp = ap->a_bp; + register struct vnode *vp = bp->b_vp; register struct inode *ip; - struct vnode *vp; int error; - ip = VTOI(bp->b_vp); - if (bp->b_vp->v_type == VBLK || bp->b_vp->v_type == VCHR) + ip = VTOI(vp); + if (vp->v_type == VBLK || vp->v_type == VCHR) panic("ufs_strategy: spec"); if (bp->b_blkno == bp->b_lblkno) { if (error = - VOP_BMAP(bp->b_vp, bp->b_lblkno, NULL, &bp->b_blkno)) + VOP_BMAP(vp, bp->b_lblkno, NULL, &bp->b_blkno, NULL)) { + bp->b_error = error; + bp->b_flags |= B_ERROR; + biodone(bp); return (error); + } if ((long)bp->b_blkno == -1) clrbuf(bp); } @@ -1552,14 +1596,9 @@ ufs_strategy(bp) biodone(bp); return (0); } -#ifdef DIAGNOSTIC - if (checkoverlap && bp->b_vp->v_mount->mnt_stat.f_type == MOUNT_UFS) - ffs_checkoverlap(bp, ip); -#endif - vp = ip->i_devvp; bp->b_dev = vp->v_rdev; - (vp->v_op->vop_strategy)(bp); + VOCALL (vp->v_op, VOFFSET(vop_strategy), ap); return (0); } @@ -1567,9 +1606,12 @@ ufs_strategy(bp) * Print out the contents of an inode. */ int -ufs_print(vp) - struct vnode *vp; +ufs_print(ap) + struct vop_print_args /* { + struct vnode *a_vp; + } */ *ap; { + register struct vnode *vp = ap->a_vp; register struct inode *ip = VTOI(vp); printf("tag VT_UFS, ino %d, on dev %d, %d", ip->i_number, @@ -1592,36 +1634,40 @@ ufs_print(vp) * Read wrapper for special devices. */ int -ufsspec_read(vp, uio, ioflag, cred) - struct vnode *vp; - struct uio *uio; - int ioflag; - struct ucred *cred; +ufsspec_read(ap) + struct vop_read_args /* { + struct vnode *a_vp; + struct uio *a_uio; + int a_ioflag; + struct ucred *a_cred; + } */ *ap; { /* * Set access flag. */ - VTOI(vp)->i_flag |= IACC; - return (spec_read(vp, uio, ioflag, cred)); + VTOI(ap->a_vp)->i_flag |= IACC; + return (VOCALL (spec_vnodeop_p, VOFFSET(vop_read), ap)); } /* * Write wrapper for special devices. */ int -ufsspec_write(vp, uio, ioflag, cred) - struct vnode *vp; - struct uio *uio; - int ioflag; - struct ucred *cred; +ufsspec_write(ap) + struct vop_write_args /* { + struct vnode *a_vp; + struct uio *a_uio; + int a_ioflag; + struct ucred *a_cred; + } */ *ap; { /* * Set update and change flags. */ - VTOI(vp)->i_flag |= IUPD|ICHG; - return (spec_write(vp, uio, ioflag, cred)); + VTOI(ap->a_vp)->i_flag |= IUPD|ICHG; + return (VOCALL (spec_vnodeop_p, VOFFSET(vop_write), ap)); } /* @@ -1630,17 +1676,19 @@ ufsspec_write(vp, uio, ioflag, cred) * Update the times on the inode then do device close. */ int -ufsspec_close(vp, fflag, cred, p) - struct vnode *vp; - int fflag; - struct ucred *cred; - struct proc *p; +ufsspec_close(ap) + struct vop_close_args /* { + struct vnode *a_vp; + int a_fflag; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { - register struct inode *ip = VTOI(vp); + register struct inode *ip = VTOI(ap->a_vp); - if (vp->v_usecount > 1 && !(ip->i_flag & ILOCKED)) + if (ap->a_vp->v_usecount > 1 && !(ip->i_flag & ILOCKED)) ITIMES(ip, &time, &time); - return (spec_close(vp, fflag, cred, p)); + return (VOCALL (spec_vnodeop_p, VOFFSET(vop_close), ap)); } #ifdef FIFO @@ -1648,36 +1696,42 @@ ufsspec_close(vp, fflag, cred, p) * Read wrapper for fifo's */ int -ufsfifo_read(vp, uio, ioflag, cred) - struct vnode *vp; - struct uio *uio; - int ioflag; - struct ucred *cred; +ufsfifo_read(ap) + struct vop_read_args /* { + struct vnode *a_vp; + struct uio *a_uio; + int a_ioflag; + struct ucred *a_cred; + } */ *ap; { + extern int (**fifo_vnodeop_p)(); /* * Set access flag. */ - VTOI(vp)->i_flag |= IACC; - return (fifo_read(vp, uio, ioflag, cred)); + VTOI(ap->a_vp)->i_flag |= IACC; + return (VOCALL (fifo_vnodeop_p, VOFFSET(vop_read), ap)); } /* * Write wrapper for fifo's. */ int -ufsfifo_write(vp, uio, ioflag, cred) - struct vnode *vp; - struct uio *uio; - int ioflag; - struct ucred *cred; +ufsfifo_write(ap) + struct vop_write_args /* { + struct vnode *a_vp; + struct uio *a_uio; + int a_ioflag; + struct ucred *a_cred; + } */ *ap; { + extern int (**fifo_vnodeop_p)(); /* * Set update and change flags. */ - VTOI(vp)->i_flag |= IUPD|ICHG; - return (fifo_write(vp, uio, ioflag, cred)); + VTOI(ap->a_vp)->i_flag |= IUPD|ICHG; + return (VOCALL (fifo_vnodeop_p, VOFFSET(vop_write), ap)); } /* @@ -1685,17 +1739,20 @@ ufsfifo_write(vp, uio, ioflag, cred) * * Update the times on the inode then do device close. */ -ufsfifo_close(vp, fflag, cred, p) - struct vnode *vp; - int fflag; - struct ucred *cred; - struct proc *p; +ufsfifo_close(ap) + struct vop_close_args /* { + struct vnode *a_vp; + int a_fflag; + struct ucred *a_cred; + struct proc *a_p; + } */ *ap; { - register struct inode *ip = VTOI(vp); + extern int (**fifo_vnodeop_p)(); + register struct inode *ip = VTOI(ap->a_vp); - if (vp->v_usecount > 1 && !(ip->i_flag & ILOCKED)) + if (ap->a_vp->v_usecount > 1 && !(ip->i_flag & ILOCKED)) ITIMES(ip, &time, &time); - return (fifo_close(vp, fflag, cred, p)); + return (VOCALL (fifo_vnodeop_p, VOFFSET(vop_close), ap)); } #endif /* FIFO */ @@ -1703,14 +1760,17 @@ ufsfifo_close(vp, fflag, cred, p) * Advisory record locking support */ int -ufs_advlock(vp, id, op, fl, flags) - struct vnode *vp; - caddr_t id; - int op; - register struct flock *fl; - int flags; +ufs_advlock(ap) + struct vop_advlock_args /* { + struct vnode *a_vp; + caddr_t a_id; + int a_op; + struct flock *a_fl; + int a_flags; + } */ *ap; { - register struct inode *ip = VTOI(vp); + register struct inode *ip = VTOI(ap->a_vp); + register struct flock *fl = ap->a_fl; register struct lockf *lock; off_t start, end; int error; @@ -1719,7 +1779,7 @@ ufs_advlock(vp, id, op, fl, flags) * Avoid the common case of unlocking when inode has no locks. */ if (ip->i_lockf == (struct lockf *)0) { - if (op != F_SETLK) { + if (ap->a_op != F_SETLK) { fl->l_type = F_UNLCK; return (0); } @@ -1757,16 +1817,16 @@ ufs_advlock(vp, id, op, fl, flags) MALLOC(lock, struct lockf *, sizeof *lock, M_LOCKF, M_WAITOK); lock->lf_start = start; lock->lf_end = end; - lock->lf_id = id; + lock->lf_id = ap->a_id; lock->lf_inode = ip; lock->lf_type = fl->l_type; lock->lf_next = (struct lockf *)0; lock->lf_block = (struct lockf *)0; - lock->lf_flags = flags; + lock->lf_flags = ap->a_flags; /* * Do the requested operation. */ - switch(op) { + switch(ap->a_op) { case F_SETLK: return (lf_setlock(lock)); @@ -1794,12 +1854,12 @@ ufs_advlock(vp, id, op, fl, flags) int ufs_vinit(mntp, specops, fifoops, vpp) struct mount *mntp; - struct vnodeops *specops, *fifoops; + int (**specops)(); + int (**fifoops)(); struct vnode **vpp; { - struct inode *ip, *nip; + struct inode *ip; struct vnode *vp, *nvp; - extern struct vnodeops spec_vnodeops; vp = *vpp; ip = VTOI(vp); @@ -1811,11 +1871,11 @@ ufs_vinit(mntp, specops, fifoops, vpp) /* * Discard unneeded vnode, but save its inode. */ - remque(ip); + ufs_ihashrem(ip); IUNLOCK(ip); nvp->v_data = vp->v_data; vp->v_data = NULL; - vp->v_op = &spec_vnodeops; + vp->v_op = spec_vnodeop_p; vrele(vp); vgone(vp); /* @@ -1849,19 +1909,19 @@ ufs_vinit(mntp, specops, fifoops, vpp) * Allocate a new inode. */ int -ufs_makeinode(mode, dvp, vpp, cnp) /* converted to CN */ -/* OLD: ufs_makeinode(mode, ndp, vpp) */ +ufs_makeinode(mode, dvp, vpp, cnp) int mode; struct vnode *dvp; struct vnode **vpp; struct componentname *cnp; { register struct inode *ip, *pdir; + struct timeval tv; struct vnode *tvp; int error; pdir = VTOI(dvp); -#ifdef DIANOSTIC +#ifdef DIAGNOSTIC if ((cnp->cn_flags & HASBUF) == 0) panic("ufs_makeinode: no name"); #endif @@ -1898,7 +1958,8 @@ ufs_makeinode(mode, dvp, vpp, cnp) /* converted to CN */ /* * Make sure inode goes to disk before directory entry. */ - if (error = VOP_UPDATE(tvp, &time, &time, 1)) + tv = time; + if (error = VOP_UPDATE(tvp, &tv, &tv, 1)) goto bad; if (error = ufs_direnter(ip, dvp, cnp)) goto bad; @@ -1920,21 +1981,3 @@ bad: ufs_iput(ip); return (error); } - - -#if defined(JOHNH) && 0 -/* - * A hack to get the kernel to compile. - */ -int -hang_addrlist() -{ - return 0; -} -int -free_addrlist() -{ - return 0; -} -#endif -