* [PATCH 0/2] xfs_repair: improve caching in the face of ENOMEM
@ 2026-08-24 19:58 user.mail
2026-08-24 19:58 ` [PATCH 1/2] xfs_repair: do not allow cache growth to overflow user.mail
2026-08-24 19:59 ` [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get user.mail
0 siblings, 2 replies; 9+ messages in thread
From: user.mail @ 2026-08-24 19:58 UTC (permalink / raw)
To: linux-xfs
There are problems with how we react to cache allocation failures that
are more apparent before:
6b6239689e36 ("libxfs: unmap xmbuf pages to avoid disaster")
landed, but with enough pressure they show up again.
Two problems: cache_expand has no bounds checking, so call it enough
and c_maxcount will overflow, which typically results in an infinite
loop.
That can be triggered by the fact that today, an underlying ENOMEM
can look like a "cache too small" return, so we double when that
won't help at all. Do that enough times and kaboom.
I can trigger this with something like:
mkfs.xfs -d file,name=testfile.img,agcount=10000,size=1t
echo 1000 > /proc/sys/vm/max_map_count
xfs_repair -n -P -m 1280 testfile.img
to force an ENOMEM from the max map count, though the actual
max_map_count value needed varies depending on the machine I'm on,
for some reason.
These were quickly tested with ./check -g quick
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2] xfs_repair: do not allow cache growth to overflow
2026-08-24 19:58 [PATCH 0/2] xfs_repair: improve caching in the face of ENOMEM user.mail
@ 2026-08-24 19:58 ` user.mail
2026-08-25 3:17 ` Darrick J. Wong
2026-08-24 19:59 ` [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get user.mail
1 sibling, 1 reply; 9+ messages in thread
From: user.mail @ 2026-08-24 19:58 UTC (permalink / raw)
To: linux-xfs; +Cc: user.mail
Nothing stops cache_expand() from growing c_maxcount (via *2)
repeatedly until it overflows.
Add a bounds check here and return failure if for any reason we try to
grow too much.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: user.mail <sandeen@redhat.com>
---
libxfs/cache.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/libxfs/cache.c b/libxfs/cache.c
index d5d9ba56..f8be9b89 100644
--- a/libxfs/cache.c
+++ b/libxfs/cache.c
@@ -79,16 +79,23 @@ cache_init(
return cache;
}
-static void
+static int
cache_expand(
struct cache * cache)
{
+ int success = 1;
pthread_mutex_lock(&cache->c_mutex);
+ if (cache->c_maxcount <= UINT_MAX/2) {
#ifdef CACHE_DEBUG
- fprintf(stderr, "doubling cache size to %u\n", 2 * cache->c_maxcount);
+ fprintf(stderr, "doubling cache size to %u\n",
+ 2 * cache->c_maxcount);
#endif
- cache->c_maxcount *= 2;
+ cache->c_maxcount *= 2;
+ } else
+ success = 0;
pthread_mutex_unlock(&cache->c_mutex);
+
+ return success;
}
void
@@ -468,7 +475,8 @@ next_object:
*/
if (priority > CACHE_MAX_PRIORITY) {
priority = 0;
- cache_expand(cache);
+ if (!cache_expand(cache))
+ goto fail;
}
}
@@ -488,6 +496,10 @@ next_object:
*nodep = node;
return 1;
+
+fail:
+ *nodep = NULL;
+ return -1;
}
void
--
2.55.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get
2026-08-24 19:58 [PATCH 0/2] xfs_repair: improve caching in the face of ENOMEM user.mail
2026-08-24 19:58 ` [PATCH 1/2] xfs_repair: do not allow cache growth to overflow user.mail
@ 2026-08-24 19:59 ` user.mail
2026-08-25 3:18 ` Darrick J. Wong
1 sibling, 1 reply; 9+ messages in thread
From: user.mail @ 2026-08-24 19:59 UTC (permalink / raw)
To: linux-xfs; +Cc: user.mail
In the cache_node_get() callchain, we may fail in cache_node_allocate
for two distinct reasons:
- The cache may be at its current size limit, and must be expanded
- An underlying allocation may have actually failed with ENOMEM
Today, we do not distinguish these 2 failure modes and will try to
expand the cache size even in the face of an ENOMEM, which won't help.
We can distinguish these two failures, because:
If cache_node_allocate fails because all slots are full, c_count is
untouched, and it is >= c_maxcount (all slots full.)
If cache_node_allocate fails due to an underlying ENOMEM, c_count is
decremented before return and c_count will remain < c_maxcount.
So, if the cache has been fully shaken, cache_node_allocate stil
fails, and c_count < c_maxcount, this is a true ENOMEM situation, and
we should give up and tell the caller.
This adds yet another return value to cache_node_get (-1) for ENOMEM
failures, and corrects the comment about the existing 0-vs-1 returns
- though nobody looks at that return value today.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: user.mail <sandeen@redhat.com>
---
libxfs/cache.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/libxfs/cache.c b/libxfs/cache.c
index f8be9b89..63224e58 100644
--- a/libxfs/cache.c
+++ b/libxfs/cache.c
@@ -373,8 +373,8 @@ __cache_node_purge(
* hit, in which case this will all be over quickly and painlessly.
* Otherwise, we allocate a new node, taking care not to expand the
* cache beyond the requested maximum size (shrink it if it would).
- * Returns one if hit in cache, otherwise zero. A node is _always_
- * returned, however.
+ * Returns zero if hit in cache, otherwise return 1 for new node;
+ * allocation failures return -1 and a null nodep.
*/
int
cache_node_get(
@@ -474,6 +474,18 @@ next_object:
* If we exceed CACHE_MAX_PRIORITY all slots are full; grow it.
*/
if (priority > CACHE_MAX_PRIORITY) {
+ /*
+ * Shaking failed to make room. If the cache is not
+ * full, expanding the limit won't help - this is a
+ * genuine ENOMEM. Tell the caller.
+ */
+ pthread_mutex_lock(&cache->c_mutex);
+ if (cache->c_count < cache->c_maxcount) {
+ pthread_mutex_unlock(&cache->c_mutex);
+ *nodep = NULL;
+ return -1;
+ }
+ pthread_mutex_unlock(&cache->c_mutex);
priority = 0;
if (!cache_expand(cache))
goto fail;
--
2.55.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] xfs_repair: do not allow cache growth to overflow
2026-08-24 19:58 ` [PATCH 1/2] xfs_repair: do not allow cache growth to overflow user.mail
@ 2026-08-25 3:17 ` Darrick J. Wong
2026-08-25 12:36 ` Eric Sandeen
0 siblings, 1 reply; 9+ messages in thread
From: Darrick J. Wong @ 2026-08-25 3:17 UTC (permalink / raw)
To: user.mail; +Cc: linux-xfs
On Mon, Aug 24, 2026 at 02:58:59PM -0500, user.mail wrote:
> Nothing stops cache_expand() from growing c_maxcount (via *2)
> repeatedly until it overflows.
>
> Add a bounds check here and return failure if for any reason we try to
> grow too much.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> Signed-off-by: user.mail <sandeen@redhat.com>
> ---
> libxfs/cache.c | 20 ++++++++++++++++----
> 1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/libxfs/cache.c b/libxfs/cache.c
> index d5d9ba56..f8be9b89 100644
> --- a/libxfs/cache.c
> +++ b/libxfs/cache.c
> @@ -79,16 +79,23 @@ cache_init(
> return cache;
> }
>
> -static void
> +static int
> cache_expand(
> struct cache * cache)
> {
> + int success = 1;
> pthread_mutex_lock(&cache->c_mutex);
> + if (cache->c_maxcount <= UINT_MAX/2) {
> #ifdef CACHE_DEBUG
> - fprintf(stderr, "doubling cache size to %u\n", 2 * cache->c_maxcount);
> + fprintf(stderr, "doubling cache size to %u\n",
> + 2 * cache->c_maxcount);
> #endif
> - cache->c_maxcount *= 2;
> + cache->c_maxcount *= 2;
I agree that it's useful not to overflow c_maxcount, but how did you end
up with that many cached buffers? Or is this LLM-inspired bugfixes?
Either way I'm ok with this part, so...
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
> + } else
> + success = 0;
> pthread_mutex_unlock(&cache->c_mutex);
> +
> + return success;
> }
>
> void
> @@ -468,7 +475,8 @@ next_object:
> */
> if (priority > CACHE_MAX_PRIORITY) {
> priority = 0;
> - cache_expand(cache);
> + if (!cache_expand(cache))
> + goto fail;
> }
> }
>
> @@ -488,6 +496,10 @@ next_object:
>
> *nodep = node;
> return 1;
> +
> +fail:
> + *nodep = NULL;
> + return -1;
...but a general comment about this patch and the next one: it seems
reasonable to make cache_node_get return a null nodep and -1 to indicate
error, but AFAICT the only caller is __cache_lookup (aka the buffer
cache), which doesn't check the return value at all, only the value of
*nodep.
I don't see a change in this series to change __cache_lookup. Did that
get lost somewhere?
--D
> }
>
> void
> --
> 2.55.0
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get
2026-08-24 19:59 ` [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get user.mail
@ 2026-08-25 3:18 ` Darrick J. Wong
2026-08-25 15:39 ` Eric Sandeen
0 siblings, 1 reply; 9+ messages in thread
From: Darrick J. Wong @ 2026-08-25 3:18 UTC (permalink / raw)
To: user.mail; +Cc: linux-xfs
On Mon, Aug 24, 2026 at 02:59:00PM -0500, user.mail wrote:
> In the cache_node_get() callchain, we may fail in cache_node_allocate
> for two distinct reasons:
> - The cache may be at its current size limit, and must be expanded
> - An underlying allocation may have actually failed with ENOMEM
>
> Today, we do not distinguish these 2 failure modes and will try to
> expand the cache size even in the face of an ENOMEM, which won't help.
> We can distinguish these two failures, because:
>
> If cache_node_allocate fails because all slots are full, c_count is
> untouched, and it is >= c_maxcount (all slots full.)
>
> If cache_node_allocate fails due to an underlying ENOMEM, c_count is
> decremented before return and c_count will remain < c_maxcount.
>
> So, if the cache has been fully shaken, cache_node_allocate stil
> fails, and c_count < c_maxcount, this is a true ENOMEM situation, and
> we should give up and tell the caller.
>
> This adds yet another return value to cache_node_get (-1) for ENOMEM
> failures, and corrects the comment about the existing 0-vs-1 returns
> - though nobody looks at that return value today.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> Signed-off-by: user.mail <sandeen@redhat.com>
Dunno who "user.mail" is but I feel like I know them from somewhere ;)
> ---
> libxfs/cache.c | 16 ++++++++++++++--
> 1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/libxfs/cache.c b/libxfs/cache.c
> index f8be9b89..63224e58 100644
> --- a/libxfs/cache.c
> +++ b/libxfs/cache.c
> @@ -373,8 +373,8 @@ __cache_node_purge(
> * hit, in which case this will all be over quickly and painlessly.
> * Otherwise, we allocate a new node, taking care not to expand the
> * cache beyond the requested maximum size (shrink it if it would).
> - * Returns one if hit in cache, otherwise zero. A node is _always_
> - * returned, however.
> + * Returns zero if hit in cache, otherwise return 1 for new node;
> + * allocation failures return -1 and a null nodep.
> */
> int
> cache_node_get(
> @@ -474,6 +474,18 @@ next_object:
> * If we exceed CACHE_MAX_PRIORITY all slots are full; grow it.
> */
> if (priority > CACHE_MAX_PRIORITY) {
> + /*
> + * Shaking failed to make room. If the cache is not
> + * full, expanding the limit won't help - this is a
> + * genuine ENOMEM. Tell the caller.
> + */
> + pthread_mutex_lock(&cache->c_mutex);
> + if (cache->c_count < cache->c_maxcount) {
> + pthread_mutex_unlock(&cache->c_mutex);
> + *nodep = NULL;
> + return -1;
> + }
> + pthread_mutex_unlock(&cache->c_mutex);
Also seems fine to me, but nobody checks for these -1 returns. Also,
maybe we should be "return -ENOMEM" here or something?
--D
> priority = 0;
> if (!cache_expand(cache))
> goto fail;
> --
> 2.55.0
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] xfs_repair: do not allow cache growth to overflow
2026-08-25 3:17 ` Darrick J. Wong
@ 2026-08-25 12:36 ` Eric Sandeen
0 siblings, 0 replies; 9+ messages in thread
From: Eric Sandeen @ 2026-08-25 12:36 UTC (permalink / raw)
To: Darrick J. Wong, user.mail; +Cc: linux-xfs
On 8/24/26 10:17 PM, Darrick J. Wong wrote:
> On Mon, Aug 24, 2026 at 02:58:59PM -0500, user.mail wrote:
>> Nothing stops cache_expand() from growing c_maxcount (via *2)
>> repeatedly until it overflows.
>>
>> Add a bounds check here and return failure if for any reason we try to
>> grow too much.
>>
>> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
>> Signed-off-by: user.mail <sandeen@redhat.com>
>> ---
>> libxfs/cache.c | 20 ++++++++++++++++----
>> 1 file changed, 16 insertions(+), 4 deletions(-)
>>
>> diff --git a/libxfs/cache.c b/libxfs/cache.c
>> index d5d9ba56..f8be9b89 100644
>> --- a/libxfs/cache.c
>> +++ b/libxfs/cache.c
>> @@ -79,16 +79,23 @@ cache_init(
>> return cache;
>> }
>>
>> -static void
>> +static int
>> cache_expand(
>> struct cache * cache)
>> {
>> + int success = 1;
>> pthread_mutex_lock(&cache->c_mutex);
>> + if (cache->c_maxcount <= UINT_MAX/2) {
>> #ifdef CACHE_DEBUG
>> - fprintf(stderr, "doubling cache size to %u\n", 2 * cache->c_maxcount);
>> + fprintf(stderr, "doubling cache size to %u\n",
>> + 2 * cache->c_maxcount);
>> #endif
>> - cache->c_maxcount *= 2;
>> + cache->c_maxcount *= 2;
>
> I agree that it's useful not to overflow c_maxcount, but how did you end
> up with that many cached buffers? Or is this LLM-inspired bugfixes?
See the cover letter (sorta) ;) An ENOMEM from lower layers is indistinguishable
from "cache too small" so when we ran out of memory it rapidly doubled
its way to overflow.
In a quaint throwback to simpler times, this was actually observed by a user.
I think it was actually a low max_map_count in a small vm and a large
filesystem, though I don't recall the exact details now.
> Either way I'm ok with this part, so...
> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
>
>> + } else
>> + success = 0;
>> pthread_mutex_unlock(&cache->c_mutex);
>> +
>> + return success;
>> }
>>
>> void
>> @@ -468,7 +475,8 @@ next_object:
>> */
>> if (priority > CACHE_MAX_PRIORITY) {
>> priority = 0;
>> - cache_expand(cache);
>> + if (!cache_expand(cache))
>> + goto fail;
>> }
>> }
>>
>> @@ -488,6 +496,10 @@ next_object:
>>
>> *nodep = node;
>> return 1;
>> +
>> +fail:
>> + *nodep = NULL;
>> + return -1;
>
> ...but a general comment about this patch and the next one: it seems
> reasonable to make cache_node_get return a null nodep and -1 to indicate
> error, but AFAICT the only caller is __cache_lookup (aka the buffer
> cache), which doesn't check the return value at all, only the value of
> *nodep.
Uh, I guess that was a leftover, I thought "I should return something
different on error!" before I realized nobody was checking return val
and then didn't go back.
> I don't see a change in this series to change __cache_lookup. Did that
> get lost somewhere?
Not really, I just changed cache_expand before I realized __cache_lookup
didn't care. We could make it a void function, I suppose, or start checking
return val instead ...
-Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get
2026-08-25 3:18 ` Darrick J. Wong
@ 2026-08-25 15:39 ` Eric Sandeen
2026-08-25 15:49 ` Darrick J. Wong
0 siblings, 1 reply; 9+ messages in thread
From: Eric Sandeen @ 2026-08-25 15:39 UTC (permalink / raw)
To: Darrick J. Wong, user.mail; +Cc: linux-xfs
On 8/24/26 10:18 PM, Darrick J. Wong wrote:
> On Mon, Aug 24, 2026 at 02:59:00PM -0500, user.mail wrote:
>> In the cache_node_get() callchain, we may fail in cache_node_allocate
>> for two distinct reasons:
>> - The cache may be at its current size limit, and must be expanded
>> - An underlying allocation may have actually failed with ENOMEM
>>
>> Today, we do not distinguish these 2 failure modes and will try to
>> expand the cache size even in the face of an ENOMEM, which won't help.
>> We can distinguish these two failures, because:
>>
>> If cache_node_allocate fails because all slots are full, c_count is
>> untouched, and it is >= c_maxcount (all slots full.)
>>
>> If cache_node_allocate fails due to an underlying ENOMEM, c_count is
>> decremented before return and c_count will remain < c_maxcount.
>>
>> So, if the cache has been fully shaken, cache_node_allocate stil
>> fails, and c_count < c_maxcount, this is a true ENOMEM situation, and
>> we should give up and tell the caller.
>>
>> This adds yet another return value to cache_node_get (-1) for ENOMEM
>> failures, and corrects the comment about the existing 0-vs-1 returns
>> - though nobody looks at that return value today.
>>
>> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
>> Signed-off-by: user.mail <sandeen@redhat.com>
>
> Dunno who "user.mail" is but I feel like I know them from somewhere ;)
I'll check my git config in that tree, oops :( Been a minute since I
sent an xfsprogs patch I guess!
>> ---
>> libxfs/cache.c | 16 ++++++++++++++--
>> 1 file changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/libxfs/cache.c b/libxfs/cache.c
>> index f8be9b89..63224e58 100644
>> --- a/libxfs/cache.c
>> +++ b/libxfs/cache.c
>> @@ -373,8 +373,8 @@ __cache_node_purge(
>> * hit, in which case this will all be over quickly and painlessly.
>> * Otherwise, we allocate a new node, taking care not to expand the
>> * cache beyond the requested maximum size (shrink it if it would).
>> - * Returns one if hit in cache, otherwise zero. A node is _always_
>> - * returned, however.
>> + * Returns zero if hit in cache, otherwise return 1 for new node;
>> + * allocation failures return -1 and a null nodep.
>> */
>> int
>> cache_node_get(
>> @@ -474,6 +474,18 @@ next_object:
>> * If we exceed CACHE_MAX_PRIORITY all slots are full; grow it.
>> */
>> if (priority > CACHE_MAX_PRIORITY) {
>> + /*
>> + * Shaking failed to make room. If the cache is not
>> + * full, expanding the limit won't help - this is a
>> + * genuine ENOMEM. Tell the caller.
>> + */
>> + pthread_mutex_lock(&cache->c_mutex);
>> + if (cache->c_count < cache->c_maxcount) {
>> + pthread_mutex_unlock(&cache->c_mutex);
>> + *nodep = NULL;
>> + return -1;
>> + }
>> + pthread_mutex_unlock(&cache->c_mutex);
>
> Also seems fine to me, but nobody checks for these -1 returns.
Yeah, lazily mentioned in the commit log.
> Also,
> maybe we should be "return -ENOMEM" here or something?
Then have callers check, etc. Do you want me to rework things to rationalize
the return values (and caller checks?)
-Eric
> --D
>
>> priority = 0;
>> if (!cache_expand(cache))
>> goto fail;
>> --
>> 2.55.0
>>
>>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get
2026-08-25 15:39 ` Eric Sandeen
@ 2026-08-25 15:49 ` Darrick J. Wong
2026-08-25 15:50 ` Eric Sandeen
0 siblings, 1 reply; 9+ messages in thread
From: Darrick J. Wong @ 2026-08-25 15:49 UTC (permalink / raw)
To: Eric Sandeen; +Cc: user.mail, linux-xfs
On Tue, Aug 25, 2026 at 10:39:08AM -0500, Eric Sandeen wrote:
> On 8/24/26 10:18 PM, Darrick J. Wong wrote:
> > On Mon, Aug 24, 2026 at 02:59:00PM -0500, user.mail wrote:
> >> In the cache_node_get() callchain, we may fail in cache_node_allocate
> >> for two distinct reasons:
> >> - The cache may be at its current size limit, and must be expanded
> >> - An underlying allocation may have actually failed with ENOMEM
> >>
> >> Today, we do not distinguish these 2 failure modes and will try to
> >> expand the cache size even in the face of an ENOMEM, which won't help.
> >> We can distinguish these two failures, because:
> >>
> >> If cache_node_allocate fails because all slots are full, c_count is
> >> untouched, and it is >= c_maxcount (all slots full.)
> >>
> >> If cache_node_allocate fails due to an underlying ENOMEM, c_count is
> >> decremented before return and c_count will remain < c_maxcount.
> >>
> >> So, if the cache has been fully shaken, cache_node_allocate stil
> >> fails, and c_count < c_maxcount, this is a true ENOMEM situation, and
> >> we should give up and tell the caller.
> >>
> >> This adds yet another return value to cache_node_get (-1) for ENOMEM
> >> failures, and corrects the comment about the existing 0-vs-1 returns
> >> - though nobody looks at that return value today.
> >>
> >> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> >> Signed-off-by: user.mail <sandeen@redhat.com>
> >
> > Dunno who "user.mail" is but I feel like I know them from somewhere ;)
>
> I'll check my git config in that tree, oops :( Been a minute since I
> sent an xfsprogs patch I guess!
>
> >> ---
> >> libxfs/cache.c | 16 ++++++++++++++--
> >> 1 file changed, 14 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/libxfs/cache.c b/libxfs/cache.c
> >> index f8be9b89..63224e58 100644
> >> --- a/libxfs/cache.c
> >> +++ b/libxfs/cache.c
> >> @@ -373,8 +373,8 @@ __cache_node_purge(
> >> * hit, in which case this will all be over quickly and painlessly.
> >> * Otherwise, we allocate a new node, taking care not to expand the
> >> * cache beyond the requested maximum size (shrink it if it would).
> >> - * Returns one if hit in cache, otherwise zero. A node is _always_
> >> - * returned, however.
> >> + * Returns zero if hit in cache, otherwise return 1 for new node;
> >> + * allocation failures return -1 and a null nodep.
> >> */
> >> int
> >> cache_node_get(
> >> @@ -474,6 +474,18 @@ next_object:
> >> * If we exceed CACHE_MAX_PRIORITY all slots are full; grow it.
> >> */
> >> if (priority > CACHE_MAX_PRIORITY) {
> >> + /*
> >> + * Shaking failed to make room. If the cache is not
> >> + * full, expanding the limit won't help - this is a
> >> + * genuine ENOMEM. Tell the caller.
> >> + */
> >> + pthread_mutex_lock(&cache->c_mutex);
> >> + if (cache->c_count < cache->c_maxcount) {
> >> + pthread_mutex_unlock(&cache->c_mutex);
> >> + *nodep = NULL;
> >> + return -1;
> >> + }
> >> + pthread_mutex_unlock(&cache->c_mutex);
> >
> > Also seems fine to me, but nobody checks for these -1 returns.
>
> Yeah, lazily mentioned in the commit log.
>
> > Also,
> > maybe we should be "return -ENOMEM" here or something?
>
> Then have callers check, etc. Do you want me to rework things to rationalize
> the return values (and caller checks?)
Yeah, I think __cache_lookup should do something with the new return
codes, e.g.
int ret = cache_node_get(bcache, key, &cn);
if (ret < 0) {
fprintf(stderr,
"%s occurred, go buy a real computer!\n",
strerror(-ret));
abort();
}
if (!cn)
return -ENOMEM;
bp = container_of(cn, struct xfs_buf, b_node);
This can be a third patch, the first two patches look good to me aside
from having weird SoB lines.
--D
> -Eric
>
> > --D
> >
> >> priority = 0;
> >> if (!cache_expand(cache))
> >> goto fail;
> >> --
> >> 2.55.0
> >>
> >>
> >
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get
2026-08-25 15:49 ` Darrick J. Wong
@ 2026-08-25 15:50 ` Eric Sandeen
0 siblings, 0 replies; 9+ messages in thread
From: Eric Sandeen @ 2026-08-25 15:50 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: user.mail, linux-xfs
On 8/25/26 10:49 AM, Darrick J. Wong wrote:
> On Tue, Aug 25, 2026 at 10:39:08AM -0500, Eric Sandeen wrote:
...
>>> Also,
>>> maybe we should be "return -ENOMEM" here or something?
>>
>> Then have callers check, etc. Do you want me to rework things to rationalize
>> the return values (and caller checks?)
>
> Yeah, I think __cache_lookup should do something with the new return
> codes, e.g.
>
> int ret = cache_node_get(bcache, key, &cn);
> if (ret < 0) {
> fprintf(stderr,
> "%s occurred, go buy a real computer!\n",
> strerror(-ret));
> abort();
> }
> if (!cn)
> return -ENOMEM;
> bp = container_of(cn, struct xfs_buf, b_node);
>
> This can be a third patch, the first two patches look good to me aside
> from having weird SoB lines.
Fair enough, I was staying in the weird "we have distinct error codes that
are never checked" world and should have fixed that up at the same time,
for tidiness.
-Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-08-25 15:50 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-24 19:58 [PATCH 0/2] xfs_repair: improve caching in the face of ENOMEM user.mail
2026-08-24 19:58 ` [PATCH 1/2] xfs_repair: do not allow cache growth to overflow user.mail
2026-08-25 3:17 ` Darrick J. Wong
2026-08-25 12:36 ` Eric Sandeen
2026-08-24 19:59 ` [PATCH 2/2] xfs_repair: distinguish true ENOMEM from "not found" in cache_node_get user.mail
2026-08-25 3:18 ` Darrick J. Wong
2026-08-25 15:39 ` Eric Sandeen
2026-08-25 15:49 ` Darrick J. Wong
2026-08-25 15:50 ` Eric Sandeen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox