From: DaeMyung Kang <charsyam@gmail.com>
To: Namjae Jeon <linkinjeon@kernel.org>
Cc: Hyunchul Lee <hyc.lee@gmail.com>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
DaeMyung Kang <charsyam@gmail.com>
Subject: [PATCH 2/3] ntfs: wake free-cluster waiters when precalc allocation fails
Date: Thu, 21 May 2026 02:01:50 +0900 [thread overview]
Message-ID: <20260520170151.4115308-3-charsyam@gmail.com> (raw)
In-Reply-To: <20260520170151.4115308-1-charsyam@gmail.com>
get_nr_free_clusters() is run from the precalc_free_clusters() worker
queued at the end of ntfs_fill_super(). It is also the only place that
publishes the result by atomic64_set(&vol->free_clusters, ...), sets
NVolSetFreeClusterKnown(), and wakes vol->free_waitq.
The initial kzalloc(sizeof(*ra), ...) can fail before that publication
happens. Callers that need the free count wait on NVolFreeClusterKnown(),
so this failure can leave statfs, write, and allocation paths blocked
forever.
On the OOM path, publish a conservative free count of zero, initialize
the per-bitmap-page free counters to zero, set NVolFreeClusterKnown, and
wake the wait queue so callers fail with -ENOSPC rather than block
forever.
Signed-off-by: DaeMyung Kang <charsyam@gmail.com>
---
super.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/super.c b/super.c
index 6cf09bbe017d..c90cb5673f98 100644
--- a/super.c
+++ b/super.c
@@ -1980,8 +1980,23 @@ s64 get_nr_free_clusters(struct ntfs_volume *vol)
return atomic64_read(&vol->free_clusters);
ra = kzalloc(sizeof(*ra), GFP_NOFS);
- if (!ra)
+ if (!ra) {
+ max_index = (((vol->nr_clusters + 7) >> 3) +
+ PAGE_SIZE - 1) >> PAGE_SHIFT;
+
+ /*
+ * Publish a conservative free count and wake any waiters; the
+ * NVolFreeClusterKnown flag is the sole signal the wait_event
+ * loops in statfs/allocation paths use, so failing to set it
+ * here would leave those callers blocked forever.
+ */
+ memset(vol->lcn_empty_bits_per_page, 0,
+ max_index * sizeof(*vol->lcn_empty_bits_per_page));
+ atomic64_set(&vol->free_clusters, 0);
+ NVolSetFreeClusterKnown(vol);
+ wake_up_all(&vol->free_waitq);
return 0;
+ }
file_ra_state_init(ra, mapping);
--
2.43.0
next prev parent reply other threads:[~2026-05-20 17:02 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-20 17:01 [PATCH 0/3] ntfs: fix mount failure cleanup and free-count setup DaeMyung Kang
2026-05-20 17:01 ` [PATCH 1/3] ntfs: free volume-wide resources on fill_super failure DaeMyung Kang
2026-05-21 1:03 ` Hyunchul Lee
2026-05-20 17:01 ` DaeMyung Kang [this message]
2026-05-21 1:03 ` [PATCH 2/3] ntfs: wake free-cluster waiters when precalc allocation fails Hyunchul Lee
2026-05-20 17:01 ` [PATCH 3/3] ntfs: only alias volume $UpCase to default on exact match DaeMyung Kang
2026-05-21 1:04 ` Hyunchul Lee
2026-05-21 1:02 ` [PATCH 0/3] ntfs: fix mount failure cleanup and free-count setup Hyunchul Lee
2026-05-21 10:17 ` [PATCH v2 " DaeMyung Kang
2026-05-21 10:17 ` [PATCH v2 1/3] ntfs: free volume-wide resources on fill_super failure DaeMyung Kang
2026-05-21 10:17 ` [PATCH v2 2/3] ntfs: avoid heap allocation for free-cluster readahead state DaeMyung Kang
2026-05-21 12:19 ` Namjae Jeon
2026-05-21 12:48 ` CharSyam
2026-05-22 0:00 ` Hyunchul Lee
2026-05-22 0:28 ` Namjae Jeon
2026-05-22 1:22 ` CharSyam
2026-05-22 4:31 ` Namjae Jeon
2026-05-21 10:17 ` [PATCH v2 3/3] ntfs: only alias volume $UpCase to default on exact match DaeMyung Kang
2026-05-21 13:00 ` [PATCH v3 0/3] ntfs: fix mount failure cleanup and free-count setup DaeMyung Kang
2026-05-21 13:00 ` [PATCH v3 1/3] ntfs: free volume-wide resources on fill_super failure DaeMyung Kang
2026-05-21 13:00 ` [PATCH v3 2/3] ntfs: avoid heap allocation for free-cluster readahead state DaeMyung Kang
2026-05-21 13:00 ` [PATCH v3 3/3] ntfs: only alias volume $UpCase to default on exact match DaeMyung Kang
2026-05-23 14:11 ` [PATCH v3 0/3] ntfs: fix mount failure cleanup and free-count setup Namjae Jeon
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=20260520170151.4115308-3-charsyam@gmail.com \
--to=charsyam@gmail.com \
--cc=hyc.lee@gmail.com \
--cc=linkinjeon@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.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