summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkato <kato@FreeBSD.org>1997-09-27 13:40:20 +0000
committerkato <kato@FreeBSD.org>1997-09-27 13:40:20 +0000
commitfe9b86cf0b7a453c772a2756389fda91c12c3fab (patch)
treee695260038ca9665181b5b5c99ae6fa77fba443a
parent31e1d6ad00b9d8f39549115d4ef76fbee62e9748 (diff)
downloadFreeBSD-src-fe9b86cf0b7a453c772a2756389fda91c12c3fab.zip
FreeBSD-src-fe9b86cf0b7a453c772a2756389fda91c12c3fab.tar.gz
Clustered read and write are switched at mount-option level.
1. Clustered I/O is switched by the MNT_NOCLUSTERR and MNT_NOCLUSTERW bits of the mnt_flag. The sysctl variables, vfs.foo.doclusterread and vfs.foo.doclusterwrite are deleted. Only mount option can control clustered I/O from userland. 2. When foofs_mount mounts block device, foofs_mount checks D_CLUSTERR and D_CLUSTERW bits of the d_flags member in the block device switch table. If D_NOCLUSTERR / D_NOCLUSTERW are set, MNT_NOCLUSTERR / MNT_NOCLUSTERW bits will be set. In this case, MNT_NOCLUSTERR and MNT_NOCLUSTERW cannot be cleared from userland. 3. Vnode driver disables both clustered read and write. 4. Union filesystem disables clutered write. Reviewed by: bde
-rw-r--r--sys/dev/vn/vn.c6
-rw-r--r--sys/fs/cd9660/cd9660_vfsops.c18
-rw-r--r--sys/fs/cd9660/cd9660_vnops.c20
-rw-r--r--sys/fs/specfs/spec_vnops.c11
-rw-r--r--sys/fs/unionfs/union_vfsops.c7
-rw-r--r--sys/gnu/ext2fs/ext2_extern.h13
-rw-r--r--sys/gnu/ext2fs/ext2_readwrite.c4
-rw-r--r--sys/gnu/ext2fs/ext2_vfsops.c18
-rw-r--r--sys/gnu/ext2fs/ext2_vnops.c11
-rw-r--r--sys/gnu/fs/ext2fs/ext2_extern.h13
-rw-r--r--sys/gnu/fs/ext2fs/ext2_readwrite.c4
-rw-r--r--sys/gnu/fs/ext2fs/ext2_vfsops.c18
-rw-r--r--sys/gnu/fs/ext2fs/ext2_vnops.c11
-rw-r--r--sys/isofs/cd9660/cd9660_vfsops.c18
-rw-r--r--sys/isofs/cd9660/cd9660_vnops.c20
-rw-r--r--sys/kern/kern_conf.c8
-rw-r--r--sys/kern/vfs_extattr.c7
-rw-r--r--sys/kern/vfs_syscalls.c7
-rw-r--r--sys/miscfs/specfs/spec_vnops.c11
-rw-r--r--sys/miscfs/union/union_vfsops.c7
-rw-r--r--sys/sys/conf.h13
-rw-r--r--sys/sys/linedisc.h13
-rw-r--r--sys/sys/mount.h11
-rw-r--r--sys/ufs/ffs/ffs_extern.h8
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c21
-rw-r--r--sys/ufs/ffs/ffs_vnops.c12
-rw-r--r--sys/ufs/ufs/ufs_readwrite.c6
27 files changed, 161 insertions, 155 deletions
diff --git a/sys/dev/vn/vn.c b/sys/dev/vn/vn.c
index 6cb4856..d851d2a 100644
--- a/sys/dev/vn/vn.c
+++ b/sys/dev/vn/vn.c
@@ -38,7 +38,7 @@
* from: Utah Hdr: vn.c 1.13 94/04/02
*
* from: @(#)vn.c 8.6 (Berkeley) 4/1/94
- * $Id: vn.c,v 1.48 1997/06/14 13:56:09 bde Exp $
+ * $Id: vn.c,v 1.49 1997/08/14 13:44:19 kato Exp $
*/
/*
@@ -101,8 +101,8 @@ static d_strategy_t vnstrategy;
#define BDEV_MAJOR 15
static struct cdevsw vn_cdevsw;
static struct bdevsw vn_bdevsw =
- { vnopen, vnclose, vnstrategy, vnioctl, /*15*/
- vndump, vnsize, D_DISK, "vn", &vn_cdevsw, -1 };
+ { vnopen, vnclose, vnstrategy, vnioctl, /*15*/
+ vndump, vnsize, D_DISK | D_NOCLUSTERRW, "vn", &vn_cdevsw, -1 };
#ifdef DEBUG
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c
index c652ab1..b29a042 100644
--- a/sys/fs/cd9660/cd9660_vfsops.c
+++ b/sys/fs/cd9660/cd9660_vfsops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vfsops.c 8.18 (Berkeley) 5/22/95
- * $Id: cd9660_vfsops.c,v 1.27 1997/08/16 19:15:00 wollman Exp $
+ * $Id: cd9660_vfsops.c,v 1.28 1997/09/07 16:20:42 bde Exp $
*/
#include <sys/param.h>
@@ -183,9 +183,11 @@ cd9660_mount(mp, path, data, ndp, p)
int error;
struct iso_mnt *imp = 0;
- if ((mp->mnt_flag & MNT_ROOTFS) != 0)
+ if ((mp->mnt_flag & MNT_ROOTFS) != 0) {
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
return (iso_mountroot(mp, p));
-
+ }
if ((error = copyin(data, (caddr_t)&args, sizeof (struct iso_args))))
return (error);
@@ -195,9 +197,13 @@ cd9660_mount(mp, path, data, ndp, p)
/*
* If updating, check whether changing from read-only to
* read/write; if there is no device name, that's all we do.
+ * Disallow clearing MNT_NOCLUSTERR flag, if block device requests.
*/
if (mp->mnt_flag & MNT_UPDATE) {
imp = VFSTOISOFS(mp);
+ if (bdevsw[major(imp->im_devvp->v_rdev)]->d_flags &
+ D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
if (args.fspec == 0)
return (vfs_export(mp, &imp->im_export, &args.export));
}
@@ -218,9 +224,11 @@ cd9660_mount(mp, path, data, ndp, p)
vrele(devvp);
return ENXIO;
}
- if ((mp->mnt_flag & MNT_UPDATE) == 0)
+ if ((mp->mnt_flag & MNT_UPDATE) == 0) {
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
error = iso_mountfs(devvp, mp, p, &args);
- else {
+ } else {
if (devvp != imp->im_devvp)
error = EINVAL; /* needs translation */
else
diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c
index e518e89..cddb6fd 100644
--- a/sys/fs/cd9660/cd9660_vnops.c
+++ b/sys/fs/cd9660/cd9660_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vnops.c 8.19 (Berkeley) 5/27/95
- * $Id: cd9660_vnops.c,v 1.38 1997/09/14 02:57:43 peter Exp $
+ * $Id: cd9660_vnops.c,v 1.39 1997/09/21 04:22:40 dyson Exp $
*/
#include <sys/param.h>
@@ -81,17 +81,6 @@ static int cd9660_print __P((struct vop_print_args *));
static int cd9660_islocked __P((struct vop_islocked_args *));
/*
- * Sysctl values for the cd9660 filesystem.
- */
-#define CD9660_CLUSTERREAD 1 /* cluster reading enabled */
-#define CD9660_MAXID 2 /* number of valid cd9660 ids */
-
-#define CD9660_NAMES { \
- {0, 0}, \
- { "doclusterread", CTLTYPE_INT}, \
-}
-
-/*
* Setattr call. Only allowed for block and character special devices.
*/
int
@@ -299,11 +288,6 @@ cd9660_getattr(ap)
return (0);
}
-static int cd9660_doclusterread = 1;
-SYSCTL_NODE(_vfs, MOUNT_CD9660, cd9660, CTLFLAG_RW, 0, "CD9660 filesystem");
-SYSCTL_INT(_vfs_cd9660, CD9660_CLUSTERREAD, doclusterread,
- CTLFLAG_RW, &cd9660_doclusterread, 0, "");
-
/*
* Vnode op for reading.
*/
@@ -344,7 +328,7 @@ cd9660_read(ap)
n = diff;
size = blksize(imp, ip, lbn);
rablock = lbn + 1;
- if (cd9660_doclusterread) {
+ if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0) {
if (lblktosize(imp, rablock) <= ip->i_size)
error = cluster_read(vp, (off_t)ip->i_size,
lbn, size, NOCRED, uio->uio_resid,
diff --git a/sys/fs/specfs/spec_vnops.c b/sys/fs/specfs/spec_vnops.c
index b5407ee..dd05fc0 100644
--- a/sys/fs/specfs/spec_vnops.c
+++ b/sys/fs/specfs/spec_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)spec_vnops.c 8.14 (Berkeley) 5/21/95
- * $Id: spec_vnops.c,v 1.41 1997/09/02 20:06:12 bde Exp $
+ * $Id: spec_vnops.c,v 1.42 1997/09/14 02:58:02 peter Exp $
*/
#include <sys/param.h>
@@ -176,7 +176,8 @@ spec_open(ap)
*/
if (securelevel >= 2
&& cdevsw[maj]->d_bdev
- && cdevsw[maj]->d_bdev->d_flags == D_DISK)
+ && (cdevsw[maj]->d_bdev->d_flags & D_TYPEMASK) ==
+ D_DISK)
return (EPERM);
/*
* When running in secure mode, do not allow opens
@@ -220,7 +221,8 @@ spec_open(ap)
* opens for writing of any disk block devices.
*/
if (securelevel >= 2 && ap->a_cred != FSCRED &&
- (ap->a_mode & FWRITE) && bdevsw[maj]->d_flags == D_DISK)
+ (ap->a_mode & FWRITE) &&
+ (bdevsw[maj]->d_flags & D_TYPEMASK) == D_DISK)
return (EPERM);
/*
* Do not allow opens of block devices that are
@@ -422,7 +424,8 @@ spec_ioctl(ap)
case VBLK:
if (ap->a_command == 0 && (int)ap->a_data == B_TAPE)
- if (bdevsw[major(dev)]->d_flags == D_TAPE)
+ if ((bdevsw[major(dev)]->d_flags & D_TYPEMASK) ==
+ D_TAPE)
return (0);
else
return (1);
diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c
index e7954be..8478a1c 100644
--- a/sys/fs/unionfs/union_vfsops.c
+++ b/sys/fs/unionfs/union_vfsops.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* @(#)union_vfsops.c 8.20 (Berkeley) 5/20/95
- * $Id: union_vfsops.c,v 1.18 1997/08/02 14:32:29 bde Exp $
+ * $Id: union_vfsops.c,v 1.19 1997/08/16 19:15:22 wollman Exp $
*/
/*
@@ -103,6 +103,11 @@ union_mount(mp, path, data, ndp, p)
#endif
/*
+ * Disable clustered write, otherwise system becomes unstable.
+ */
+ mp->mnt_flag |= MNT_NOCLUSTERW;
+
+ /*
* Update is a no-op
*/
if (mp->mnt_flag & MNT_UPDATE) {
diff --git a/sys/gnu/ext2fs/ext2_extern.h b/sys/gnu/ext2fs/ext2_extern.h
index 277106b..4c32799 100644
--- a/sys/gnu/ext2fs/ext2_extern.h
+++ b/sys/gnu/ext2fs/ext2_extern.h
@@ -42,19 +42,6 @@
#ifndef _SYS_GNU_EXT2FS_EXT2_EXTERN_H_
#define _SYS_GNU_EXT2FS_EXT2_EXTERN_H_
-/*
- * Sysctl values for the ext2fs filesystem.
- */
-#define EXT2FS_CLUSTERREAD 1 /* cluster reading enabled */
-#define EXT2FS_CLUSTERWRITE 2 /* cluster writing enable */
-#define EXT2FS_MAXID 3 /* number of valid ext2fs ids */
-
-#define EXT2FS_NAMES {\
- {0, 0}, \
- { "doclusterread", CTLTYPE_INT }, \
- { "doculsterwrite", CTLTYPE_INT }, \
-}
-
struct dinode;
struct ext2_inode;
struct inode;
diff --git a/sys/gnu/ext2fs/ext2_readwrite.c b/sys/gnu/ext2fs/ext2_readwrite.c
index e28cd0a..986bc14 100644
--- a/sys/gnu/ext2fs/ext2_readwrite.c
+++ b/sys/gnu/ext2fs/ext2_readwrite.c
@@ -112,7 +112,7 @@ READ(ap)
if (lblktosize(fs, nextlbn) >= ip->i_size)
error = bread(vp, lbn, size, NOCRED, &bp);
- else if (ext2_doclusterread)
+ else if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0)
error = cluster_read(vp,
ip->i_size, lbn, size, NOCRED,
uio->uio_resid, (ap->a_ioflag >> 16), &bp);
@@ -277,7 +277,7 @@ WRITE(ap)
if (ioflag & IO_SYNC) {
(void)bwrite(bp);
} else if (xfersize + blkoffset == fs->s_frag_size) {
- if (ext2_doclusterwrite) {
+ if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERW) == 0) {
#if defined(__FreeBSD__)
bp->b_flags |= B_CLUSTEROK;
#endif
diff --git a/sys/gnu/ext2fs/ext2_vfsops.c b/sys/gnu/ext2fs/ext2_vfsops.c
index 7aef5f6..11d1b33 100644
--- a/sys/gnu/ext2fs/ext2_vfsops.c
+++ b/sys/gnu/ext2fs/ext2_vfsops.c
@@ -149,6 +149,10 @@ ext2_mountroot()
bzero((char *)mp, (u_long)sizeof(struct mount));
mp->mnt_op = &ext2fs_vfsops;
mp->mnt_flag = MNT_RDONLY;
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
if (error = ext2_mountfs(rootvp, mp, p)) {
bsd_free(mp, M_MOUNT);
return (error);
@@ -206,11 +210,17 @@ ext2_mount(mp, path, data, ndp, p)
/*
* If updating, check whether changing from read-only to
* read/write; if there is no device name, that's all we do.
+ * Disallow clearing MNT_NOCLUSTERR and MNT_NOCLUSTERW flags,
+ * if block device requests.
*/
if (mp->mnt_flag & MNT_UPDATE) {
ump = VFSTOUFS(mp);
fs = ump->um_e2fs;
error = 0;
+ if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
if (fs->s_rd_only == 0 && (mp->mnt_flag & MNT_RDONLY)) {
flags = WRITECLOSE;
if (mp->mnt_flag & MNT_FORCE)
@@ -255,9 +265,13 @@ ext2_mount(mp, path, data, ndp, p)
vrele(devvp);
return (ENXIO);
}
- if ((mp->mnt_flag & MNT_UPDATE) == 0)
+ if ((mp->mnt_flag & MNT_UPDATE) == 0) {
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
error = ext2_mountfs(devvp, mp, p);
- else {
+ } else {
if (devvp != ump->um_devvp)
error = EINVAL; /* needs translation */
else
diff --git a/sys/gnu/ext2fs/ext2_vnops.c b/sys/gnu/ext2fs/ext2_vnops.c
index 583164b..94fe0a7 100644
--- a/sys/gnu/ext2fs/ext2_vnops.c
+++ b/sys/gnu/ext2fs/ext2_vnops.c
@@ -237,17 +237,6 @@ static struct vnodeopv_desc ext2fs_fifoop_opv_desc =
VNODEOP_SET(ext2fs_fifoop_opv_desc);
#endif
-/*
- * Enabling cluster read/write operations.
- */
-static int ext2_doclusterread = 1;
-static int ext2_doclusterwrite = 1;
-SYSCTL_NODE(_vfs, MOUNT_EXT2FS, ext2fs, CTLFLAG_RW, 0, "EXT2FS filesystem");
-SYSCTL_INT(_vfs_ext2fs, EXT2FS_CLUSTERREAD, doclusterread,
- CTLFLAG_RW, &ext2_doclusterread, 0, "");
-SYSCTL_INT(_vfs_ext2fs, EXT2FS_CLUSTERWRITE, doclusterwrite,
- CTLFLAG_RW, &ext2_doclusterwrite, 0, "");
-
#include <gnu/ext2fs/ext2_readwrite.c>
/*
diff --git a/sys/gnu/fs/ext2fs/ext2_extern.h b/sys/gnu/fs/ext2fs/ext2_extern.h
index 277106b..4c32799 100644
--- a/sys/gnu/fs/ext2fs/ext2_extern.h
+++ b/sys/gnu/fs/ext2fs/ext2_extern.h
@@ -42,19 +42,6 @@
#ifndef _SYS_GNU_EXT2FS_EXT2_EXTERN_H_
#define _SYS_GNU_EXT2FS_EXT2_EXTERN_H_
-/*
- * Sysctl values for the ext2fs filesystem.
- */
-#define EXT2FS_CLUSTERREAD 1 /* cluster reading enabled */
-#define EXT2FS_CLUSTERWRITE 2 /* cluster writing enable */
-#define EXT2FS_MAXID 3 /* number of valid ext2fs ids */
-
-#define EXT2FS_NAMES {\
- {0, 0}, \
- { "doclusterread", CTLTYPE_INT }, \
- { "doculsterwrite", CTLTYPE_INT }, \
-}
-
struct dinode;
struct ext2_inode;
struct inode;
diff --git a/sys/gnu/fs/ext2fs/ext2_readwrite.c b/sys/gnu/fs/ext2fs/ext2_readwrite.c
index e28cd0a..986bc14 100644
--- a/sys/gnu/fs/ext2fs/ext2_readwrite.c
+++ b/sys/gnu/fs/ext2fs/ext2_readwrite.c
@@ -112,7 +112,7 @@ READ(ap)
if (lblktosize(fs, nextlbn) >= ip->i_size)
error = bread(vp, lbn, size, NOCRED, &bp);
- else if (ext2_doclusterread)
+ else if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0)
error = cluster_read(vp,
ip->i_size, lbn, size, NOCRED,
uio->uio_resid, (ap->a_ioflag >> 16), &bp);
@@ -277,7 +277,7 @@ WRITE(ap)
if (ioflag & IO_SYNC) {
(void)bwrite(bp);
} else if (xfersize + blkoffset == fs->s_frag_size) {
- if (ext2_doclusterwrite) {
+ if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERW) == 0) {
#if defined(__FreeBSD__)
bp->b_flags |= B_CLUSTEROK;
#endif
diff --git a/sys/gnu/fs/ext2fs/ext2_vfsops.c b/sys/gnu/fs/ext2fs/ext2_vfsops.c
index 7aef5f6..11d1b33 100644
--- a/sys/gnu/fs/ext2fs/ext2_vfsops.c
+++ b/sys/gnu/fs/ext2fs/ext2_vfsops.c
@@ -149,6 +149,10 @@ ext2_mountroot()
bzero((char *)mp, (u_long)sizeof(struct mount));
mp->mnt_op = &ext2fs_vfsops;
mp->mnt_flag = MNT_RDONLY;
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
if (error = ext2_mountfs(rootvp, mp, p)) {
bsd_free(mp, M_MOUNT);
return (error);
@@ -206,11 +210,17 @@ ext2_mount(mp, path, data, ndp, p)
/*
* If updating, check whether changing from read-only to
* read/write; if there is no device name, that's all we do.
+ * Disallow clearing MNT_NOCLUSTERR and MNT_NOCLUSTERW flags,
+ * if block device requests.
*/
if (mp->mnt_flag & MNT_UPDATE) {
ump = VFSTOUFS(mp);
fs = ump->um_e2fs;
error = 0;
+ if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
if (fs->s_rd_only == 0 && (mp->mnt_flag & MNT_RDONLY)) {
flags = WRITECLOSE;
if (mp->mnt_flag & MNT_FORCE)
@@ -255,9 +265,13 @@ ext2_mount(mp, path, data, ndp, p)
vrele(devvp);
return (ENXIO);
}
- if ((mp->mnt_flag & MNT_UPDATE) == 0)
+ if ((mp->mnt_flag & MNT_UPDATE) == 0) {
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
error = ext2_mountfs(devvp, mp, p);
- else {
+ } else {
if (devvp != ump->um_devvp)
error = EINVAL; /* needs translation */
else
diff --git a/sys/gnu/fs/ext2fs/ext2_vnops.c b/sys/gnu/fs/ext2fs/ext2_vnops.c
index 583164b..94fe0a7 100644
--- a/sys/gnu/fs/ext2fs/ext2_vnops.c
+++ b/sys/gnu/fs/ext2fs/ext2_vnops.c
@@ -237,17 +237,6 @@ static struct vnodeopv_desc ext2fs_fifoop_opv_desc =
VNODEOP_SET(ext2fs_fifoop_opv_desc);
#endif
-/*
- * Enabling cluster read/write operations.
- */
-static int ext2_doclusterread = 1;
-static int ext2_doclusterwrite = 1;
-SYSCTL_NODE(_vfs, MOUNT_EXT2FS, ext2fs, CTLFLAG_RW, 0, "EXT2FS filesystem");
-SYSCTL_INT(_vfs_ext2fs, EXT2FS_CLUSTERREAD, doclusterread,
- CTLFLAG_RW, &ext2_doclusterread, 0, "");
-SYSCTL_INT(_vfs_ext2fs, EXT2FS_CLUSTERWRITE, doclusterwrite,
- CTLFLAG_RW, &ext2_doclusterwrite, 0, "");
-
#include <gnu/ext2fs/ext2_readwrite.c>
/*
diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c
index c652ab1..b29a042 100644
--- a/sys/isofs/cd9660/cd9660_vfsops.c
+++ b/sys/isofs/cd9660/cd9660_vfsops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vfsops.c 8.18 (Berkeley) 5/22/95
- * $Id: cd9660_vfsops.c,v 1.27 1997/08/16 19:15:00 wollman Exp $
+ * $Id: cd9660_vfsops.c,v 1.28 1997/09/07 16:20:42 bde Exp $
*/
#include <sys/param.h>
@@ -183,9 +183,11 @@ cd9660_mount(mp, path, data, ndp, p)
int error;
struct iso_mnt *imp = 0;
- if ((mp->mnt_flag & MNT_ROOTFS) != 0)
+ if ((mp->mnt_flag & MNT_ROOTFS) != 0) {
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
return (iso_mountroot(mp, p));
-
+ }
if ((error = copyin(data, (caddr_t)&args, sizeof (struct iso_args))))
return (error);
@@ -195,9 +197,13 @@ cd9660_mount(mp, path, data, ndp, p)
/*
* If updating, check whether changing from read-only to
* read/write; if there is no device name, that's all we do.
+ * Disallow clearing MNT_NOCLUSTERR flag, if block device requests.
*/
if (mp->mnt_flag & MNT_UPDATE) {
imp = VFSTOISOFS(mp);
+ if (bdevsw[major(imp->im_devvp->v_rdev)]->d_flags &
+ D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
if (args.fspec == 0)
return (vfs_export(mp, &imp->im_export, &args.export));
}
@@ -218,9 +224,11 @@ cd9660_mount(mp, path, data, ndp, p)
vrele(devvp);
return ENXIO;
}
- if ((mp->mnt_flag & MNT_UPDATE) == 0)
+ if ((mp->mnt_flag & MNT_UPDATE) == 0) {
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
error = iso_mountfs(devvp, mp, p, &args);
- else {
+ } else {
if (devvp != imp->im_devvp)
error = EINVAL; /* needs translation */
else
diff --git a/sys/isofs/cd9660/cd9660_vnops.c b/sys/isofs/cd9660/cd9660_vnops.c
index e518e89..cddb6fd 100644
--- a/sys/isofs/cd9660/cd9660_vnops.c
+++ b/sys/isofs/cd9660/cd9660_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vnops.c 8.19 (Berkeley) 5/27/95
- * $Id: cd9660_vnops.c,v 1.38 1997/09/14 02:57:43 peter Exp $
+ * $Id: cd9660_vnops.c,v 1.39 1997/09/21 04:22:40 dyson Exp $
*/
#include <sys/param.h>
@@ -81,17 +81,6 @@ static int cd9660_print __P((struct vop_print_args *));
static int cd9660_islocked __P((struct vop_islocked_args *));
/*
- * Sysctl values for the cd9660 filesystem.
- */
-#define CD9660_CLUSTERREAD 1 /* cluster reading enabled */
-#define CD9660_MAXID 2 /* number of valid cd9660 ids */
-
-#define CD9660_NAMES { \
- {0, 0}, \
- { "doclusterread", CTLTYPE_INT}, \
-}
-
-/*
* Setattr call. Only allowed for block and character special devices.
*/
int
@@ -299,11 +288,6 @@ cd9660_getattr(ap)
return (0);
}
-static int cd9660_doclusterread = 1;
-SYSCTL_NODE(_vfs, MOUNT_CD9660, cd9660, CTLFLAG_RW, 0, "CD9660 filesystem");
-SYSCTL_INT(_vfs_cd9660, CD9660_CLUSTERREAD, doclusterread,
- CTLFLAG_RW, &cd9660_doclusterread, 0, "");
-
/*
* Vnode op for reading.
*/
@@ -344,7 +328,7 @@ cd9660_read(ap)
n = diff;
size = blksize(imp, ip, lbn);
rablock = lbn + 1;
- if (cd9660_doclusterread) {
+ if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0) {
if (lblktosize(imp, rablock) <= ip->i_size)
error = cluster_read(vp, (off_t)ip->i_size,
lbn, size, NOCRED, uio->uio_resid,
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index 1030648..fba334b 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kern_conf.c,v 1.20 1997/09/21 22:14:54 julian Exp $
+ * $Id: kern_conf.c,v 1.21 1997/09/21 22:20:12 julian Exp $
*/
#include <sys/param.h>
@@ -198,10 +198,12 @@ bdevsw_add_generic(int bdev, int cdev, struct bdevsw *bdevsw)
/*
* XXX hack alert.
*/
- if (isdisk(makedev(bdev, 0), VBLK) && bdevsw->d_flags != D_DISK) {
+ if (isdisk(makedev(bdev, 0), VBLK) &&
+ (bdevsw->d_flags & D_TYPEMASK) != D_DISK) {
printf("bdevsw_add_generic: adding D_DISK flag for device %d\n",
bdev);
- bdevsw->d_flags = D_DISK;
+ bdevsw->d_flags &= ~D_TYPEMASK;
+ bdevsw->d_flags |= D_DISK;
}
cdevsw_make(bdevsw);
dev = makedev(cdev, 0);
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index b8da035..d3b100b 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.72 1997/09/21 04:23:03 dyson Exp $
+ * $Id: vfs_syscalls.c,v 1.73 1997/09/24 07:46:54 phk Exp $
*/
/*
@@ -253,10 +253,11 @@ update:
else if (mp->mnt_flag & MNT_RDONLY)
mp->mnt_flag |= MNT_WANTRDWR;
mp->mnt_flag &=~ (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
- MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOATIME);
+ MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOATIME |
+ MNT_NOCLUSTERR | MNT_NOCLUSTERW);
mp->mnt_flag |= SCARG(uap, flags) & (MNT_NOSUID | MNT_NOEXEC |
MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_FORCE |
- MNT_NOATIME);
+ MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW);
/*
* Mount the filesystem.
*/
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index b8da035..d3b100b 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.72 1997/09/21 04:23:03 dyson Exp $
+ * $Id: vfs_syscalls.c,v 1.73 1997/09/24 07:46:54 phk Exp $
*/
/*
@@ -253,10 +253,11 @@ update:
else if (mp->mnt_flag & MNT_RDONLY)
mp->mnt_flag |= MNT_WANTRDWR;
mp->mnt_flag &=~ (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
- MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOATIME);
+ MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOATIME |
+ MNT_NOCLUSTERR | MNT_NOCLUSTERW);
mp->mnt_flag |= SCARG(uap, flags) & (MNT_NOSUID | MNT_NOEXEC |
MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_FORCE |
- MNT_NOATIME);
+ MNT_NOATIME | MNT_NOCLUSTERR | MNT_NOCLUSTERW);
/*
* Mount the filesystem.
*/
diff --git a/sys/miscfs/specfs/spec_vnops.c b/sys/miscfs/specfs/spec_vnops.c
index b5407ee..dd05fc0 100644
--- a/sys/miscfs/specfs/spec_vnops.c
+++ b/sys/miscfs/specfs/spec_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)spec_vnops.c 8.14 (Berkeley) 5/21/95
- * $Id: spec_vnops.c,v 1.41 1997/09/02 20:06:12 bde Exp $
+ * $Id: spec_vnops.c,v 1.42 1997/09/14 02:58:02 peter Exp $
*/
#include <sys/param.h>
@@ -176,7 +176,8 @@ spec_open(ap)
*/
if (securelevel >= 2
&& cdevsw[maj]->d_bdev
- && cdevsw[maj]->d_bdev->d_flags == D_DISK)
+ && (cdevsw[maj]->d_bdev->d_flags & D_TYPEMASK) ==
+ D_DISK)
return (EPERM);
/*
* When running in secure mode, do not allow opens
@@ -220,7 +221,8 @@ spec_open(ap)
* opens for writing of any disk block devices.
*/
if (securelevel >= 2 && ap->a_cred != FSCRED &&
- (ap->a_mode & FWRITE) && bdevsw[maj]->d_flags == D_DISK)
+ (ap->a_mode & FWRITE) &&
+ (bdevsw[maj]->d_flags & D_TYPEMASK) == D_DISK)
return (EPERM);
/*
* Do not allow opens of block devices that are
@@ -422,7 +424,8 @@ spec_ioctl(ap)
case VBLK:
if (ap->a_command == 0 && (int)ap->a_data == B_TAPE)
- if (bdevsw[major(dev)]->d_flags == D_TAPE)
+ if ((bdevsw[major(dev)]->d_flags & D_TYPEMASK) ==
+ D_TAPE)
return (0);
else
return (1);
diff --git a/sys/miscfs/union/union_vfsops.c b/sys/miscfs/union/union_vfsops.c
index e7954be..8478a1c 100644
--- a/sys/miscfs/union/union_vfsops.c
+++ b/sys/miscfs/union/union_vfsops.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* @(#)union_vfsops.c 8.20 (Berkeley) 5/20/95
- * $Id: union_vfsops.c,v 1.18 1997/08/02 14:32:29 bde Exp $
+ * $Id: union_vfsops.c,v 1.19 1997/08/16 19:15:22 wollman Exp $
*/
/*
@@ -103,6 +103,11 @@ union_mount(mp, path, data, ndp, p)
#endif
/*
+ * Disable clustered write, otherwise system becomes unstable.
+ */
+ mp->mnt_flag |= MNT_NOCLUSTERW;
+
+ /*
* Update is a no-op
*/
if (mp->mnt_flag & MNT_UPDATE) {
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 0a7e323..194bfd9 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)conf.h 8.5 (Berkeley) 1/9/95
- * $Id: conf.h,v 1.34 1997/02/22 09:44:58 peter Exp $
+ * $Id: conf.h,v 1.35 1997/09/14 02:25:40 peter Exp $
*/
#ifndef _SYS_CONF_H_
@@ -85,6 +85,15 @@ typedef int l_modem_t __P((struct tty *tp, int flag));
#define D_DISK 2
#define D_TTY 3
+#define D_TYPEMASK 0xffff
+
+/*
+ * Flags for d_flags.
+ */
+#define D_NOCLUSTERR 0x10000 /* disables cluter read */
+#define D_NOCLUSTERW 0x20000 /* disables cluster write */
+#define D_NOCLUSTERRW (D_NOCLUSTERR | D_NOCLUSTERW)
+
/*
* Block device switch table
*/
@@ -95,7 +104,7 @@ struct bdevsw {
d_ioctl_t *d_ioctl;
d_dump_t *d_dump;
d_psize_t *d_psize;
- int d_flags;
+ u_int d_flags;
char *d_name; /* name of the driver e.g. audio */
struct cdevsw *d_cdev; /* cross pointer to the cdev */
int d_maj; /* the major number we were assigned */
diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h
index 0a7e323..194bfd9 100644
--- a/sys/sys/linedisc.h
+++ b/sys/sys/linedisc.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)conf.h 8.5 (Berkeley) 1/9/95
- * $Id: conf.h,v 1.34 1997/02/22 09:44:58 peter Exp $
+ * $Id: conf.h,v 1.35 1997/09/14 02:25:40 peter Exp $
*/
#ifndef _SYS_CONF_H_
@@ -85,6 +85,15 @@ typedef int l_modem_t __P((struct tty *tp, int flag));
#define D_DISK 2
#define D_TTY 3
+#define D_TYPEMASK 0xffff
+
+/*
+ * Flags for d_flags.
+ */
+#define D_NOCLUSTERR 0x10000 /* disables cluter read */
+#define D_NOCLUSTERW 0x20000 /* disables cluster write */
+#define D_NOCLUSTERRW (D_NOCLUSTERR | D_NOCLUSTERW)
+
/*
* Block device switch table
*/
@@ -95,7 +104,7 @@ struct bdevsw {
d_ioctl_t *d_ioctl;
d_dump_t *d_dump;
d_psize_t *d_psize;
- int d_flags;
+ u_int d_flags;
char *d_name; /* name of the driver e.g. audio */
struct cdevsw *d_cdev; /* cross pointer to the cdev */
int d_maj; /* the major number we were assigned */
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index 73c4af0..b194be0 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)mount.h 8.21 (Berkeley) 5/20/95
- * $Id: mount.h,v 1.45 1997/08/16 19:16:12 wollman Exp $
+ * $Id: mount.h,v 1.46 1997/09/16 14:44:24 bde Exp $
*/
#ifndef _SYS_MOUNT_H_
@@ -166,6 +166,8 @@ struct mount {
#define MNT_UNION 0x00000020 /* union with underlying filesystem */
#define MNT_ASYNC 0x00000040 /* file system written asynchronously */
#define MNT_NOATIME 0x10000000 /* Disable update of file access times */
+#define MNT_NOCLUSTERR 0x40000000 /* Disable cluster read */
+#define MNT_NOCLUSTERW 0x80000000 /* Disable cluster read */
/*
* exported mount flags.
@@ -189,9 +191,10 @@ struct mount {
* Mask of flags that are visible to statfs()
*/
#define MNT_VISFLAGMASK (MNT_RDONLY|MNT_SYNCHRONOUS|MNT_NOEXEC|MNT_NOSUID| \
- MNT_NODEV|MNT_UNION|MNT_ASYNC|MNT_EXRDONLY|MNT_EXPORTED| \
- MNT_DEFEXPORTED|MNT_EXPORTANON|MNT_EXKERB|MNT_LOCAL| \
- MNT_USER|MNT_QUOTA|MNT_ROOTFS|MNT_NOATIME)
+ MNT_NODEV|MNT_UNION|MNT_ASYNC|MNT_EXRDONLY| \
+ MNT_EXPORTED|MNT_DEFEXPORTED|MNT_EXPORTANON| \
+ MNT_EXKERB|MNT_LOCAL|MNT_USER|MNT_QUOTA|MNT_ROOTFS| \
+ MNT_NOATIME|MNT_NOCLUSTERR|MNT_NOCLUSTERW)
/*
* External filesystem control flags.
diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h
index 5c6a519..8fd7d70 100644
--- a/sys/ufs/ffs/ffs_extern.h
+++ b/sys/ufs/ffs/ffs_extern.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_extern.h 8.6 (Berkeley) 3/30/95
- * $Id: ffs_extern.h,v 1.15 1997/02/22 09:47:02 peter Exp $
+ * $Id: ffs_extern.h,v 1.16 1997/08/16 19:16:19 wollman Exp $
*/
#ifndef _UFS_FFS_EXTERN_H
@@ -40,16 +40,14 @@
/*
* Sysctl values for the fast filesystem.
*/
-#define FFS_CLUSTERREAD 1 /* cluster reading enabled */
-#define FFS_CLUSTERWRITE 2 /* cluster writing enabled */
#define FFS_REALLOCBLKS 3 /* block reallocation enabled */
#define FFS_ASYNCFREE 4 /* asynchronous block freeing enabled */
#define FFS_MAXID 5 /* number of valid ffs ids */
#define FFS_NAMES { \
{ 0, 0 }, \
- { "doclusterread", CTLTYPE_INT }, \
- { "doclusterwrite", CTLTYPE_INT }, \
+ { 0, 0 }, \
+ { 0, 0 }, \
{ "doreallocblks", CTLTYPE_INT }, \
{ "doasyncfree", CTLTYPE_INT }, \
}
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index a835da5..c0dae9a 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_vfsops.c 8.31 (Berkeley) 5/20/95
- * $Id: ffs_vfsops.c,v 1.54 1997/09/02 20:06:46 bde Exp $
+ * $Id: ffs_vfsops.c,v 1.55 1997/09/07 16:20:59 bde Exp $
*/
#include "opt_quota.h"
@@ -44,6 +44,7 @@
#include <sys/vnode.h>
#include <sys/mount.h>
#include <sys/buf.h>
+#include <sys/conf.h>
#include <sys/fcntl.h>
#include <sys/disklabel.h>
#include <sys/malloc.h>
@@ -155,9 +156,10 @@ ffs_mount( mp, path, data, ndp, p)
return (err);
}
- /*
- * Attempt mount
- */
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(rootdev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
if( ( err = ffs_mountfs(rootvp, mp, p)) != 0) {
/* fs specific cleanup (if any)*/
goto error_1;
@@ -181,11 +183,17 @@ ffs_mount( mp, path, data, ndp, p)
/*
* If updating, check whether changing from read-only to
* read/write; if there is no device name, that's all we do.
+ * Disallow clearing MNT_NOCLUSTERR and MNT_NOCLUSTERW flags,
+ * if block device requests.
*/
if (mp->mnt_flag & MNT_UPDATE) {
ump = VFSTOUFS(mp);
fs = ump->um_fs;
err = 0;
+ if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(ump->um_dev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
if (fs->fs_ronly == 0 && (mp->mnt_flag & MNT_RDONLY)) {
flags = WRITECLOSE;
if (mp->mnt_flag & MNT_FORCE)
@@ -275,6 +283,11 @@ ffs_mount( mp, path, data, ndp, p)
********************
*/
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERR)
+ mp->mnt_flag |= MNT_NOCLUSTERR;
+ if (bdevsw[major(devvp->v_rdev)]->d_flags & D_NOCLUSTERW)
+ mp->mnt_flag |= MNT_NOCLUSTERW;
+
/*
* Since this is a new mount, we want the names for
* the device and the mount point copied in. If an
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index a546fb8..084e3a9 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_vnops.c 8.15 (Berkeley) 5/14/95
- * $Id: ffs_vnops.c,v 1.28 1997/09/02 20:06:46 bde Exp $
+ * $Id: ffs_vnops.c,v 1.29 1997/09/14 02:58:05 peter Exp $
*/
#include <sys/param.h>
@@ -239,17 +239,7 @@ VNODEOP_SET(ffs_vnodeop_opv_desc);
VNODEOP_SET(ffs_specop_opv_desc);
VNODEOP_SET(ffs_fifoop_opv_desc);
-/*
- * Enabling cluster read/write operations.
- */
-static int ffs_doclusterread = 1;
-static int ffs_doclusterwrite = 1;
-
SYSCTL_NODE(_vfs, MOUNT_UFS, ffs, CTLFLAG_RW, 0, "FFS filesystem");
-SYSCTL_INT(_vfs_ffs, FFS_CLUSTERREAD, doclusterread,
- CTLFLAG_RW, &ffs_doclusterread, 0, "");
-SYSCTL_INT(_vfs_ffs, FFS_CLUSTERWRITE, doclusterwrite,
- CTLFLAG_RW, &ffs_doclusterwrite, 0, "");
#include <ufs/ufs/ufs_readwrite.c>
diff --git a/sys/ufs/ufs/ufs_readwrite.c b/sys/ufs/ufs/ufs_readwrite.c
index c598833..929a289 100644
--- a/sys/ufs/ufs/ufs_readwrite.c
+++ b/sys/ufs/ufs/ufs_readwrite.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ufs_readwrite.c 8.11 (Berkeley) 5/8/95
- * $Id: ufs_readwrite.c,v 1.29 1997/03/22 06:53:44 bde Exp $
+ * $Id: ufs_readwrite.c,v 1.30 1997/08/25 08:18:39 kato Exp $
*/
#ifdef LFS_READWRITE
@@ -123,7 +123,7 @@ READ(ap)
#else
if (lblktosize(fs, nextlbn) >= ip->i_size)
error = bread(vp, lbn, size, NOCRED, &bp);
- else if (ffs_doclusterread)
+ else if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0)
error = cluster_read(vp, ip->i_size, lbn,
size, NOCRED, uio->uio_resid, seqcount, &bp);
else if (lbn - 1 == vp->v_lastr) {
@@ -281,7 +281,7 @@ WRITE(ap)
if (ioflag & IO_SYNC) {
(void)bwrite(bp);
} else if (xfersize + blkoffset == fs->fs_bsize) {
- if (ffs_doclusterwrite) {
+ if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERW) == 0) {
bp->b_flags |= B_CLUSTEROK;
cluster_write(bp, ip->i_size);
} else {
OpenPOWER on IntegriCloud