Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Nov 2013 09:23:27 +0000
From:      "Robert N. M. Watson" <rwatson@FreeBSD.org>
To:        =?utf-8?Q?Edward_Tomasz_Napiera=C5=82a?= <trasz@FreeBSD.org>
Cc:        Freebsd hackers list <freebsd-hackers@freebsd.org>, Richard Yao <ryao@gentoo.org>, Rick Macklem <rmacklem@uoguelph.ca>, Pedro Giffuni <pfg@FreeBSD.org>, Cedric Blancher <cedric.blancher@gmail.com>
Subject:   Re: O_XATTR support in FreeBSD?
Message-ID:  <AA677F6B-DFE6-4D94-9E1F-F42C1D07910B@FreeBSD.org>
In-Reply-To: <987A1DDC-0C8F-4EEF-9504-D28CA7027F56@FreeBSD.org>
References:  <820263347.19772534.1385247218007.JavaMail.root@uoguelph.ca> <987A1DDC-0C8F-4EEF-9504-D28CA7027F56@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On 24 Nov 2013, at 01:28, Edward Tomasz Napiera=C5=82a =
<trasz@FreeBSD.org> wrote:

>>> I was unaware of a standard for EA beyond the old posix draft.
>>> The reason for Extended Attributes is supporting ACL and we support
>>> both
>>> the draft posix and the NFS/win style ACLs.
>>>=20
>> Interestingly, FreeBSD has a VOP_OPENEXTATTR() but no syscall
>> that uses it nor support for it in ZFS. (I'm just guessing it
>> was intended for an openat(2) syscall at some time?)
>=20
> Hm, interesting.  It looks kind of unused (MAC uses it to implement
> mac_vnode_create_extattr() and mac_vnode_setlabel_extattr()).  Robert =
(Cc-ed),
> perhaps you know what=E2=80=99s the story here?
>=20
> % grep -R openextattr *   =20
> fs/unionfs/union.h:#define UNIONFS_OPENEXTL     0x01    /* openextattr =
(lower) */
> fs/unionfs/union.h:#define UNIONFS_OPENEXTU     0x02    /* openextattr =
(upper) */
> fs/unionfs/union_vnops.c:unionfs_openextattr(struct =
vop_openextattr_args *ap)
> fs/unionfs/union_vnops.c:       .vop_openextattr =3D      =
unionfs_openextattr,
> kern/vnode_if.src:%% openextattr        vp      L L L
> kern/vnode_if.src:vop_openextattr {
> ufs/ffs/ffs_vnops.c:static vop_openextattr_t    ffs_openextattr;
> ufs/ffs/ffs_vnops.c:    .vop_openextattr =3D      ffs_openextattr,
> ufs/ffs/ffs_vnops.c:    .vop_openextattr =3D      ffs_openextattr,
> ufs/ffs/ffs_vnops.c:ffs_openextattr(struct vop_openextattr_args *ap)
> ufs/ffs/ffs_vnops.c:struct vop_openextattr_args {
>=20
> % grep -R VOP_OPENEXTATTR *
> fs/unionfs/union_vnops.c:       error =3D VOP_OPENEXTATTR(tvp, =
ap->a_cred, ap->a_td);
> fs/unionfs/union_vnops.c:                           =
VOP_OPENEXTATTR(lvp, cred, td)) {
> fs/unionfs/union_vnops.c:                               =
panic("unionfs: VOP_OPENEXTATTR failed");
> fs/unionfs/union_vnops.c:               if ((error =3D =
VOP_OPENEXTATTR(uvp, cred, td)) !=3D 0)
> fs/unionfs/union_vnops.c:                           =
VOP_OPENEXTATTR(lvp, cred, td)) {
> fs/unionfs/union_vnops.c:                               =
panic("unionfs: VOP_OPENEXTATTR failed");
> fs/unionfs/union_vnops.c:               if ((error =3D =
VOP_OPENEXTATTR(uvp, cred, td)) !=3D 0)
> security/mac/mac_vfs.c: error =3D VOP_OPENEXTATTR(vp, cred, =
curthread);
> security/mac/mac_vfs.c: error =3D VOP_OPENEXTATTR(vp, cred, =
curthread);
>=20
> Anyway - extended attributes _are_ supported on ZFS; see extattr(2) =
for API.

This VOP doesn't do what you think it does. Within our VFS we support =
"transactions" in order to allow multiple EA writes to be atomic. This =
is used when setting labels associated with multiple policies in a =
single call to mac_set_file(), mac_set_fd(), and mac_set_link(). This =
provides atomicity against (a) simultaneous access to the same file as =
security attributes are changing, and (b) in the event of a crash during =
attribute update. The transaction model depends on the vnode lock being =
held exclusively over the call to VOP_OPENEXTATTR(), a series of =
VOP_SETEXTATTR() calls, and VOP_CLOSEEXTATTR(). The feature was added in =
UFS2 (it's not present in the UFS1 EA implementation), and it looks like =
extattr(9) didn't get updated.

Robert




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AA677F6B-DFE6-4D94-9E1F-F42C1D07910B>