ntfs broken when share through samba3
Mark Day
mday at apple.com
Tue Oct 17 11:13:41 PDT 2006
On Oct 16, 2006, at 2:42 PM, Lowell Gilbert wrote:
> absorbb at gmail.com (Ильдар Нурисламов) writes:
>
>> This old already reported bug.
>> But situation have'nt changed.
>
> For example, kern/86965.
>
>> There is very simple patch that fix this bug:
>>
>> --- usr/src/sys/fs/ntfs/ntfs_vnops.c Mon Mar 13 00:50:01 2006
>> +++ home/voxel/stuff/ntfs_vnops.c Thu Aug 31 09:22:08 2006
>> @@ -187,7 +187,8 @@
>> vap->va_fsid = dev2udev(ip->i_dev);
>> vap->va_fileid = ip->i_number;
>> vap->va_mode = ip->i_mp->ntm_mode;
>> - vap->va_nlink = ip->i_nlink;
>> + vap->va_nlink = (ip->i_nlink ? ip->i_nlink : 1);
>> + //vap->va_nlink = ip->i_nlink;
>> vap->va_uid = ip->i_mp->ntm_uid;
>> vap->va_gid = ip->i_mp->ntm_gid;
>> vap->va_rdev = 0; /* XXX UNODEV ? */
>>
>> but it seems to be not beaty solution
>
> Not beautiful, indeed.
>
> I was playing around with this, and although that change would work
> around the problem in (at least) most cases, I am not sure that it is
> truly correct.
>
> I am not an expert at filesystems, and certainly have little knowledge
> of NTFS. However, my observations confuse me considerably. The main
> issue is that if you read from a file (on NTFS, with a link count of
> zero according to ls(1)), the link count becomes populated. I cannot
> see how that would happen, because the ntnode structure link count is
> not modified except when reading the whole structure from the disk,
> and the on-disk node is not being changed. To confuse things further,
> the link count is changed to 2, not 1, on ordinary files that have
> only a single directory entry. I do not believe that streams are at
> issue, because the file has no open file descriptors remaining
> according to fstat(1).
IIRC, the NTFS code tries to populate a vnode based on the limited
information present in the directory entries it sees. It's trying to
avoid having to go read the Master File Table record (the i-node
equivalent) until it actually needs that information (such as the link
count). The ntfs_loadntnode() routine will read in the MFT record and
populate the rest of the vnode's fields. There's a flag
(VG_DONTLOADIN) to pass to ntfs_vgetex to control whether the MFT-
based fields get filled in when get the vnode.
Hope this helps,
-Mark
More information about the freebsd-fs
mailing list