summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/conf/NOTES3
-rw-r--r--sys/conf/options3
-rw-r--r--sys/dev/ccd/ccd.c1
-rw-r--r--sys/dev/fdc/fdc.c1
-rw-r--r--sys/dev/vinum/vinum.c1
-rw-r--r--sys/dev/vn/vn.c5
-rw-r--r--sys/fs/specfs/spec_vnops.c77
-rw-r--r--sys/geom/geom_ccd.c1
-rw-r--r--sys/i386/conf/LINT3
-rw-r--r--sys/i386/conf/NOTES3
-rw-r--r--sys/isa/fd.c1
-rw-r--r--sys/kern/subr_diskslice.c1
-rw-r--r--sys/kern/vfs_vnops.c34
-rw-r--r--sys/miscfs/specfs/spec_vnops.c77
-rw-r--r--sys/sys/conf.h2
-rw-r--r--sys/sys/linedisc.h2
-rw-r--r--sys/ufs/mfs/mfs_vfsops.c2
17 files changed, 95 insertions, 122 deletions
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index 7868bd8..544b2f4 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -625,9 +625,6 @@ pseudo-device vcoda 4 #coda minicache <-> venus comm.
#
options EXT2FS
-#
-# Only set this if you positively know why you should never do that.
-options ALLOW_BDEV_ACCESS # enable bdev access
#####################################################################
diff --git a/sys/conf/options b/sys/conf/options
index 2146ffe..ba04359 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -126,9 +126,6 @@ CD9660_ROOTDELAY opt_cd9660.h
# hidden yet.
UNION
-# Options for all filesystems
-ALLOW_BDEV_ACCESS opt_fs.h
-
# Options used only in param.c.
HZ opt_param.h
MAXFILES opt_param.h
diff --git a/sys/dev/ccd/ccd.c b/sys/dev/ccd/ccd.c
index c4a0a8e..7badacb 100644
--- a/sys/dev/ccd/ccd.c
+++ b/sys/dev/ccd/ccd.c
@@ -634,6 +634,7 @@ ccdopen(dev, flags, fmt, p)
pmask = (1 << part);
dev->si_bsize_phys = DEV_BSIZE;
+ dev->si_bsize_best = BLKDEV_IOSIZE;
dev->si_bsize_max = MAXBSIZE;
/*
diff --git a/sys/dev/fdc/fdc.c b/sys/dev/fdc/fdc.c
index 539569d..7704cca 100644
--- a/sys/dev/fdc/fdc.c
+++ b/sys/dev/fdc/fdc.c
@@ -1227,6 +1227,7 @@ Fdopen(dev_t dev, int flags, int mode, struct proc *p)
fdc_p fdc;
dev->si_bsize_phys = DEV_BSIZE;
+ dev->si_bsize_best = BLKDEV_IOSIZE;
dev->si_bsize_max = MAXBSIZE;
/* check bounds */
if ((fd = devclass_get_softc(fd_devclass, fdu)) == 0)
diff --git a/sys/dev/vinum/vinum.c b/sys/dev/vinum/vinum.c
index 46ff86a..2482185 100644
--- a/sys/dev/vinum/vinum.c
+++ b/sys/dev/vinum/vinum.c
@@ -269,6 +269,7 @@ vinumopen(dev_t dev,
devminor = minor(dev);
dev->si_bsize_phys = DEV_BSIZE;
+ dev->si_bsize_best = VINUM_BSIZE_BEST; /* kludge until we track drive block sizes */
dev->si_bsize_max = MAXBSIZE;
error = 0;
/* First, decide what we're looking at */
diff --git a/sys/dev/vn/vn.c b/sys/dev/vn/vn.c
index 199c804..f51efca 100644
--- a/sys/dev/vn/vn.c
+++ b/sys/dev/vn/vn.c
@@ -510,7 +510,10 @@ vniocattach_file(vn, vio, dev, flag, p)
(void) vn_close(nd.ni_vp, flags, p->p_ucred, p);
return(error);
}
- dev->si_bsize_phys = vn->sc_secsize;
+ if (dev->si_bsize_phys < vn->sc_secsize)
+ dev->si_bsize_phys = vn->sc_secsize;
+ if (dev->si_bsize_best < vn->sc_secsize)
+ dev->si_bsize_best = vn->sc_secsize;
vn->sc_flags |= VNF_INITED;
if (flags == FREAD)
vn->sc_flags |= VNF_READONLY;
diff --git a/sys/fs/specfs/spec_vnops.c b/sys/fs/specfs/spec_vnops.c
index 8fd4539..1afc400 100644
--- a/sys/fs/specfs/spec_vnops.c
+++ b/sys/fs/specfs/spec_vnops.c
@@ -34,7 +34,6 @@
* $FreeBSD$
*/
-#include "opt_fs.h"
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/systm.h>
@@ -47,7 +46,6 @@
#include <sys/fcntl.h>
#include <sys/disklabel.h>
#include <sys/vmmeter.h>
-#include <sys/sysctl.h>
#include <vm/vm.h>
#include <vm/vm_prot.h>
@@ -235,15 +233,6 @@ spec_open(ap)
return (0);
}
-#ifdef ALLOW_BDEV_ACCESS
-static int bdev_access = 1;
-#else
-static int bdev_access;
-#endif
-
-SYSCTL_INT(_vfs, OID_AUTO, bdev_access, CTLFLAG_RW, &bdev_access, 0,
- "allow block device access");
-
/*
* Vnode op for read
*/
@@ -257,8 +246,8 @@ spec_read(ap)
struct ucred *a_cred;
} */ *ap;
{
- struct vnode *vp = ap->a_vp;
- struct uio *uio = ap->a_uio;
+ register struct vnode *vp = ap->a_vp;
+ register struct uio *uio = ap->a_uio;
struct proc *p = uio->uio_procp;
struct buf *bp;
daddr_t bn, nextbn;
@@ -269,8 +258,6 @@ spec_read(ap)
int error = 0;
dev_t dev;
- dev = vp->v_rdev;
-
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_READ)
panic("spec_read mode");
@@ -282,14 +269,24 @@ spec_read(ap)
switch (vp->v_type) {
+ case VCHR:
+ VOP_UNLOCK(vp, 0, p);
+ error = (*devsw(vp->v_rdev)->d_read)
+ (vp->v_rdev, uio, ap->a_ioflag);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ return (error);
+
case VBLK:
-if (bdev_access) {
if (uio->uio_offset < 0)
return (EINVAL);
+ dev = vp->v_rdev;
- bsize = dev->si_bsize_phys;
- if (bsize < BLKDEV_IOSIZE)
- bsize = BLKDEV_IOSIZE;
+ /*
+ * Calculate block size for block device. The block size must
+ * be larger then the physical minimum.
+ */
+
+ bsize = vp->v_rdev->si_bsize_best;
if ((ioctl = devsw(dev)->d_ioctl) != NULL &&
(*ioctl)(dev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0 &&
@@ -317,12 +314,6 @@ if (bdev_access) {
brelse(bp);
} while (error == 0 && uio->uio_resid > 0 && n != 0);
return (error);
-}
- case VCHR:
- VOP_UNLOCK(vp, 0, p);
- error = (*devsw(dev)->d_read) (dev, uio, ap->a_ioflag);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
- return (error);
default:
panic("spec_read type");
@@ -343,8 +334,8 @@ spec_write(ap)
struct ucred *a_cred;
} */ *ap;
{
- struct vnode *vp = ap->a_vp;
- struct uio *uio = ap->a_uio;
+ register struct vnode *vp = ap->a_vp;
+ register struct uio *uio = ap->a_uio;
struct proc *p = uio->uio_procp;
struct buf *bp;
daddr_t bn;
@@ -352,30 +343,36 @@ spec_write(ap)
struct partinfo dpart;
register int n, on;
int error = 0;
- dev_t dev;
- dev = vp->v_rdev;
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_WRITE)
panic("spec_write mode");
if (uio->uio_segflg == UIO_USERSPACE && uio->uio_procp != curproc)
panic("spec_write proc");
#endif
- if (uio->uio_resid == 0)
- return (0);
switch (vp->v_type) {
+ case VCHR:
+ VOP_UNLOCK(vp, 0, p);
+ error = (*devsw(vp->v_rdev)->d_write)
+ (vp->v_rdev, uio, ap->a_ioflag);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ return (error);
+
case VBLK:
-if (bdev_access) {
+ if (uio->uio_resid == 0)
+ return (0);
if (uio->uio_offset < 0)
return (EINVAL);
- bsize = dev->si_bsize_phys;
- if (bsize < BLKDEV_IOSIZE)
- bsize = BLKDEV_IOSIZE;
+ /*
+ * Calculate block size for block device. The block size must
+ * be larger then the physical minimum.
+ */
+ bsize = vp->v_rdev->si_bsize_best;
- if ((*devsw(dev)->d_ioctl)(dev, DIOCGPART,
+ if ((*devsw(vp->v_rdev)->d_ioctl)(vp->v_rdev, DIOCGPART,
(caddr_t)&dpart, FREAD, p) == 0) {
if (dpart.part->p_fstype == FS_BSDFFS &&
dpart.part->p_frag != 0 && dpart.part->p_fsize != 0)
@@ -403,14 +400,6 @@ if (bdev_access) {
bdwrite(bp);
} while (error == 0 && uio->uio_resid > 0 && n != 0);
return (error);
-}
-
- case VCHR:
- VOP_UNLOCK(vp, 0, p);
- error = (*devsw(dev)->d_write)
- (dev, uio, ap->a_ioflag);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
- return (error);
default:
panic("spec_write type");
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c
index c4a0a8e..7badacb 100644
--- a/sys/geom/geom_ccd.c
+++ b/sys/geom/geom_ccd.c
@@ -634,6 +634,7 @@ ccdopen(dev, flags, fmt, p)
pmask = (1 << part);
dev->si_bsize_phys = DEV_BSIZE;
+ dev->si_bsize_best = BLKDEV_IOSIZE;
dev->si_bsize_max = MAXBSIZE;
/*
diff --git a/sys/i386/conf/LINT b/sys/i386/conf/LINT
index 7868bd8..544b2f4 100644
--- a/sys/i386/conf/LINT
+++ b/sys/i386/conf/LINT
@@ -625,9 +625,6 @@ pseudo-device vcoda 4 #coda minicache <-> venus comm.
#
options EXT2FS
-#
-# Only set this if you positively know why you should never do that.
-options ALLOW_BDEV_ACCESS # enable bdev access
#####################################################################
diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES
index 7868bd8..544b2f4 100644
--- a/sys/i386/conf/NOTES
+++ b/sys/i386/conf/NOTES
@@ -625,9 +625,6 @@ pseudo-device vcoda 4 #coda minicache <-> venus comm.
#
options EXT2FS
-#
-# Only set this if you positively know why you should never do that.
-options ALLOW_BDEV_ACCESS # enable bdev access
#####################################################################
diff --git a/sys/isa/fd.c b/sys/isa/fd.c
index 539569d..7704cca 100644
--- a/sys/isa/fd.c
+++ b/sys/isa/fd.c
@@ -1227,6 +1227,7 @@ Fdopen(dev_t dev, int flags, int mode, struct proc *p)
fdc_p fdc;
dev->si_bsize_phys = DEV_BSIZE;
+ dev->si_bsize_best = BLKDEV_IOSIZE;
dev->si_bsize_max = MAXBSIZE;
/* check bounds */
if ((fd = devclass_get_softc(fd_devclass, fdu)) == 0)
diff --git a/sys/kern/subr_diskslice.c b/sys/kern/subr_diskslice.c
index d8dda72..df187ef 100644
--- a/sys/kern/subr_diskslice.c
+++ b/sys/kern/subr_diskslice.c
@@ -716,6 +716,7 @@ dsopen(dev, mode, flags, sspp, lp)
int unit;
dev->si_bsize_phys = lp->d_secsize;
+ dev->si_bsize_best = BLKDEV_IOSIZE;
dev->si_bsize_max = MAXBSIZE;
unit = dkunit(dev);
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index c64a77e..0a08938 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -429,31 +429,23 @@ vn_stat(vp, sb, p)
sb->st_atimespec = vap->va_atime;
sb->st_mtimespec = vap->va_mtime;
sb->st_ctimespec = vap->va_ctime;
-
/*
- * According to www.opengroup.org, the meaning of st_blksize is
- * "a filesystem-specific preferred I/O block size for this
- * object. In some filesystem types, this may vary from file
- * to file"
- * Default to zero to catch bogus uses of this field.
+ * For block and char device nodes we don't really care
+ * about what the filesystem told us, we want to know
+ * what the device told us
*/
- sb->st_blksize = 0;
-
- if (vp->v_type == VREG)
- sb->st_blksize = vap->va_blocksize;
-
- /*
- * For disks we can say something sensible. We report the max
- * size because we prefer few big transfers than many small.
- * XXX: Only reliable if the disk is opened.
- * XXX: Use vn_isdisk when it allows VCHR too
- */
- if ((vp->v_type == VBLK || vp->v_type == VCHR) &&
- devsw(vp->v_rdev) && (devsw(vp->v_rdev)->d_flags & D_DISK))
+ switch (vap->va_type) {
+ case VBLK:
+ sb->st_blksize = vp->v_rdev->si_bsize_best;
+ break;
+ case VCHR:
sb->st_blksize = vp->v_rdev->si_bsize_max;
-
+ break;
+ default:
+ sb->st_blksize = vap->va_blocksize;
+ break;
+ }
sb->st_flags = vap->va_flags;
-
if (suser_xxx(p->p_ucred, 0, 0))
sb->st_gen = 0;
else
diff --git a/sys/miscfs/specfs/spec_vnops.c b/sys/miscfs/specfs/spec_vnops.c
index 8fd4539..1afc400 100644
--- a/sys/miscfs/specfs/spec_vnops.c
+++ b/sys/miscfs/specfs/spec_vnops.c
@@ -34,7 +34,6 @@
* $FreeBSD$
*/
-#include "opt_fs.h"
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/systm.h>
@@ -47,7 +46,6 @@
#include <sys/fcntl.h>
#include <sys/disklabel.h>
#include <sys/vmmeter.h>
-#include <sys/sysctl.h>
#include <vm/vm.h>
#include <vm/vm_prot.h>
@@ -235,15 +233,6 @@ spec_open(ap)
return (0);
}
-#ifdef ALLOW_BDEV_ACCESS
-static int bdev_access = 1;
-#else
-static int bdev_access;
-#endif
-
-SYSCTL_INT(_vfs, OID_AUTO, bdev_access, CTLFLAG_RW, &bdev_access, 0,
- "allow block device access");
-
/*
* Vnode op for read
*/
@@ -257,8 +246,8 @@ spec_read(ap)
struct ucred *a_cred;
} */ *ap;
{
- struct vnode *vp = ap->a_vp;
- struct uio *uio = ap->a_uio;
+ register struct vnode *vp = ap->a_vp;
+ register struct uio *uio = ap->a_uio;
struct proc *p = uio->uio_procp;
struct buf *bp;
daddr_t bn, nextbn;
@@ -269,8 +258,6 @@ spec_read(ap)
int error = 0;
dev_t dev;
- dev = vp->v_rdev;
-
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_READ)
panic("spec_read mode");
@@ -282,14 +269,24 @@ spec_read(ap)
switch (vp->v_type) {
+ case VCHR:
+ VOP_UNLOCK(vp, 0, p);
+ error = (*devsw(vp->v_rdev)->d_read)
+ (vp->v_rdev, uio, ap->a_ioflag);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ return (error);
+
case VBLK:
-if (bdev_access) {
if (uio->uio_offset < 0)
return (EINVAL);
+ dev = vp->v_rdev;
- bsize = dev->si_bsize_phys;
- if (bsize < BLKDEV_IOSIZE)
- bsize = BLKDEV_IOSIZE;
+ /*
+ * Calculate block size for block device. The block size must
+ * be larger then the physical minimum.
+ */
+
+ bsize = vp->v_rdev->si_bsize_best;
if ((ioctl = devsw(dev)->d_ioctl) != NULL &&
(*ioctl)(dev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0 &&
@@ -317,12 +314,6 @@ if (bdev_access) {
brelse(bp);
} while (error == 0 && uio->uio_resid > 0 && n != 0);
return (error);
-}
- case VCHR:
- VOP_UNLOCK(vp, 0, p);
- error = (*devsw(dev)->d_read) (dev, uio, ap->a_ioflag);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
- return (error);
default:
panic("spec_read type");
@@ -343,8 +334,8 @@ spec_write(ap)
struct ucred *a_cred;
} */ *ap;
{
- struct vnode *vp = ap->a_vp;
- struct uio *uio = ap->a_uio;
+ register struct vnode *vp = ap->a_vp;
+ register struct uio *uio = ap->a_uio;
struct proc *p = uio->uio_procp;
struct buf *bp;
daddr_t bn;
@@ -352,30 +343,36 @@ spec_write(ap)
struct partinfo dpart;
register int n, on;
int error = 0;
- dev_t dev;
- dev = vp->v_rdev;
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_WRITE)
panic("spec_write mode");
if (uio->uio_segflg == UIO_USERSPACE && uio->uio_procp != curproc)
panic("spec_write proc");
#endif
- if (uio->uio_resid == 0)
- return (0);
switch (vp->v_type) {
+ case VCHR:
+ VOP_UNLOCK(vp, 0, p);
+ error = (*devsw(vp->v_rdev)->d_write)
+ (vp->v_rdev, uio, ap->a_ioflag);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ return (error);
+
case VBLK:
-if (bdev_access) {
+ if (uio->uio_resid == 0)
+ return (0);
if (uio->uio_offset < 0)
return (EINVAL);
- bsize = dev->si_bsize_phys;
- if (bsize < BLKDEV_IOSIZE)
- bsize = BLKDEV_IOSIZE;
+ /*
+ * Calculate block size for block device. The block size must
+ * be larger then the physical minimum.
+ */
+ bsize = vp->v_rdev->si_bsize_best;
- if ((*devsw(dev)->d_ioctl)(dev, DIOCGPART,
+ if ((*devsw(vp->v_rdev)->d_ioctl)(vp->v_rdev, DIOCGPART,
(caddr_t)&dpart, FREAD, p) == 0) {
if (dpart.part->p_fstype == FS_BSDFFS &&
dpart.part->p_frag != 0 && dpart.part->p_fsize != 0)
@@ -403,14 +400,6 @@ if (bdev_access) {
bdwrite(bp);
} while (error == 0 && uio->uio_resid > 0 && n != 0);
return (error);
-}
-
- case VCHR:
- VOP_UNLOCK(vp, 0, p);
- error = (*devsw(dev)->d_write)
- (dev, uio, ap->a_ioflag);
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
- return (error);
default:
panic("spec_write type");
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 7232781..ddf4c68 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -69,6 +69,7 @@ struct specinfo {
struct disk *__sid_disk;
struct mount *__sid_mountpoint;
int __sid_bsize_phys; /* min physical block size */
+ int __sid_bsize_best; /* optimal block size */
int __sid_bsize_max; /* maximum block size */
} __si_disk;
} __si_u;
@@ -78,6 +79,7 @@ struct specinfo {
#define si_disk __si_u.__si_disk.__sid_disk
#define si_mountpoint __si_u.__si_disk.__sid_mountpoint
#define si_bsize_phys __si_u.__si_disk.__sid_bsize_phys
+#define si_bsize_best __si_u.__si_disk.__sid_bsize_best
#define si_bsize_max __si_u.__si_disk.__sid_bsize_max
/*
diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h
index 7232781..ddf4c68 100644
--- a/sys/sys/linedisc.h
+++ b/sys/sys/linedisc.h
@@ -69,6 +69,7 @@ struct specinfo {
struct disk *__sid_disk;
struct mount *__sid_mountpoint;
int __sid_bsize_phys; /* min physical block size */
+ int __sid_bsize_best; /* optimal block size */
int __sid_bsize_max; /* maximum block size */
} __si_disk;
} __si_u;
@@ -78,6 +79,7 @@ struct specinfo {
#define si_disk __si_u.__si_disk.__sid_disk
#define si_mountpoint __si_u.__si_disk.__sid_mountpoint
#define si_bsize_phys __si_u.__si_disk.__sid_bsize_phys
+#define si_bsize_best __si_u.__si_disk.__sid_bsize_best
#define si_bsize_max __si_u.__si_disk.__sid_bsize_max
/*
diff --git a/sys/ufs/mfs/mfs_vfsops.c b/sys/ufs/mfs/mfs_vfsops.c
index 4f8c9f6..044bf63 100644
--- a/sys/ufs/mfs/mfs_vfsops.c
+++ b/sys/ufs/mfs/mfs_vfsops.c
@@ -333,6 +333,7 @@ mfs_mount(mp, path, data, ndp, p)
devvp->v_type = VBLK;
dev = make_dev(&mfs_cdevsw, mfs_minor, 0, 0, 0, "MFS%d", mfs_minor);
dev->si_bsize_phys = DEV_BSIZE;
+ dev->si_bsize_best = BLKDEV_IOSIZE;
dev->si_bsize_max = MAXBSIZE;
addaliasu(devvp, makeudev(253, mfs_minor++));
devvp->v_data = mfsp;
@@ -494,6 +495,7 @@ mfs_init(vfsp)
rootdev = make_dev(&mfs_cdevsw, mfs_minor,
0, 0, 0, "MFS%d", mfs_minor);
rootdev->si_bsize_phys = DEV_BSIZE;
+ rootdev->si_bsize_best = BLKDEV_IOSIZE;
rootdev->si_bsize_max = MAXBSIZE;
mfs_minor++;
} else if (bootverbose)
OpenPOWER on IntegriCloud