Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 04 Dec 2006 13:26:53 +0100
From:      Rene Ladan <r.c.ladan@gmail.com>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        freebsd-bugs@FreeBSD.org, freebsd-gnats-submit@FreeBSD.org
Subject:   Re: kern/106255: [msdosfs] : correct setting of archive flag
Message-ID:  <4574140D.7010301@gmail.com>
In-Reply-To: <20061204110256.V24317@delplex.bde.org>
References:  <200612031104.kB3B4jcS098474@www.freebsd.org> <20061204110256.V24317@delplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------010800070203070007080707
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Bruce Evans schreef:
> On Sun, 3 Dec 2006, Rene Ladan wrote:
> 
>>> Description:
>> 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.
> 
[patch 1]

> 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).
>
I've attached a new patch which
  * fixes reporting of the flag (as in the previous patch)
  * sets the archive flag in DETIMES() when the file is created
  * cleans up the logic of not supporting setting the archive flag on
directories (chunk 3)
  * does not set the flag when (vap->va_atime.tv_sec != VNOVAL) or
(vap->va_mode != VNOVAL) in msdosfs_setattr()

I think that only userland tools should send a 'clear request', as the
flag only needs to be cleared when the file is backed up.  The kernel
cannot know when a file has been backed up.

Any comments are welcome.

> Bruce
> 

Regards,
Rene
-- 
GPG fingerprint = E738 5471 D185 7013 0EE0  4FC8 3C1D 6F83 12E1 84F6
(subkeys.pgp.net)

"It won't fit on the line."
		-- me, 2001


--------------010800070203070007080707
Content-Type: text/plain;
 name="msdos.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="msdos.diff"

--- msdosfs_vnops.c.orig	Sun Dec  3 20:45:24 2006
+++ msdosfs_vnops.c	Mon Dec  4 12:43:37 2006
@@ -354,7 +354,7 @@
 		vap->va_birthtime.tv_nsec = 0;
 	}
 	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;
@@ -431,12 +431,13 @@
 			if (error)
 				return (error);
 		}
-		if (vap->va_flags & ~SF_ARCHIVED)
-			return EOPNOTSUPP;
 		if (vap->va_flags & SF_ARCHIVED)
 			dep->de_Attributes &= ~ATTR_ARCHIVE;
-		else if (!(dep->de_Attributes & ATTR_DIRECTORY))
-			dep->de_Attributes |= ATTR_ARCHIVE;
+		else
+			if (dep->de_Attributes & ATTR_DIRECTORY)
+				return EOPNOTSUPP;
+			else 
+				dep->de_Attributes |= ATTR_ARCHIVE;
 		dep->de_flag |= DE_MODIFIED;
 	}
 
@@ -506,8 +507,9 @@
 				dep->de_flag &= ~DE_UPDATE;
 				timespec2fattime(&vap->va_mtime, 0,
 				    &dep->de_MDate, &dep->de_MTime, NULL);
+				dep->de_Attributes |= ATTR_ARCHIVE;
+				/* only set archive flag when file has changed */
 			}
-			dep->de_Attributes |= ATTR_ARCHIVE;
 			dep->de_flag |= DE_MODIFIED;
 		}
 	}
@@ -531,7 +533,6 @@
 				dep->de_Attributes &= ~ATTR_READONLY;
 			else
 				dep->de_Attributes |= ATTR_READONLY;
-			dep->de_Attributes |= ATTR_ARCHIVE;
 			dep->de_flag |= DE_MODIFIED;
 		}
 	}
--- denode.h.orig	Thu Oct 26 11:21:07 2006
+++ denode.h	Mon Dec  4 12:35:00 2006
@@ -239,6 +239,7 @@
 		timespec2fattime((cre), 0, &(dep)->de_CDate,		\
 		    &(dep)->de_CTime, &(dep)->de_CHun);			\
 		    (dep)->de_flag |= DE_MODIFIED;			\
+		    (dep)->de_Attributes |= ATTR_ARCHIVE;		\
 	}								\
 	(dep)->de_flag &= ~(DE_UPDATE | DE_CREATE | DE_ACCESS);		\
 } while (0)

--------------010800070203070007080707--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4574140D.7010301>