summaryrefslogtreecommitdiffstats
path: root/sys/gnu/fs/xfs
diff options
context:
space:
mode:
authorrodrigc <rodrigc@FreeBSD.org>2006-06-11 03:32:50 +0000
committerrodrigc <rodrigc@FreeBSD.org>2006-06-11 03:32:50 +0000
commit5d112062f8dd4bc20545e392007027e99716c38d (patch)
tree7286df4cd6219cdad4d0c63cd28046d72ec0d551 /sys/gnu/fs/xfs
parenta1c0f666fd935c468690f4aa8717a66508019fa4 (diff)
downloadFreeBSD-src-5d112062f8dd4bc20545e392007027e99716c38d.zip
FreeBSD-src-5d112062f8dd4bc20545e392007027e99716c38d.tar.gz
Implement vnode operations for setting and removing extended attributes.
Diffstat (limited to 'sys/gnu/fs/xfs')
-rw-r--r--sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c96
1 files changed, 95 insertions, 1 deletions
diff --git a/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c b/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c
index 88445e2..be95936 100644
--- a/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c
+++ b/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c
@@ -92,6 +92,7 @@ static vop_bmap_t _xfs_bmap;
static vop_cachedlookup_t _xfs_cachedlookup;
static vop_close_t _xfs_close;
static vop_create_t _xfs_create;
+static vop_deleteextattr_t _xfs_deleteextattr;
static vop_fsync_t _xfs_fsync;
static vop_getattr_t _xfs_getattr;
static vop_getextattr_t _xfs_getextattr;
@@ -110,6 +111,7 @@ static vop_remove_t _xfs_remove;
static vop_rename_t _xfs_rename;
static vop_rmdir_t _xfs_rmdir;
static vop_setattr_t _xfs_setattr;
+static vop_setextattr_t _xfs_setextattr;
static vop_strategy_t _xfs_strategy;
static vop_symlink_t _xfs_symlink;
static vop_write_t _xfs_write;
@@ -122,6 +124,7 @@ struct vop_vector xfs_vnops = {
.vop_cachedlookup = _xfs_cachedlookup,
.vop_close = _xfs_close,
.vop_create = _xfs_create,
+ .vop_deleteextattr = _xfs_deleteextattr,
.vop_fsync = _xfs_fsync,
.vop_getattr = _xfs_getattr,
.vop_getextattr = _xfs_getextattr,
@@ -141,6 +144,7 @@ struct vop_vector xfs_vnops = {
.vop_rename = _xfs_rename,
.vop_rmdir = _xfs_rmdir,
.vop_setattr = _xfs_setattr,
+ .vop_setextattr = _xfs_setextattr,
.vop_strategy = _xfs_strategy,
.vop_symlink = _xfs_symlink,
.vop_write = _xfs_write,
@@ -1586,4 +1590,94 @@ done:
*ap->a_size = attrnames_len;
return (error);
-}
+}
+
+static int
+_xfs_setextattr(struct vop_setextattr_args *ap)
+/*
+vop_setextattr {
+ IN struct vnode *a_vp;
+ IN int a_attrnamespace;
+ IN const char *a_name;
+ INOUT struct uio *a_uio;
+ IN struct ucred *a_cred;
+ IN struct thread *a_td;
+};
+*/
+{
+ char *val;
+ size_t vallen;
+ int error, xfs_flags;
+
+ if (ap->a_vp->v_type == VCHR)
+ return (EOPNOTSUPP);
+
+ if (ap->a_uio == NULL)
+ return (EINVAL);
+ vallen = ap->a_uio->uio_resid;
+ if (vallen > ATTR_MAX_VALUELEN)
+ return (EOVERFLOW);
+
+ if (ap->a_name[0] == '\0')
+ return (EINVAL);
+
+ error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
+ ap->a_cred, ap->a_td, VWRITE);
+ if (error)
+ return (error);
+
+ xfs_flags = 0;
+ if (ap->a_attrnamespace & EXTATTR_NAMESPACE_USER)
+ xfs_flags |= ATTR_KERNORMALS;
+ if (ap->a_attrnamespace & EXTATTR_NAMESPACE_SYSTEM)
+ xfs_flags |= ATTR_KERNROOTLS;
+
+ val = (char *)kmem_zalloc(vallen, KM_SLEEP);
+ if (val == NULL)
+ return (ENOMEM);
+ error = uiomove(val, (int)vallen, ap->a_uio);
+ if (error)
+ goto err_out;
+
+ XVOP_ATTR_SET(VPTOXFSVP(ap->a_vp), ap->a_name, val, vallen, xfs_flags,
+ ap->a_cred, error);
+err_out:
+ kmem_free(val, vallen);
+ return(error);
+}
+
+static int
+_xfs_deleteextattr(struct vop_deleteextattr_args *ap)
+/*
+vop_deleteextattr {
+ IN struct vnode *a_vp;
+ IN int a_attrnamespace;
+ IN const char *a_name;
+ IN struct ucred *a_cred;
+ IN struct thread *a_td;
+};
+*/
+{
+ int error, xfs_flags;
+
+ if (ap->a_vp->v_type == VCHR)
+ return (EOPNOTSUPP);
+
+ if (ap->a_name[0] == '\0')
+ return (EINVAL);
+
+ error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace,
+ ap->a_cred, ap->a_td, VWRITE);
+ if (error)
+ return (error);
+
+ xfs_flags = 0;
+ if (ap->a_attrnamespace & EXTATTR_NAMESPACE_USER)
+ xfs_flags |= ATTR_KERNORMALS;
+ if (ap->a_attrnamespace & EXTATTR_NAMESPACE_SYSTEM)
+ xfs_flags |= ATTR_KERNROOTLS;
+
+ XVOP_ATTR_REMOVE(VPTOXFSVP(ap->a_vp), ap->a_name, xfs_flags,
+ ap->a_cred, error);
+ return (error);
+}
OpenPOWER on IntegriCloud