linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: bugzilla-daemon@bugzilla.kernel.org
To: linux-ext4@kernel.org
Subject: [Bug 196405] mkdir mishandles st_nlink in ext4 directory with 64997 subdirectories
Date: Wed, 19 Jul 2017 19:59:41 +0000	[thread overview]
Message-ID: <bug-196405-13602-pJlgM1cC6E@https.bugzilla.kernel.org/> (raw)
In-Reply-To: <bug-196405-13602@https.bugzilla.kernel.org/>

https://bugzilla.kernel.org/show_bug.cgi?id=196405

--- Comment #13 from Paul Eggert (eggert@cs.ucla.edu) ---

(In reply to Theodore Tso from comment #11)
> If the mainline "find" code has regressed

It hasn't regressed; it still works as long as the directory has fewer than
2**32 subdirectories (assuming x86), and as long as the compiler generates code
compatible with -fwrapv semantics, and this is good enough in practice. It's
still a matter of luck that findutils works, though. And glibc itself does not
work, as shown in the fts-test.c program attached to this bug report.

> I've looked at the Posix and SUS specs, and '.' and '..' are
> specified to be "special filenames" that have to be honored when
> resolving pathnames.  There is no requirement that they have to be
> implemented as hard links

Yes, of course. However, 'find', etc. have optimizations for GNU/Linux, e.g.,
code like this:

#if defined __linux__ && HAVE_FSTATFS && HAVE_STRUCT_STATFS_F_TYPE
[special code that runs only on GNU/Linux platforms, and that significantly
improves performance on those platforms]
#else
[generic code that runs on any POSIX platform, albeit more slowly]
#endif

and the GNU/Linux-specific code is broken on ext4 because the ext4 st_nlink is
not a link count. Obviously we could fix the problem by using the generic code
on GNU/Linux too; but this would hurt GNU/Linux performance significantly in
some cases.

> there are file systems that don't have hard links
> at all (NTFS, for example; and there have been versions of Windows
> that have gotten Posix certification).

The code in question already deals with both these issues, by avoiding
st_nlink-based optimizations on NTFS and other filesystems where st_nlink is
unreliable. The ext4 problem, though, is new to me, and evidently to everyone
else who's maintained the glibc etc. code, and this is why glibc is currently
broken on ext4 directories with 64998 or more subdirectories.

How about this idea for moving forward?

1. Clearly document that setting dir_nlink can break user-mode code, such as
glibc's fts functions.

2. Fix the four ext4 bugs that I mentioned in Comment 12.

3. For GNU utilities, override glibc's fts functions to work around the bugs
when they operate on ext4 filesystems.

4. File a glibc bug report for the bug exhibited in fts-test.c.

5. Disable dir_nlink in new ext4 filesystems, unless it is specifically
requested.

The combination of these changes should fix the problem in the long run.

I can volunteer to do (3) and (4). Can you do (1), (2), and (5)?

-- 
You are receiving this mail because:
You are watching the assignee of the bug.

  parent reply	other threads:[~2017-07-19 19:59 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-17 21:23 [Bug 196405] New: mkdir mishandles st_nlink in ext4 directory with 64997 subdirectories bugzilla-daemon
2017-07-18 19:41 ` [Bug 196405] " bugzilla-daemon
2017-07-18 21:07 ` bugzilla-daemon
2017-07-18 21:37 ` bugzilla-daemon
2017-07-18 21:54 ` bugzilla-daemon
2017-07-18 21:57 ` bugzilla-daemon
2017-07-18 22:19 ` bugzilla-daemon
2017-07-18 23:12 ` bugzilla-daemon
2017-07-18 23:15 ` bugzilla-daemon
2017-07-19  5:35 ` bugzilla-daemon
2017-07-19  8:02 ` bugzilla-daemon
2017-07-19 14:49 ` bugzilla-daemon
2017-07-19 19:44 ` bugzilla-daemon
2017-07-19 19:59 ` bugzilla-daemon [this message]
2017-07-19 22:22 ` bugzilla-daemon
2017-07-20  0:59 ` bugzilla-daemon
2017-07-21  7:48 ` bugzilla-daemon
2017-07-21  8:22 ` bugzilla-daemon
2017-07-21 15:25 ` bugzilla-daemon
2017-07-21 18:34 ` bugzilla-daemon
2017-07-21 21:14 ` bugzilla-daemon
2017-07-21 21:47 ` bugzilla-daemon
2017-07-22 14:41 ` bugzilla-daemon
2017-07-23 16:23 ` bugzilla-daemon
2017-07-23 22:55 ` bugzilla-daemon
2017-07-24 18:48 ` bugzilla-daemon
2017-07-25  8:56 ` bugzilla-daemon
2017-07-25  9:05 ` bugzilla-daemon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-196405-13602-pJlgM1cC6E@https.bugzilla.kernel.org/ \
    --to=bugzilla-daemon@bugzilla.kernel.org \
    --cc=linux-ext4@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).