kern/106255: [msdosfs] : correct setting of archive flag
bde at zeta.org.au
Sun Dec 3 16:39:36 PST 2006
On Sun, 3 Dec 2006, Rene Ladan wrote:
> The MSDOS file system has an archive bit in the flags field. This bit roughly corresponds to the archive flag on the UFS file system. However, it is set the wrong way around: the flag should be set when the bit is present, and cleared when the bit is absent.
The comment in msdosfs/direntry.h says that ATTR_ARCHIVE means that
the file is new or modified (in other words, not archived), while the
comment in sys/stat.h says that SF_ARCHIVED means that the file is
archived, but I think both mean that it is archived.
> --- msdosfs_vnops.c Mon Nov 6 14:41:57 2006
> +++ msdosfs_vnops.c.rene Sun Dec 3 11:58:47 2006
> @@ -352,7 +352,7 @@
> vap->va_ctime = vap->va_mtime;
> vap->va_flags = 0;
> - if ((dep->de_Attributes & ATTR_ARCHIVE) == 0)
> + if (dep->de_Attributes & ATTR_ARCHIVE)
> vap->va_flags |= SF_ARCHIVED;
> vap->va_gen = 0;
> vap->va_blocksize = pmp->pm_bpcluster;
This only fixes the reporting of the flag. msdosfs still maintains
the flag perfectly backwards (except DETIMES() is missing setting of
it for for all changes -- I think all changes to metadata except
possibly to atimes should set it to be perfectly backwards and clear
it to be correct).
Grep shows that this flag is negatively useful in FreeBSD. No file
systems maintain it (except for getting it backwards in msdosfs).
All archiving utilities need to maintain it for it to be useful,
but none except tar even reference it (except possibly indirectly via
strtofflags(3)), and tar seems to just print it (indirectly via a
special version of strtofflags(3)).
More information about the freebsd-bugs