diff options
author | rwatson <rwatson@FreeBSD.org> | 2001-04-03 04:09:53 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2001-04-03 04:09:53 +0000 |
commit | 6805eb2bf49821e6cba726451d9ebe646bdb69cf (patch) | |
tree | c265b3f467cb46e5fa4822db43b5f4577c1c197c /sys | |
parent | fbfd25aee922032513e4e04dfb16464be003a1b6 (diff) | |
download | FreeBSD-src-6805eb2bf49821e6cba726451d9ebe646bdb69cf.zip FreeBSD-src-6805eb2bf49821e6cba726451d9ebe646bdb69cf.tar.gz |
o Change the default from using IO_SYNC on EA set and delete operations
to not using IO_SYNC. Expose a sysctl (debug.ufs_extattr_sync) for
enabling the use of IO_SYNC.
- Use of IO_SYNC substantially degrades ACL performance when a
default ACL is set on a directory, as there are four synchronous
writes initiated to define both supporting EAs for new
sub-directories, and to set the data; two for new files. Later, this
may be optimized to two writes for sub-directories, one for new
files.
- IO_SYNC does not substantially improve consistency properties due
to the poor consistency properties of existing permissions (which
ACLs are a superset of), due to interaction with soft updates,
and due to differences in handling consistency for data and file
system meta-data.
- In macro-benchmarks, this reduces the overhead of setting default
ACLs down to the same overhead as enabling ACLs on a file system
and not using them. Enabling ACLs still introduces a small
overhead (I measure 7% on a -j 2 buildworld with pre-allocated
EA backing store, but this is not rigorous testing, nor in any way
optimized).
- The sysctl will probably change to another administration method
(or at least, a better name) in the near future, but consistency
properties of EAs are still being worked out. The toggle is defined
right now to allow easier performance analysis and exploration
of possible guarantees.
Obtained from: TrustedBSD Project
Diffstat (limited to 'sys')
-rw-r--r-- | sys/ufs/ufs/ufs_extattr.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/sys/ufs/ufs/ufs_extattr.c b/sys/ufs/ufs/ufs_extattr.c index bf4a7a5..e77e9fb 100644 --- a/sys/ufs/ufs/ufs_extattr.c +++ b/sys/ufs/ufs/ufs_extattr.c @@ -41,6 +41,7 @@ #include <sys/lock.h> #include <sys/dirent.h> #include <sys/extattr.h> +#include <sys/sysctl.h> #include <vm/vm_zone.h> @@ -59,6 +60,10 @@ static MALLOC_DEFINE(M_UFS_EXTATTR, "ufs_extattr", "ufs extended attribute"); +static int ufs_extattr_sync = 0; +SYSCTL_INT(_debug, OID_AUTO, ufs_extattr_sync, CTLFLAG_RW, &ufs_extattr_sync, + 0, ""); + static int ufs_extattr_valid_attrname(const char *attrname); static int ufs_extattr_credcheck(struct vnode *vp, struct ufs_extattr_list_entry *uele, struct ucred *cred, struct proc *p, @@ -1018,7 +1023,7 @@ ufs_extattr_set(struct vnode *vp, int attrnamespace, const char *name, struct ufsmount *ump = VFSTOUFS(mp); struct inode *ip = VTOI(vp); off_t base_offset; - int error = 0; + int error = 0, ioflag; if (vp->v_mount->mnt_flag & MNT_RDONLY) return (EROFS); @@ -1080,8 +1085,11 @@ ufs_extattr_set(struct vnode *vp, int attrnamespace, const char *name, vn_lock(attribute->uele_backing_vnode, LK_EXCLUSIVE | LK_NOPAUSE | LK_RETRY, p); - error = VOP_WRITE(attribute->uele_backing_vnode, &local_aio, - IO_NODELOCKED | IO_SYNC, ump->um_extattr.uepm_ucred); + ioflag = IO_NODELOCKED; + if (ufs_extattr_sync) + ioflag |= IO_SYNC; + error = VOP_WRITE(attribute->uele_backing_vnode, &local_aio, ioflag, + ump->um_extattr.uepm_ucred); if (error) goto vopunlock_exit; @@ -1094,9 +1102,12 @@ ufs_extattr_set(struct vnode *vp, int attrnamespace, const char *name, * Write out user data. */ uio->uio_offset = base_offset + sizeof(struct ufs_extattr_header); - - error = VOP_WRITE(attribute->uele_backing_vnode, uio, - IO_NODELOCKED | IO_SYNC, ump->um_extattr.uepm_ucred); + + ioflag = IO_NODELOCKED; + if (ufs_extattr_sync) + ioflag |= IO_SYNC; + error = VOP_WRITE(attribute->uele_backing_vnode, uio, ioflag, + ump->um_extattr.uepm_ucred); vopunlock_exit: uio->uio_offset = 0; @@ -1123,7 +1134,7 @@ ufs_extattr_rm(struct vnode *vp, int attrnamespace, const char *name, struct ufsmount *ump = VFSTOUFS(mp); struct inode *ip = VTOI(vp); off_t base_offset; - int error = 0; + int error = 0, ioflag; if (vp->v_mount->mnt_flag & MNT_RDONLY) return (EROFS); @@ -1211,8 +1222,11 @@ ufs_extattr_rm(struct vnode *vp, int attrnamespace, const char *name, local_aio.uio_offset = base_offset; local_aio.uio_resid = sizeof(struct ufs_extattr_header); - error = VOP_WRITE(attribute->uele_backing_vnode, &local_aio, - IO_NODELOCKED | IO_SYNC, ump->um_extattr.uepm_ucred); + ioflag = IO_NODELOCKED; + if (ufs_extattr_sync) + ioflag |= IO_SYNC; + error = VOP_WRITE(attribute->uele_backing_vnode, &local_aio, ioflag, + ump->um_extattr.uepm_ucred); if (error) goto vopunlock_exit; |