diff options
author | 2013-04-15 15:32:19 +0000 | |
---|---|---|
committer | 2013-04-15 15:32:19 +0000 | |
commit | aec3986e4c77ef418b044f5a18f9ea2d3dfdc5ca (patch) | |
tree | 0ef0402a8c1ce45cd17a6e33cb6f909d524c8384 | |
parent | sync (diff) | |
download | wireguard-openbsd-aec3986e4c77ef418b044f5a18f9ea2d3dfdc5ca.tar.xz wireguard-openbsd-aec3986e4c77ef418b044f5a18f9ea2d3dfdc5ca.zip |
Add an f_mntfromspec member to struct statfs, which specifies the name of
the special provided when the mount was requested. This may be the same as
the special that was actually used for the mount (e.g. in the case of a
device node) or it may be different (e.g. in the case of a DUID).
Whilst here, change f_ctime to a 64 bit type and remove the pointless
f_spare members.
Compatibility goo courtesy of guenther@
ok krw@ millert@
-rw-r--r-- | sys/conf/GENERIC | 3 | ||||
-rw-r--r-- | sys/isofs/cd9660/cd9660_vfsops.c | 6 | ||||
-rw-r--r-- | sys/isofs/udf/udf_vfsops.c | 4 | ||||
-rw-r--r-- | sys/kern/syscalls.conf | 4 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 27 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 10 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 190 | ||||
-rw-r--r-- | sys/miscfs/procfs/procfs_vfsops.c | 5 | ||||
-rw-r--r-- | sys/msdosfs/msdosfs_vfsops.c | 13 | ||||
-rw-r--r-- | sys/nfs/nfs_vfsops.c | 5 | ||||
-rw-r--r-- | sys/ntfs/ntfs_vfsops.c | 13 | ||||
-rw-r--r-- | sys/sys/mount.h | 37 | ||||
-rw-r--r-- | sys/ufs/ext2fs/ext2fs_vfsops.c | 18 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vfsops.c | 26 | ||||
-rw-r--r-- | sys/ufs/mfs/mfs_vfsops.c | 6 |
15 files changed, 312 insertions, 55 deletions
diff --git a/sys/conf/GENERIC b/sys/conf/GENERIC index 56c43e64832..1033715c84f 100644 --- a/sys/conf/GENERIC +++ b/sys/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.195 2013/03/14 11:18:37 mpi Exp $ +# $OpenBSD: GENERIC,v 1.196 2013/04/15 15:32:19 jsing Exp $ # # Machine-independent option; used by all architectures for their # GENERIC kernel @@ -30,6 +30,7 @@ option UVM_SWAP_ENCRYPT# support encryption of pages going to swap option COMPAT_43 # Kernel compatibility with 4.3BSD option COMPAT_O51 # Kernel compatibility with OpenBSD 5.1 +option COMPAT_O53 # Kernel compatibility with OpenBSD 5.3 option LKM # loadable kernel modules diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c index d5a7dc5b3b9..cb212070262 100644 --- a/sys/isofs/cd9660/cd9660_vfsops.c +++ b/sys/isofs/cd9660/cd9660_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cd9660_vfsops.c,v 1.61 2012/09/10 11:10:59 jsing Exp $ */ +/* $OpenBSD: cd9660_vfsops.c,v 1.62 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: cd9660_vfsops.c,v 1.26 1997/06/13 15:38:58 pk Exp $ */ /*- @@ -210,6 +210,8 @@ cd9660_mount(mp, path, data, ndp, p) strlcpy(mp->mnt_stat.f_mntonname, path, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); bcopy(&args, &mp->mnt_stat.mount_info.iso_args, sizeof(args)); cd9660_statfs(mp, &mp->mnt_stat, p); @@ -665,8 +667,6 @@ cd9660_statfs(mp, sbp, p) bcopy(&mp->mnt_stat.mount_info.iso_args, &sbp->mount_info.iso_args, sizeof(struct iso_args)); } - /* Use the first spare for flags: */ - sbp->f_spare[0] = isomp->im_flags; return (0); } diff --git a/sys/isofs/udf/udf_vfsops.c b/sys/isofs/udf/udf_vfsops.c index cb3fbe46e69..c35b80f54ec 100644 --- a/sys/isofs/udf/udf_vfsops.c +++ b/sys/isofs/udf/udf_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: udf_vfsops.c,v 1.39 2012/09/10 11:10:59 jsing Exp $ */ +/* $OpenBSD: udf_vfsops.c,v 1.40 2013/04/15 15:32:19 jsing Exp $ */ /* * Copyright (c) 2001, 2002 Scott Long <scottl@freebsd.org> @@ -188,6 +188,8 @@ udf_mount(struct mount *mp, const char *path, void *data, strlcpy(mp->mnt_stat.f_mntonname, path, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); return (0); }; diff --git a/sys/kern/syscalls.conf b/sys/kern/syscalls.conf index 068f33e3df9..deaac702e78 100644 --- a/sys/kern/syscalls.conf +++ b/sys/kern/syscalls.conf @@ -1,11 +1,11 @@ -# $OpenBSD: syscalls.conf,v 1.15 2012/06/21 00:56:59 guenther Exp $ +# $OpenBSD: syscalls.conf,v 1.16 2013/04/15 15:32:19 jsing Exp $ # $NetBSD: syscalls.conf,v 1.2 1994/10/26 06:45:57 cgd Exp $ sysnames="syscalls.c" sysnumhdr="../sys/syscall.h" syssw="init_sysent.c" sysarghdr="../sys/syscallargs.h" -compatopts="compat_o48 compat_o51" +compatopts="compat_o51 compat_o53" libcompatopts="" switchname="sysent" diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index fe0a69928aa..f6b193b48a0 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ -; $OpenBSD: syscalls.master,v 1.128 2013/03/14 21:38:22 tedu Exp $ +; $OpenBSD: syscalls.master,v 1.129 2013/04/15 15:32:19 jsing Exp $ ; $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -145,10 +145,13 @@ char * const *argp, char * const *envp); } 60 STD { mode_t sys_umask(mode_t newmask); } 61 STD { int sys_chroot(const char *path); } -62 OBSOL fstat43 -63 OBSOL ogetkerninfo -64 OBSOL ogetpagesize -65 OBSOL omsync25 +62 STD { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + int flags); } +63 STD { int sys_statfs(const char *path, \ + struct statfs *buf); } +64 STD { int sys_fstatfs(int fd, struct statfs *buf); } +65 STD { int sys_fhstatfs(const fhandle_t *fhp, \ + struct statfs *buf); } 66 STD { int sys_vfork(void); } 67 OBSOL vread 68 OBSOL vwrite @@ -523,13 +526,13 @@ 304 STD { int sys___getcwd(char *buf, size_t len); } 305 STD { int sys_adjfreq(const int64_t *freq, \ int64_t *oldfreq); } -306 STD { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ - int flags); } -307 STD { int sys_statfs(const char *path, \ - struct statfs *buf); } -308 STD { int sys_fstatfs(int fd, struct statfs *buf); } -309 STD { int sys_fhstatfs(const fhandle_t *fhp, \ - struct statfs *buf); } +306 COMPAT_O53 { int sys_getfsstat(struct statfs53 *buf, \ + size_t bufsize, int flags); } +307 COMPAT_O53 { int sys_statfs(const char *path, \ + struct statfs53 *buf); } +308 COMPAT_O53 { int sys_fstatfs(int fd, struct statfs53 *buf); } +309 COMPAT_O53 { int sys_fhstatfs(const fhandle_t *fhp, \ + struct statfs53 *buf); } 310 STD { int sys_setrtable(int rtableid); } 311 STD { int sys_getrtable(void); } 312 STD { int sys_getdirentries(int fd, char *buf, \ diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 764d8b8e4e9..8417a3ebe0c 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_subr.c,v 1.202 2013/02/17 17:39:29 miod Exp $ */ +/* $OpenBSD: vfs_subr.c,v 1.203 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: vfs_subr.c,v 1.53 1996/04/22 01:39:13 christos Exp $ */ /* @@ -224,7 +224,8 @@ vfs_rootmountalloc(char *fstypename, char *devname, struct mount **mpp) mp->mnt_flag |= vfsp->vfc_flags & MNT_VISFLAGMASK; strncpy(mp->mnt_stat.f_fstypename, vfsp->vfc_name, MFSNAMELEN); mp->mnt_stat.f_mntonname[0] = '/'; - (void)copystr(devname, mp->mnt_stat.f_mntfromname, MNAMELEN - 1, 0); + copystr(devname, mp->mnt_stat.f_mntfromname, MNAMELEN, 0); + copystr(devname, mp->mnt_stat.f_mntfromspec, MNAMELEN, 0); *mpp = mp; return (0); } @@ -2244,9 +2245,9 @@ vfs_mount_print(struct mount *mp, int full, (*pr)(" syncreads %llu asyncreads = %llu\n", mp->mnt_stat.f_syncreads, mp->mnt_stat.f_asyncreads); - (*pr)(" fstype \"%s\" mnton \"%s\" mntfrom \"%s\"\n", + (*pr)(" fstype \"%s\" mnton \"%s\" mntfrom \"%s\" mntspec \"%s\"\n", mp->mnt_stat.f_fstypename, mp->mnt_stat.f_mntonname, - mp->mnt_stat.f_mntfromname); + mp->mnt_stat.f_mntfromname, mp->mnt_stat.f_mntfromspec); (*pr)("locked vnodes:"); /* XXX would take mountlist lock, except ddb has no context */ @@ -2296,6 +2297,7 @@ copy_statfs_info(struct statfs *sbp, const struct mount *mp) sbp->f_namemax = mbp->f_namemax; bcopy(mp->mnt_stat.f_mntonname, sbp->f_mntonname, MNAMELEN); bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN); + bcopy(mp->mnt_stat.f_mntfromspec, sbp->f_mntfromspec, MNAMELEN); bcopy(&mp->mnt_stat.mount_info.ufs_args, &sbp->mount_info.ufs_args, sizeof(struct ufs_args)); } diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index d26ce079a97..3f1991ec207 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_syscalls.c,v 1.191 2013/03/28 02:39:17 guenther Exp $ */ +/* $OpenBSD: vfs_syscalls.c,v 1.192 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */ /* @@ -68,6 +68,9 @@ static int change_dir(struct nameidata *, struct proc *); void checkdirs(struct vnode *); int copyout_statfs(struct statfs *, void *, struct proc *); +#ifdef COMPAT_O53 +int copyout_statfs53(struct statfs *, void *, struct proc *); +#endif int getdirentries_internal(struct proc *, int, char *, int, off_t *, register_t *); @@ -688,6 +691,191 @@ sys_getfsstat(struct proc *p, void *v, register_t *retval) return (0); } +#ifdef COMPAT_O53 +int +copyout_statfs53(struct statfs *sp, void *uaddr, struct proc *p) +{ + struct statfs53 st; + + /* make sure any padding in the changed area is zeroed */ + memset(&st, 0, sizeof(st)); + memcpy(&st, sp, offsetof(struct statfs53, f_owner) + + sizeof(st.f_owner)); + st.f_ctime = sp->f_ctime; + memcpy(&st.f_fstypename, &sp->f_fstypename, sizeof(st.f_fstypename)); + memcpy(&st.f_mntonname, &sp->f_mntonname, sizeof(st.f_mntonname)); + memcpy(&st.f_mntfromname, &sp->f_mntfromname, sizeof(st.f_mntfromname)); + memcpy(&st.mount_info, &sp->mount_info, sizeof(st.mount_info)); + + /* Don't let non-root see filesystem id (for NFS security) */ + if (suser(p, 0)) + memset(&st.f_fsid, 0, sizeof(st.f_fsid)); + + return (copyout(&st, uaddr, sizeof(st))); +} + +/* + * Get filesystem statistics. + */ +/* ARGSUSED */ +int +compat_o53_sys_statfs(struct proc *p, void *v, register_t *retval) +{ + struct compat_o53_sys_statfs_args /* { + syscallarg(const char *) path; + syscallarg(struct statfs53 *) buf; + } */ *uap = v; + struct mount *mp; + struct statfs *sp; + int error; + struct nameidata nd; + + NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, SCARG(uap, path), p); + if ((error = namei(&nd)) != 0) + return (error); + mp = nd.ni_vp->v_mount; + sp = &mp->mnt_stat; + vrele(nd.ni_vp); + if ((error = VFS_STATFS(mp, sp, p)) != 0) + return (error); + sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; + + return (copyout_statfs53(sp, SCARG(uap, buf), p)); +} + +/* + * Get filesystem statistics. + */ +/* ARGSUSED */ +int +compat_o53_sys_fstatfs(struct proc *p, void *v, register_t *retval) +{ + struct compat_o53_sys_fstatfs_args /* { + syscallarg(int) fd; + syscallarg(struct statfs53 *) buf; + } */ *uap = v; + struct file *fp; + struct mount *mp; + struct statfs *sp; + int error; + + if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0) + return (error); + mp = ((struct vnode *)fp->f_data)->v_mount; + if (!mp) { + FRELE(fp, p); + return (ENOENT); + } + sp = &mp->mnt_stat; + error = VFS_STATFS(mp, sp, p); + FRELE(fp, p); + if (error) + return (error); + sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; + + return (copyout_statfs53(sp, SCARG(uap, buf), p)); +} + +int +compat_o53_sys_getfsstat(struct proc *p, void *v, register_t *retval) +{ + struct compat_o53_sys_getfsstat_args /* { + syscallarg(struct statfs53 *) buf; + syscallarg(size_t) bufsize; + syscallarg(int) flags; + } */ *uap = v; + struct mount *mp, *nmp; + struct statfs *sp; + struct statfs53 *sfsp; + size_t count, maxcount; + int error, flags = SCARG(uap, flags); + + maxcount = SCARG(uap, bufsize) / sizeof(struct statfs53); + sfsp = SCARG(uap, buf); + count = 0; + + for (mp = CIRCLEQ_FIRST(&mountlist); mp != CIRCLEQ_END(&mountlist); + mp = nmp) { + if (vfs_busy(mp, VB_READ|VB_NOWAIT)) { + nmp = CIRCLEQ_NEXT(mp, mnt_list); + continue; + } + if (sfsp && count < maxcount) { + sp = &mp->mnt_stat; + + /* Refresh stats unless MNT_NOWAIT is specified */ + if (flags != MNT_NOWAIT && + flags != MNT_LAZY && + (flags == MNT_WAIT || + flags == 0) && + (error = VFS_STATFS(mp, sp, p))) { + nmp = CIRCLEQ_NEXT(mp, mnt_list); + vfs_unbusy(mp); + continue; + } + + sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; +#if notyet + if (mp->mnt_flag & MNT_SOFTDEP) + sp->f_eflags = STATFS_SOFTUPD; +#endif + error = (copyout_statfs53(sp, sfsp, p)); + if (error) { + vfs_unbusy(mp); + return (error); + } + sfsp++; + } + count++; + nmp = CIRCLEQ_NEXT(mp, mnt_list); + vfs_unbusy(mp); + } + + if (sfsp && count > maxcount) + *retval = maxcount; + else + *retval = count; + + return (0); +} + +/* ARGSUSED */ +int +compat_o53_sys_fhstatfs(struct proc *p, void *v, register_t *retval) +{ + struct compat_o53_sys_fhstatfs_args /* { + syscallarg(const fhandle_t *) fhp; + syscallarg(struct statfs53 *) buf; + } */ *uap = v; + struct statfs *sp; + fhandle_t fh; + struct mount *mp; + struct vnode *vp; + int error; + + /* + * Must be super user + */ + if ((error = suser(p, 0))) + return (error); + + if ((error = copyin(SCARG(uap, fhp), &fh, sizeof(fhandle_t))) != 0) + return (error); + + if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL) + return (ESTALE); + if ((error = VFS_FHTOVP(mp, &fh.fh_fid, &vp))) + return (error); + mp = vp->v_mount; + sp = &mp->mnt_stat; + vput(vp); + if ((error = VFS_STATFS(mp, sp, p)) != 0) + return (error); + sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK; + return (copyout_statfs53(sp, SCARG(uap, buf), p)); +} +#endif /* COMPAT_O53 */ + /* * Change current working directory to a given file descriptor. */ diff --git a/sys/miscfs/procfs/procfs_vfsops.c b/sys/miscfs/procfs/procfs_vfsops.c index 74af59994e1..c1d2e3022df 100644 --- a/sys/miscfs/procfs/procfs_vfsops.c +++ b/sys/miscfs/procfs/procfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: procfs_vfsops.c,v 1.28 2012/09/10 11:10:59 jsing Exp $ */ +/* $OpenBSD: procfs_vfsops.c,v 1.29 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: procfs_vfsops.c,v 1.25 1996/02/09 22:40:53 christos Exp $ */ /* @@ -104,6 +104,8 @@ procfs_mount(struct mount *mp, const char *path, void *data, struct nameidata *n strlcpy(mp->mnt_stat.f_mntonname, path, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); bcopy("procfs", mp->mnt_stat.f_mntfromname, sizeof("procfs")); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + bcopy("procfs", mp->mnt_stat.f_mntfromspec, sizeof("procfs")); bcopy(&args, &mp->mnt_stat.mount_info.procfs_args, sizeof(args)); #ifdef notyet @@ -181,6 +183,7 @@ procfs_statfs(struct mount *mp, struct statfs *sbp, struct proc *p) bcopy(&mp->mnt_stat.f_fsid, &sbp->f_fsid, sizeof(sbp->f_fsid)); bcopy(mp->mnt_stat.f_mntonname, sbp->f_mntonname, MNAMELEN); bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN); + bcopy(mp->mnt_stat.f_mntfromspec, sbp->f_mntfromspec, MNAMELEN); bcopy(&mp->mnt_stat.mount_info.procfs_args, &sbp->mount_info.procfs_args, sizeof(struct procfs_args)); } diff --git a/sys/msdosfs/msdosfs_vfsops.c b/sys/msdosfs/msdosfs_vfsops.c index a463fec4e0e..36684dc6b11 100644 --- a/sys/msdosfs/msdosfs_vfsops.c +++ b/sys/msdosfs/msdosfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: msdosfs_vfsops.c,v 1.62 2012/09/10 11:10:59 jsing Exp $ */ +/* $OpenBSD: msdosfs_vfsops.c,v 1.63 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: msdosfs_vfsops.c,v 1.48 1997/10/18 02:54:57 briggs Exp $ */ /*- @@ -101,6 +101,7 @@ msdosfs_mount(struct mount *mp, const char *path, void *data, struct msdosfs_args args; /* will hold data from mount request */ /* msdosfs specific mount control block */ struct msdosfsmount *pmp = NULL; + char fname[MNAMELEN]; char fspec[MNAMELEN]; int error, flags; mode_t accessmode; @@ -169,9 +170,11 @@ msdosfs_mount(struct mount *mp, const char *path, void *data, error = copyinstr(args.fspec, fspec, sizeof(fspec), NULL); if (error) goto error; - disk_map(fspec, fspec, MNAMELEN, DM_OPENBLCK); - NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, p); + if (disk_map(fspec, fname, sizeof(fname), DM_OPENBLCK) == -1) + bcopy(fspec, fname, sizeof(fname)); + + NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fname, p); if ((error = namei(ndp)) != 0) goto error; @@ -244,7 +247,9 @@ msdosfs_mount(struct mount *mp, const char *path, void *data, bzero(mp->mnt_stat.f_mntonname, MNAMELEN); strlcpy(mp->mnt_stat.f_mntonname, path, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); - strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromname, fname, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); bcopy(&args, &mp->mnt_stat.mount_info.msdosfs_args, sizeof(args)); #ifdef MSDOSFS_DEBUG diff --git a/sys/nfs/nfs_vfsops.c b/sys/nfs/nfs_vfsops.c index 4cd17d18cd0..f33b0124e84 100644 --- a/sys/nfs/nfs_vfsops.c +++ b/sys/nfs/nfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_vfsops.c,v 1.95 2013/01/16 04:05:22 deraadt Exp $ */ +/* $OpenBSD: nfs_vfsops.c,v 1.96 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: nfs_vfsops.c,v 1.46.4.1 1996/05/25 22:40:35 fvdl Exp $ */ /* @@ -670,8 +670,9 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct mbuf *nam, nmp->nm_acdirmax = NFS_MAXATTRTIMO; bcopy((caddr_t)argp->fh, (caddr_t)nmp->nm_fh, argp->fhsize); strncpy(&mp->mnt_stat.f_fstypename[0], mp->mnt_vfc->vfc_name, MFSNAMELEN); - bcopy(hst, mp->mnt_stat.f_mntfromname, MNAMELEN); bcopy(pth, mp->mnt_stat.f_mntonname, MNAMELEN); + bcopy(hst, mp->mnt_stat.f_mntfromname, MNAMELEN); + bcopy(hst, mp->mnt_stat.f_mntfromspec, MNAMELEN); bcopy(argp, &mp->mnt_stat.mount_info.nfs_args, sizeof(*argp)); nmp->nm_nam = nam; nfs_decode_args(nmp, argp, &mp->mnt_stat.mount_info.nfs_args); diff --git a/sys/ntfs/ntfs_vfsops.c b/sys/ntfs/ntfs_vfsops.c index fd08a45c480..120a400fe12 100644 --- a/sys/ntfs/ntfs_vfsops.c +++ b/sys/ntfs/ntfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntfs_vfsops.c,v 1.33 2013/01/18 05:09:21 jsing Exp $ */ +/* $OpenBSD: ntfs_vfsops.c,v 1.34 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: ntfs_vfsops.c,v 1.7 2003/04/24 07:50:19 christos Exp $ */ /*- @@ -125,6 +125,7 @@ ntfs_mount(struct mount *mp, const char *path, void *data, int err = 0; struct vnode *devvp; struct ntfs_args args; + char fname[MNAMELEN]; char fspec[MNAMELEN]; mode_t amode; @@ -167,9 +168,11 @@ ntfs_mount(struct mount *mp, const char *path, void *data, err = copyinstr(args.fspec, fspec, sizeof(fspec), NULL); if (err) goto error_1; - disk_map(fspec, fspec, MNAMELEN, DM_OPENBLCK); - NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, p); + if (disk_map(fspec, fname, sizeof(fname), DM_OPENBLCK) == -1) + bcopy(fspec, fname, sizeof(fname)); + + NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fname, p); err = namei(ndp); if (err) { /* can't get devvp!*/ @@ -238,7 +241,9 @@ ntfs_mount(struct mount *mp, const char *path, void *data, bzero(mp->mnt_stat.f_mntonname, MNAMELEN); strlcpy(mp->mnt_stat.f_mntonname, path, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); - strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromname, fname, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); bcopy(&args, &mp->mnt_stat.mount_info.ntfs_args, sizeof(args)); if ( !err) { err = ntfs_mountfs(devvp, mp, &args, p); diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 8431acecd3a..7641f458229 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mount.h,v 1.108 2012/09/05 17:01:06 deraadt Exp $ */ +/* $OpenBSD: mount.h,v 1.109 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: mount.h,v 1.48 1996/02/18 11:55:47 fvdl Exp $ */ /* @@ -301,6 +301,39 @@ struct statfs { fsid_t f_fsid; /* file system id */ u_int32_t f_namemax; /* maximum filename length */ uid_t f_owner; /* user that mounted the file system */ + u_int64_t f_ctime; /* last mount [-u] time */ + + char f_fstypename[MFSNAMELEN]; /* fs type name */ + char f_mntonname[MNAMELEN]; /* directory on which mounted */ + char f_mntfromname[MNAMELEN]; /* mounted file system */ + char f_mntfromspec[MNAMELEN]; /* special for mount request */ + union mount_info mount_info; /* per-filesystem mount options */ +}; + +#ifdef _KERNEL +/* COMPAT_O53 version without f_mntfromspec and smaller f_ctime */ +struct statfs53 { + u_int32_t f_flags; /* copy of mount flags */ + u_int32_t f_bsize; /* file system block size */ + u_int32_t f_iosize; /* optimal transfer block size */ + + /* unit is f_bsize */ + u_int64_t f_blocks; /* total data blocks in file system */ + u_int64_t f_bfree; /* free blocks in fs */ + int64_t f_bavail; /* free blocks avail to non-superuser */ + + u_int64_t f_files; /* total file nodes in file system */ + u_int64_t f_ffree; /* free file nodes in fs */ + int64_t f_favail; /* free file nodes avail to non-root */ + + u_int64_t f_syncwrites; /* count of sync writes since mount */ + u_int64_t f_syncreads; /* count of sync reads since mount */ + u_int64_t f_asyncwrites; /* count of async writes since mount */ + u_int64_t f_asyncreads; /* count of async reads since mount */ + + fsid_t f_fsid; /* file system id */ + u_int32_t f_namemax; /* maximum filename length */ + uid_t f_owner; /* user that mounted the file system */ u_int32_t f_ctime; /* last mount [-u] time */ u_int32_t f_spare[3]; /* spare for later */ @@ -309,6 +342,8 @@ struct statfs { char f_mntfromname[MNAMELEN]; /* mounted file system */ union mount_info mount_info; /* per-filesystem mount options */ }; +#endif /* _KERNEL */ + /* * File system types. diff --git a/sys/ufs/ext2fs/ext2fs_vfsops.c b/sys/ufs/ext2fs/ext2fs_vfsops.c index 9902670485f..84f392769b7 100644 --- a/sys/ufs/ext2fs/ext2fs_vfsops.c +++ b/sys/ufs/ext2fs/ext2fs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ext2fs_vfsops.c,v 1.65 2012/09/10 11:11:00 jsing Exp $ */ +/* $OpenBSD: ext2fs_vfsops.c,v 1.66 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: ext2fs_vfsops.c,v 1.1 1997/06/11 09:34:07 bouyer Exp $ */ /* @@ -167,11 +167,12 @@ ext2fs_mount(struct mount *mp, const char *path, void *data, struct ufs_args args; struct ufsmount *ump = NULL; struct m_ext2fs *fs; + char fname[MNAMELEN]; char fspec[MNAMELEN]; int error, flags; mode_t accessmode; - error = copyin(data, (caddr_t)&args, sizeof (struct ufs_args)); + error = copyin(data, &args, sizeof(struct ufs_args)); if (error) return (error); @@ -238,9 +239,11 @@ ext2fs_mount(struct mount *mp, const char *path, void *data, error = copyinstr(args.fspec, fspec, sizeof(fspec), NULL); if (error) goto error; - disk_map(fspec, fspec, MNAMELEN, DM_OPENBLCK); - NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, p); + if (disk_map(fspec, fname, MNAMELEN, DM_OPENBLCK) == -1) + bcopy(fspec, fname, sizeof(fname)); + + NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fname, p); if ((error = namei(ndp)) != 0) goto error; devvp = ndp->ni_vp; @@ -289,7 +292,9 @@ ext2fs_mount(struct mount *mp, const char *path, void *data, } bcopy(fs->e2fs_fsmnt, mp->mnt_stat.f_mntonname, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); - strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromname, fname, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); if (fs->e2fs_fmod != 0) { /* XXX */ fs->e2fs_fmod = 0; @@ -298,7 +303,7 @@ ext2fs_mount(struct mount *mp, const char *path, void *data, else printf("%s: file system not clean; please fsck(8)\n", mp->mnt_stat.f_mntfromname); - (void)ext2fs_cgupdate(ump, MNT_WAIT); + ext2fs_cgupdate(ump, MNT_WAIT); } goto success; @@ -695,6 +700,7 @@ ext2fs_statfs(struct mount *mp, struct statfs *sbp, struct proc *p) if (sbp != &mp->mnt_stat) { bcopy(mp->mnt_stat.f_mntonname, sbp->f_mntonname, MNAMELEN); bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN); + bcopy(mp->mnt_stat.f_mntfromspec, sbp->f_mntfromspec, MNAMELEN); } strncpy(sbp->f_fstypename, mp->mnt_vfc->vfc_name, MFSNAMELEN); return (0); diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 5c9e95c972a..aa9843cfe06 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ffs_vfsops.c,v 1.135 2012/09/10 11:11:00 jsing Exp $ */ +/* $OpenBSD: ffs_vfsops.c,v 1.136 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: ffs_vfsops.c,v 1.19 1996/02/09 22:22:26 christos Exp $ */ /* @@ -170,13 +170,13 @@ ffs_mount(struct mount *mp, const char *path, void *data, struct ufs_args args; struct ufsmount *ump = NULL; struct fs *fs; + char fname[MNAMELEN]; char fspec[MNAMELEN]; int error = 0, flags; int ronly; mode_t accessmode; - size_t size; - error = copyin(data, &args, sizeof (struct ufs_args)); + error = copyin(data, &args, sizeof(struct ufs_args)); if (error) return (error); @@ -336,10 +336,12 @@ ffs_mount(struct mount *mp, const char *path, void *data, */ error = copyinstr(args.fspec, fspec, sizeof(fspec), NULL); if (error) - goto error_1; - disk_map(fspec, fspec, MNAMELEN, DM_OPENBLCK); + goto error_1; + + if (disk_map(fspec, fname, MNAMELEN, DM_OPENBLCK) == -1) + bcopy(fspec, fname, sizeof(fname)); - NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fspec, p); + NDINIT(ndp, LOOKUP, FOLLOW, UIO_SYSSPACE, fname, p); if ((error = namei(ndp)) != 0) goto error_1; @@ -392,10 +394,10 @@ ffs_mount(struct mount *mp, const char *path, void *data, /* * Save "mounted from" info for mount point (NULL pad) */ - size = strlcpy(mp->mnt_stat.f_mntfromname, fspec, - MNAMELEN - 1); - bzero(mp->mnt_stat.f_mntfromname + size, - MNAMELEN - size); + bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromname, fname, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); } } else { /* @@ -407,7 +409,9 @@ ffs_mount(struct mount *mp, const char *path, void *data, bzero(mp->mnt_stat.f_mntonname, MNAMELEN); strlcpy(mp->mnt_stat.f_mntonname, path, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); - strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromname, fname, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); error = ffs_mountfs(devvp, mp, p); } diff --git a/sys/ufs/mfs/mfs_vfsops.c b/sys/ufs/mfs/mfs_vfsops.c index c29b924d14b..f793a921704 100644 --- a/sys/ufs/mfs/mfs_vfsops.c +++ b/sys/ufs/mfs/mfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mfs_vfsops.c,v 1.45 2013/01/15 11:20:55 jsing Exp $ */ +/* $OpenBSD: mfs_vfsops.c,v 1.46 2013/04/15 15:32:19 jsing Exp $ */ /* $NetBSD: mfs_vfsops.c,v 1.10 1996/02/09 22:31:28 christos Exp $ */ /* @@ -94,7 +94,7 @@ mfs_mount(struct mount *mp, const char *path, void *data, char fspec[MNAMELEN]; int flags, error; - error = copyin(data, (caddr_t)&args, sizeof(struct mfs_args)); + error = copyin(data, &args, sizeof(struct mfs_args)); if (error) return (error); @@ -152,6 +152,8 @@ mfs_mount(struct mount *mp, const char *path, void *data, bcopy(fs->fs_fsmnt, mp->mnt_stat.f_mntonname, MNAMELEN); bzero(mp->mnt_stat.f_mntfromname, MNAMELEN); strlcpy(mp->mnt_stat.f_mntfromname, fspec, MNAMELEN); + bzero(mp->mnt_stat.f_mntfromspec, MNAMELEN); + strlcpy(mp->mnt_stat.f_mntfromspec, fspec, MNAMELEN); bcopy(&args, &mp->mnt_stat.mount_info.mfs_args, sizeof(args)); return (0); |