summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/ufs/ufs/ufs_extattr.c32
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;
OpenPOWER on IntegriCloud