Hi,

Chris Roehrig wrote on 8/5/20 12:07 AM:
Hi Jean-Pierre,
        That one worked!    I also tried it with 1200 and 12000 renamed files, 
both with no errors.

Great news !

Thanks for your info about ldd.  There was indeed a 
/x86_64-linux-gnu/libntfs-3g.so.833.0.0 (which I renamed just to be sure), but I see that 
the test version is statically linked ("not a dynamic executable").

It should not be statically linked. I however remember having
seen a situation where executables are marked as shared objects
so they cannot be displayed by ldd.

If you get a libntfs-3g.so.* somewhere, then it is ok.

I also just discovered that ntfsresize -fiv does a filesystem consistency 
check.     Do you think it is good enough to trust to detect any issues, e.g. 
after a power-failure?   (This backup drive is likely only ever to be used with 
Linux and rsync.)

The check done by ntfsresize is limited : it mostly makes sure
that the space allocated to files and directories is the same as
recorded in the global allocation table.

If you want to run chkdsk from Linux, you can use runwin,
from
https://jp-andre.pagesperso-orange.fr/runwin.zip
(however not checked with the very latest chkdsk for Win10)

Jean-Pierre


Thanks,
        -- Chris

PS.  The use case for this drive is a daily Linux backup but also a 
"grab-and-go" backup for fleeing a forest-fire where we will likely have to 
rely on borrowed computers for a couple weeks.   NTFS is the only Linux-writable 
filesystem I found that can preserve POSIX ownerships and permissions and is readable 
without any additional software on Mac/PC/Linux.    Thank you for your dedicated work on 
ntfs-3g!


On Tue Aug 4 2020, at 5:33 AM, Jean-Pierre André <jean-pierre.an...@wanadoo.fr> 
wrote:

Hi,

Chris Roehrig wrote on 8/4/20 2:46 AM:
Hi Jean-Pierre,
        I tried it, but it made no difference:   baddir still gives exactly the 
same CHKDSK error.
Well, I found out my previous tries do not fix all cases,
as the behavior depends on the order of the renamings.

Please find attached a third try (discard the previous
variants before applying this one).

I'm not 100% sure if I'm using the patched version:    To mount the partition 
I'm running the patched ntfs-3g directly from its build directory:
        ./ntfs-3g_ntfsprogs-2017.3.23AR.5/src/ntfs-3g  /dev/sdb1  /mnt
Will that be completely stand-alone and isolated from Ubuntu's built-in ntfs-3g 
or could it e.g. pull in an old AR.3 shared lib or something?   I couldn't find 
any existing ntfs-3g stuff in /lib or /usr/lib.    I'm not familiar with how 
FUSE stuff works.
This a fifteen year old bug in a file unchanged for ten years,
so the patch applies to any non-archaic version.
The bug has been left unnoticed because it only occurs in very
specific conditions, and it does not harm. It is also probably
self-healing under some condition.

You have apparently correctly applied the recipe for
testing without installing (and without disturbing your
installed configuration). However, if you do "make install"
the generated code will not be put according to the rules
for your distribution.

You will have to declare the target directories as arguments
to configure, something like (not tested, depends on your
distribution).

./configure --bindir=/bin --sbindir=/sbin --libdir=/lib \
    --mandir=/usr/share/man

You can determine where libntfs-3g is installed by executing
ldd $(which ntfs-3g)

Jean-Pierre

Thanks,
        -- Chris


On Mon Aug 3 2020, at 12:16 AM, Jean-Pierre André 
<jean-pierre.an...@wanadoo.fr> wrote:

Hi,

Please find attached a hopefully better variant of the fix.

Jean-Pierre

Jean-Pierre André wrote on 8/1/20 12:35 PM:
Hi,

Thank you for your report including a test pointing out
the issue.

Attached is a patch expected to fix it.

Please test and report.

Jean-Pierre

Chris Roehrig wrote on 7/30/20 1:01 AM:
I'm trying to get my Linux-based NTFS backup drive to pass a CHKDSK and came 
upon this curious situation where CHKDSK finds errors.

It seems to be some issue with how ntfs-3g modifies a directory index when 
renaming many files.

The CHKDSK error always seems to be of the form:
Stage 2: Examining file name linkage ...
The first free byte, 0xc0, and bytes available, 0x150, for root index $I30 in 
file 0x40 are not equal.

I've attached a python script (mkbaddir.py) that creates two (apparently) 
identical directories, one of which reliably causes this CHKDSK error; the 
other doesn't.

How to demonstrate:
     - Format an NTFS partition or thumbdrive using Windows or mkfs.ntfs.
     - Mount the partition on a Linux system.
         I used Mint 20 with ntfs-3g 2017.3.23AR.3 integrated FUSE 28 and
         python 3.8.2.
     - Chdir to the new NTFS partition and run the script:
         /tmp/mkbaddir.py        # creates 'baddir' in current dir.
         /tmp/mkbaddir.py -G    # creates 'gooddir' in current dir.
         diff -r baddir gooddir        # no difference
         du -sB1 baddir gooddir    # same size (128K)
     - Boot into Windows (10 v1903) and run (from a terminal) chkdsk X:  (where 
X: is the NTFS drive).
         - This will say:
         "Errors found.  CHKDSK cannot continue in read-only mode."
     - Delete baddir (I used cygwin's rm -rf), and run chkdsk X: again.
         - This will now have no errors.

My guess at what's happening:
The script creates a directory of 410 empty files and then renames them with 
slightly larger names, which as I understand leaves a bunch of unused nodes in 
the b-tree.  The -G option just renames the 410 known files; without the -G 
option, it uses os.walk() to traverse the directory which I'm guessing leaves 
the b-tree in a slightly different state with even more unused nodes.

The 410 was chosen by trial-and-error so that some internal threshhold is just 
exceeded by the baddir but not by the gooddir.   With more than 410 (using the 
-c option; say -c 500), both baddir and gooddir will cause CHKDSK errors.

If I run the script on Windows/cygwin (Python 3.6.9) to create the folders, it 
does not give any CHKDSK errors even with many more files.

So there seems to be some issue with how ntfs-3g modifies the b-tree when 
renaming many files that is causing CHKDSK to complain.


I encountered this issue when trying to get my Linux-based NTFS backup drive to 
consistently pass a CHKDSK.  I use a script to first rename POSIX names to 
valid windows names, replacing '?' with '@@3F', etc so I can reverse the 
renaming afterwards.  I have some website mirror folders with many files of the 
form:
     details.asp?id=xxxxx&key=val
which gave rise to this issue.   (In the mkbaddir script I use only 
alphanumeric names to be clear this is not an illegal char issue).


<shorten_index-v2.patch>
<shorten_index-v3.patch>




_______________________________________________
ntfs-3g-devel mailing list
ntfs-3g-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ntfs-3g-devel

Reply via email to