O_XATTR support in FreeBSD?
Robert N. M. Watson
rwatson at FreeBSD.org
Sun Nov 24 09:23:39 UTC 2013
On 24 Nov 2013, at 01:28, Edward Tomasz Napierała <trasz at 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.
>>>
>> 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?)
>
> 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’s the story here?
>
> % grep -R openextattr *
> 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 = 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 = ffs_openextattr,
> ufs/ffs/ffs_vnops.c: .vop_openextattr = ffs_openextattr,
> ufs/ffs/ffs_vnops.c:ffs_openextattr(struct vop_openextattr_args *ap)
> ufs/ffs/ffs_vnops.c:struct vop_openextattr_args {
>
> % grep -R VOP_OPENEXTATTR *
> fs/unionfs/union_vnops.c: error = 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 = VOP_OPENEXTATTR(uvp, cred, td)) != 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 = VOP_OPENEXTATTR(uvp, cred, td)) != 0)
> security/mac/mac_vfs.c: error = VOP_OPENEXTATTR(vp, cred, curthread);
> security/mac/mac_vfs.c: error = VOP_OPENEXTATTR(vp, cred, curthread);
>
> 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
More information about the freebsd-hackers
mailing list