Indication of extended attributes availability.
Robert Watson
rwatson at FreeBSD.org
Sat Mar 22 18:05:54 UTC 2008
On Fri, 21 Mar 2008, Václav Haisman wrote:
> I would like to have some sort of indication of extended attributes
> availability for given FS. It seems that things like this (MAC, ACLs etc.)
> are indicated using mount flags and those are available through statfs()
> call. The following is tentative patch that would expose extended attributes
> availability as mount flag. It is completely untested. I would just like to
> know if it is a viable approach to the problem or should I scratch it and
> try something else?
I think the preferred programmatic approach is actually via fpathconf(2). I
don't know if any other OS's have assigned a _PC constant for extended
attributes, but if they have we should probably use the same one. However, I
guess there's a meta-question: is your goal to allow programs to be able to
tell if extended attributes are available, or for administrators to be able to
tell?
Robert N M Watson
Computer Laboratory
University of Cambridge
>
>
> --- ./sys/mount.h~ 2007-04-10 12:12:44.000000000 +0200
> +++ ./sys/mount.h 2008-03-21 22:48:04.436630277 +0100
> @@ -218,7 +218,6 @@ void __mnt_vnode_markerfree(str
> #define MNT_SYNCHRONOUS 0x00000002 /* filesystem written
> synchronously */
> #define MNT_NOEXEC 0x00000004 /* can't exec from filesystem
> */
> #define MNT_NOSUID 0x00000008 /* don't honor setuid bits on
> fs */
> -#define MNT_NODEV 0 /* Deprecated option */
> #define MNT_UNION 0x00000020 /* union with underlying
> filesystem */
> #define MNT_ASYNC 0x00000040 /* filesystem written
> asynchronously */
> #define MNT_SUIDDIR 0x00100000 /* special handling of SUID
> on dirs */
> @@ -246,6 +245,7 @@ void __mnt_vnode_markerfree(str
> * but visible to the user.
> * XXX some of these are not quite right.. (I've never seen the root flag
> set)
> */
> +#define MNT_EXTATTR 0x00000010 /* filesystem with extended
> attributes */
> #define MNT_LOCAL 0x00001000 /* filesystem is stored
> locally */
> #define MNT_QUOTA 0x00002000 /* quotas are enabled on
> filesystem */
> #define MNT_ROOTFS 0x00004000 /* identifies the root
> filesystem */
> @@ -265,7 +265,8 @@ void __mnt_vnode_markerfree(str
> MNT_ROOTFS | MNT_NOATIME | MNT_NOCLUSTERR| \
> MNT_NOCLUSTERW | MNT_SUIDDIR | MNT_SOFTDEP | \
> MNT_IGNORE | MNT_EXPUBLIC | MNT_NOSYMFOLLOW | \
> - MNT_JAILDEVFS | MNT_MULTILABEL | MNT_ACLS)
> + MNT_JAILDEVFS | MNT_MULTILABEL | MNT_ACLS | \
> + MNT_EXTATTR)
>
> /* Mask of flags that can be updated. */
> #define MNT_UPDATEMASK (MNT_NOSUID | MNT_NOEXEC | \
> --- ./ufs/ufs/ufs_extattr.c~ 2006-03-13 04:08:08.000000000 +0100
> +++ ./ufs/ufs/ufs_extattr.c 2008-03-21 22:59:50.766939565 +0100
> @@ -220,6 +220,10 @@ ufs_extattr_start(struct mount *mp, stru
>
> ump->um_extattr.uepm_ucred = crhold(td->td_ucred);
>
> + MNT_ILOCK(mp);
> + mp->f_flags |= MNT_EXTATTR;
> + MNT_IUNLOCK(mp);
> +
> unlock:
> ufs_extattr_uepm_unlock(ump, td);
>
> @@ -549,6 +553,10 @@ ufs_extattr_stop(struct mount *mp, struc
> uele->uele_attrname, td);
> }
>
> + MNT_ILOCK(mp);
> + mp->f_flags &= ~MNT_EXTATTR;
> + MNT_IUNLOCK(mp);
> +
> ump->um_extattr.uepm_flags &= ~UFS_EXTATTR_UEPM_STARTED;
>
> crfree(ump->um_extattr.uepm_ucred);
>
> --
> VH
>
>
More information about the freebsd-fs
mailing list