touch(1) not working on directories in an msdosfs(5) envirement

Rick Macklem rmacklem at uoguelph.ca
Fri Aug 19 22:58:56 UTC 2011


Vadim Goncharov wrote:
> Hi Rick Macklem!
> 
> On Fri, 19 Aug 2011 15:40:31 -0400 (EDT); Rick Macklem wrote about
> 'Re: touch(1) not working on directories in an msdosfs(5) envirement':
> 
> > Yes, FAT file systems do not maintain a directory modify
> > time. (The original FAT12,16 structure didn't even have a
> > modify time for the root dir.)
> 
> > Just like Windows.
> 
> > This causes issues when a FAT fs is exported via NFS and
> > someone was going to experiment with an "in memory only"
> > modify time for dirs, to minimize caching issues, but I
> > haven't heard back from them lately.
> 
> > Apparently Mac OS X chooses to update the modify time that
> > exists on FAT32 file systems, but that isn't Windows compatible.
> 
> What? I've just now created a test directory and changed it's modify
> time
> in Far Manager on Windows 2000, in a FAT32 partition. In fact it
> allows to
> change all three directory times, creation and access, too. So, I
> conclude,
> the FAT supports it.
> 
Well, FAT32 (not the root dir of FAT12 or FAT16) does have a modify
time stored on disk for the directory entry for a directory.

The case I was thinking of (because that was what affected NFS client
caching) was the case where an entry is added to a directory. I just
checked that and it does not change the directory's modify time when
an entry is added to a directory (at least for Windows7 personal...).

I'm not enough of a Windows guy to even know what "Far Manager" is,
but I'm not surprised that there is a tool that can change it.

msdosfs_setattr() in sys/fs/msdosfs/msdosfs_vnops.c definitely only
does it for non-directories:
		if (vp->v_type != VDIR) {
			if ((pmp->pm_flags & MSDOSFSMNT_NOWIN95) == 0 &&
			    vap->va_atime.tv_sec != VNOVAL) {
				dep->de_flag &= ~DE_ACCESS;
				timespec2fattime(&vap->va_atime, 0,
				    &dep->de_ADate, NULL, NULL);
			}
			if (vap->va_mtime.tv_sec != VNOVAL) {
				dep->de_flag &= ~DE_UPDATE;
				timespec2fattime(&vap->va_mtime, 0,
				    &dep->de_MDate, &dep->de_MTime, NULL);
			}
			dep->de_Attributes |= ATTR_ARCHIVE;
			dep->de_flag |= DE_MODIFIED;
		}

I'm not the author of the above, but I had assumed that it was
because Windows doesn't normally update it. Obviously, the above
code could easily be changed (although I haven't tested that), if
that is now considered correct behaviour. (It might have been
because the msdosfs is meant to work for all FAT variants.)

rick
> --
> WBR, Vadim Goncharov. ICQ#166852181 mailto:vadim_nuclight at mail.ru
> [Anti-Greenpeace][Sober FreeBSD
> zealot][http://nuclight.livejournal.com]
> 
> _______________________________________________
> freebsd-fs at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-fs
> To unsubscribe, send any mail to "freebsd-fs-unsubscribe at freebsd.org"


More information about the freebsd-fs mailing list