* [PATCH v2 01/17] afs: handle CB.InitCallBackState3 requests without a server record
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 02/17] afs: Fix error code in afs_extract_vl_addrs() David Howells
` (15 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Nan Li, stable, Yuan Tan, Yifan Wu, Juefei Pu,
Xin Liu, Ren Wei
From: Nan Li <tonanli66@gmail.com>
The cache manager callback path now attaches the server record to an
incoming call through the rxrpc peer's app data. That association is
not guaranteed to exist for every callback request, and most callback
handlers already tolerate that case.
Make CB.InitCallBackState3 follow the same pattern by checking whether a
server record was attached before using it. If the peer is not mapped
to a server record, trace the request and ignore it, matching the
existing behaviour for other unmatched callback requests.
This keeps the callback handler consistent with the rest of the cache
manager service and avoids depending on peer state that may not be
available for a given request.
Fixes: 40e8b52fe8c8 ("afs: Use the per-peer app data provided by rxrpc")
Cc: stable@kernel.org
Reported-by: Yuan Tan <yuantan098@gmail.com>
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Reported-by: Xin Liu <bird@lzu.edu.cn>
Signed-off-by: Nan Li <tonanli66@gmail.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/cmservice.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c
index 5540ae1cad59..263c60c811a5 100644
--- a/fs/afs/cmservice.c
+++ b/fs/afs/cmservice.c
@@ -364,6 +364,11 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call)
if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING))
return afs_io_error(call, afs_io_error_cm_reply);
+ if (!call->server) {
+ trace_afs_cm_no_server_u(call, call->request);
+ return 0;
+ }
+
if (memcmp(call->request, &call->server->_uuid, sizeof(call->server->_uuid)) != 0) {
pr_notice("Callback UUID does not match fileserver UUID\n");
trace_afs_cm_no_server_u(call, call->request);
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 02/17] afs: Fix error code in afs_extract_vl_addrs()
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
2026-06-18 7:48 ` [PATCH v2 01/17] afs: handle CB.InitCallBackState3 requests without a server record David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 03/17] afs: fix NULL pointer dereference in afs_get_tree() David Howells
` (14 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Dan Carpenter
From: Dan Carpenter <error27@gmail.com>
The error codes on these paths are only set on the first iteration
through the loop. Set the correct error code on every iteration.
Fixes: 0a5143f2f89c ("afs: Implement VL server rotation")
Signed-off-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/vl_list.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/afs/vl_list.c b/fs/afs/vl_list.c
index 3e4966915ea4..003889cf0f18 100644
--- a/fs/afs/vl_list.c
+++ b/fs/afs/vl_list.c
@@ -92,7 +92,7 @@ static struct afs_addr_list *afs_extract_vl_addrs(struct afs_net *net,
{
struct afs_addr_list *alist;
const u8 *b = *_b;
- int ret = -EINVAL;
+ int ret;
alist = afs_alloc_addrlist(nr_addrs);
if (!alist)
@@ -110,6 +110,7 @@ static struct afs_addr_list *afs_extract_vl_addrs(struct afs_net *net,
case DNS_ADDRESS_IS_IPV4:
if (end - b < 4) {
_leave(" = -EINVAL [short inet]");
+ ret = -EINVAL;
goto error;
}
memcpy(x, b, 4);
@@ -122,6 +123,7 @@ static struct afs_addr_list *afs_extract_vl_addrs(struct afs_net *net,
case DNS_ADDRESS_IS_IPV6:
if (end - b < 16) {
_leave(" = -EINVAL [short inet6]");
+ ret = -EINVAL;
goto error;
}
memcpy(x, b, 16);
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 03/17] afs: fix NULL pointer dereference in afs_get_tree()
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
2026-06-18 7:48 ` [PATCH v2 01/17] afs: handle CB.InitCallBackState3 requests without a server record David Howells
2026-06-18 7:48 ` [PATCH v2 02/17] afs: Fix error code in afs_extract_vl_addrs() David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 04/17] afs: Remove setting of AS_RELEASE_ALWAYS for symlinks and mountpoints David Howells
` (13 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Matvey Kovalev, stable
From: Matvey Kovalev <matvey.kovalev@ispras.ru>
afs_alloc_sbi() uses kzalloc for memory allocation. And, if
ctx->dyn_root is not null, as->cell and as->volume are null.
In trace_afs_get_tree() they are dereferenced.
KASAN error message:
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
CPU: 2 PID: 18478 Comm: syz-executor.7 Not tainted 5.10.246-syzkaller #0
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1
04/01/2014
RIP: 0010:perf_trace_afs_get_tree+0x1d9/0x550
include/trace/events/afs.h:1365
Call Trace:
trace_afs_get_tree include/trace/events/afs.h:1365 [inline]
afs_get_tree+0x922/0x1350 fs/afs/super.c:599
vfs_get_tree+0x8e/0x300 fs/super.c:1572
do_new_mount fs/namespace.c:3011 [inline]
path_mount+0x14a5/0x2220 fs/namespace.c:3341
do_mount fs/namespace.c:3354 [inline]
__do_sys_mount fs/namespace.c:3562 [inline]
__se_sys_mount fs/namespace.c:3539 [inline]
__x64_sys_mount+0x283/0x300 fs/namespace.c:3539
do_syscall_64+0x33/0x50 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x67/0xd1
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
Fixes: 80548b03991f5 ("afs: Add more tracepoints")
Cc: stable@vger.kernel.org
Signed-off-by: Matvey Kovalev <matvey.kovalev@ispras.ru>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/super.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/afs/super.c b/fs/afs/super.c
index 942f3e9800d7..dec091e569c4 100644
--- a/fs/afs/super.c
+++ b/fs/afs/super.c
@@ -587,7 +587,8 @@ static int afs_get_tree(struct fs_context *fc)
}
fc->root = dget(sb->s_root);
- trace_afs_get_tree(as->cell, as->volume);
+ if (!ctx->dyn_root)
+ trace_afs_get_tree(as->cell, as->volume);
_leave(" = 0 [%p]", sb);
return 0;
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 04/17] afs: Remove setting of AS_RELEASE_ALWAYS for symlinks and mountpoints
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (2 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 03/17] afs: fix NULL pointer dereference in afs_get_tree() David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 05/17] afs: use kvfree() to free memory allocated by kvcalloc() David Howells
` (12 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Deepakkumar Karn
Regular AFS files correctly use afs_file_aops which have release_folio
set as netfs_release_folio, so AS_RELEASE_ALWAYS is valid for them
when fscache is enabled (set via afs_vnode_set_cache()).
Symlinks and mountpoints in AFS use afs_dir_aops, which does not provide
a release_folio callback. However, afs_apply_status() unconditionally
calls mapping_set_release_always() for these.
In such case when memory management code attempts to release folios,
filemap_release_folio() checks folio_needs_release() which
returns true due to AS_RELEASE_ALWAYS being set. Since there is no
release_folio callback, it falls through to try_to_free_buffers(),
which at present expects buffer_heads to be not null. For symlinks
and mountpoints without buffer_heads, this causes pointer dereference.
Fixes: eae9e78951bb ("afs: Use netfslib for symlinks, allowing them to be cached")
Signed-off-by: Deepakkumar Karn <dkarn@redhat.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/inode.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 3f48458694ba..21ac098d03ef 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -126,7 +126,6 @@ static int afs_inode_init_from_status(struct afs_operation *op,
}
inode->i_mapping->a_ops = &afs_symlink_aops;
inode_nohighmem(inode);
- mapping_set_release_always(inode->i_mapping);
break;
default:
dump_vnode(vnode, op->file[0].vnode != vnode ? op->file[0].vnode : NULL);
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 05/17] afs: use kvfree() to free memory allocated by kvcalloc()
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (3 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 04/17] afs: Remove setting of AS_RELEASE_ALWAYS for symlinks and mountpoints David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 06/17] afs: Remove erroneous seq |= 1 in volume lookup loop David Howells
` (11 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Zilin Guan
From: Zilin Guan <zilin@seu.edu.cn>
op->more_files is allocated with kvcalloc() but released via
afs_put_operation(), which uses kfree() internally. This mismach prevents
the resource from being released properly and may lead to undefined
behavior.
Fix this by using kvfree() to free op->more_files to match its allocation
method.
Fixes: e49c7b2f6de7 ("afs: Build an abstraction around an "operation" concept")
Signed-off-by: Zilin Guan <zilin@seu.edu.cn>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/fs_operation.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/afs/fs_operation.c b/fs/afs/fs_operation.c
index c0dbbc6d3716..20801b29521d 100644
--- a/fs/afs/fs_operation.c
+++ b/fs/afs/fs_operation.c
@@ -348,7 +348,7 @@ int afs_put_operation(struct afs_operation *op)
for (i = 0; i < op->nr_files - 2; i++)
if (op->more_files[i].put_vnode)
iput(&op->more_files[i].vnode->netfs.inode);
- kfree(op->more_files);
+ kvfree(op->more_files);
}
if (op->estate) {
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 06/17] afs: Remove erroneous seq |= 1 in volume lookup loop
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (4 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 05/17] afs: use kvfree() to free memory allocated by kvcalloc() David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 07/17] afs: check for duplicate servers in VL server list David Howells
` (10 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Li RongQing, Oleg Nesterov
From: Li RongQing <lirongqing@baidu.com>
The `seq |= 1` operation in the volume lookup loop is incorrect because:
seq is already incremented at start, making it odd in next iteration
which triggers lock, but The `|= 1` operation causes seq to be even
and unintended lockless operation
Remove this erroneous operation to maintain proper lock sequencing.
Fixes: 32222f09782f ("afs: Apply server breaks to mmap'd files in the call processor")
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/callback.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/afs/callback.c b/fs/afs/callback.c
index 894d2bad6b6c..833ac3178ddc 100644
--- a/fs/afs/callback.c
+++ b/fs/afs/callback.c
@@ -140,7 +140,6 @@ static struct afs_volume *afs_lookup_volume_rcu(struct afs_cell *cell,
break;
if (!need_seqretry(&cell->volume_lock, seq))
break;
- seq |= 1; /* Want a lock next time */
}
done_seqretry(&cell->volume_lock, seq);
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 07/17] afs: check for duplicate servers in VL server list
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (5 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 06/17] afs: Remove erroneous seq |= 1 in volume lookup loop David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 08/17] afs: Fix bulk lookup malfunction due to change in dir_emit() API David Howells
` (9 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Yuto Ohnuki
From: Yuto Ohnuki <ytohnuki@amazon.com>
The DNS response may contain the same server more than once. Check for
duplicates by name and port before inserting into the list to avoid
duplicate entries.
Addresses the TODO comment in afs_extract_vlserver_list().
Signed-off-by: Yuto Ohnuki <ytohnuki@amazon.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/vl_list.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/fs/afs/vl_list.c b/fs/afs/vl_list.c
index 003889cf0f18..8e1cf6cdcf71 100644
--- a/fs/afs/vl_list.c
+++ b/fs/afs/vl_list.c
@@ -289,8 +289,20 @@ struct afs_vlserver_list *afs_extract_vlserver_list(struct afs_cell *cell,
afs_put_addrlist(old, afs_alist_trace_put_vlserver_old);
}
+ /* Check for duplicates in the server list */
+ for (j = 0; j < vllist->nr_servers; j++) {
+ struct afs_vlserver *s = vllist->servers[j].server;
- /* TODO: Might want to check for duplicates */
+ if (s->name_len == server->name_len &&
+ s->port == server->port &&
+ strncasecmp(s->name, server->name, server->name_len) == 0) {
+ afs_put_vlserver(cell->net, server);
+ server = NULL;
+ break;
+ }
+ }
+ if (!server)
+ continue;
/* Insertion-sort by priority and weight */
for (j = 0; j < vllist->nr_servers; j++) {
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 08/17] afs: Fix bulk lookup malfunction due to change in dir_emit() API
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (6 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 07/17] afs: check for duplicate servers in VL server list David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 09/17] afs: Fix misplaced inc of net->cells_outstanding David Howells
` (8 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Amir Goldstein
afs_do_lookup() and afs_do_lookup_one() use the same directory parsing code
as afs_readdir() and were supplying alternative dir_context actors to
retrieve dirents, but because lookup needs the vnode's uniquifier as part
of the reference, but not the DT flags, the uniquifier was being passed in
the dt flags argument to the lookup actors.
Unfortunately, commit c644bce62b9c, added to fix overlayfs with fuse, broke
this by masking off part of the uniquifier. This doesn't matter enough to
be directly noticeable, instead causing bulk advance inode lookups to fail
(which are retried later) and may cause dir revalidation to malfunction if
the uniquifier is changed by masking.
Fix this by making the afs directory parsing code take special ->actor
values of AFS_LOOKUP or AFS_LOOKUP_ONE instead that tell it to call
afs_lookup_filldir() or afs_lookup_one_filldir() directly rather than going
through dir_emit(). dir_emit() is still used for readdir.
Fixes: c644bce62b9c ("readdir: require opt-in for d_type flags")
Reported-by: Marc Dionne <marc.dionne@auristor.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Amir Goldstein <amir73il@gmail.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/dir.c | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/fs/afs/dir.c b/fs/afs/dir.c
index 498b99ccdf0e..7af36370ccb4 100644
--- a/fs/afs/dir.c
+++ b/fs/afs/dir.c
@@ -28,9 +28,11 @@ static int afs_d_revalidate(struct inode *dir, const struct qstr *name,
static int afs_d_delete(const struct dentry *dentry);
static void afs_d_iput(struct dentry *dentry, struct inode *inode);
static bool afs_lookup_one_filldir(struct dir_context *ctx, const char *name, int nlen,
- loff_t fpos, u64 ino, unsigned dtype);
+ u64 ino, u32 uniquifier);
+#define AFS_LOOKUP_ONE ((filldir_t)0x123UL)
static bool afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen,
- loff_t fpos, u64 ino, unsigned dtype);
+ u64 ino, u32 uniquifier);
+#define AFS_LOOKUP ((filldir_t)0x137UL)
static int afs_create(struct mnt_idmap *idmap, struct inode *dir,
struct dentry *dentry, umode_t mode, bool excl);
static struct dentry *afs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
@@ -421,11 +423,18 @@ static int afs_dir_iterate_block(struct afs_vnode *dvnode,
}
/* found the next entry */
- if (!dir_emit(ctx, dire->u.name, nlen,
- ntohl(dire->u.vnode),
- (ctx->actor == afs_lookup_filldir ||
- ctx->actor == afs_lookup_one_filldir)?
- ntohl(dire->u.unique) : DT_UNKNOWN)) {
+ if (ctx->actor == AFS_LOOKUP) {
+ if (!afs_lookup_filldir(ctx, dire->u.name, nlen,
+ ntohl(dire->u.vnode),
+ ntohl(dire->u.unique)))
+ return 0;
+ } else if (ctx->actor == AFS_LOOKUP_ONE) {
+ if (!afs_lookup_one_filldir(ctx, dire->u.name, nlen,
+ ntohl(dire->u.vnode),
+ ntohl(dire->u.unique)))
+ return 0;
+ } else if (!dir_emit(ctx, dire->u.name, nlen,
+ ntohl(dire->u.vnode), DT_UNKNOWN)) {
_leave(" = 0 [full]");
return 0;
}
@@ -545,6 +554,7 @@ static int afs_readdir(struct file *file, struct dir_context *ctx)
{
afs_dataversion_t dir_version;
+ ctx->dt_flags_mask = UINT_MAX;
return afs_dir_iterate(file_inode(file), ctx, file, &dir_version);
}
@@ -554,7 +564,7 @@ static int afs_readdir(struct file *file, struct dir_context *ctx)
* uniquifier through dtype
*/
static bool afs_lookup_one_filldir(struct dir_context *ctx, const char *name,
- int nlen, loff_t fpos, u64 ino, unsigned dtype)
+ int nlen, u64 ino, unsigned dtype)
{
struct afs_lookup_one_cookie *cookie =
container_of(ctx, struct afs_lookup_one_cookie, ctx);
@@ -591,7 +601,7 @@ static int afs_do_lookup_one(struct inode *dir, const struct qstr *name,
{
struct afs_super_info *as = dir->i_sb->s_fs_info;
struct afs_lookup_one_cookie cookie = {
- .ctx.actor = afs_lookup_one_filldir,
+ .ctx.actor = AFS_LOOKUP_ONE,
.name = *name,
.fid.vid = as->volume->vid
};
@@ -622,7 +632,7 @@ static int afs_do_lookup_one(struct inode *dir, const struct qstr *name,
* uniquifier through dtype
*/
static bool afs_lookup_filldir(struct dir_context *ctx, const char *name,
- int nlen, loff_t fpos, u64 ino, unsigned dtype)
+ int nlen, u64 ino, unsigned dtype)
{
struct afs_lookup_cookie *cookie =
container_of(ctx, struct afs_lookup_cookie, ctx);
@@ -778,7 +788,7 @@ static struct inode *afs_do_lookup(struct inode *dir, struct dentry *dentry)
for (i = 0; i < ARRAY_SIZE(cookie->fids); i++)
cookie->fids[i].vid = dvnode->fid.vid;
- cookie->ctx.actor = afs_lookup_filldir;
+ cookie->ctx.actor = AFS_LOOKUP;
cookie->name = dentry->d_name;
cookie->nr_fids = 2; /* slot 1 is saved for the fid we actually want
* and slot 0 for the directory */
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 09/17] afs: Fix misplaced inc of net->cells_outstanding
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (7 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 08/17] afs: Fix bulk lookup malfunction due to change in dir_emit() API David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 10/17] afs: Fix reinitialisation of the inode, in particular ->lock_work David Howells
` (7 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Hillf Danton
Fix net->cells_outstanding being incremented before the check for failure
of idr_alloc_cyclic(), leaving the count incremented on error.
Fixes: 88c853c3f5c0 ("afs: Fix cell refcounting by splitting the usage counter")
Reported-by: Hillf Danton <hdanton@sina.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/cell.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/afs/cell.c b/fs/afs/cell.c
index 9738684dbdd2..e0fab1609f27 100644
--- a/fs/afs/cell.c
+++ b/fs/afs/cell.c
@@ -205,11 +205,11 @@ static struct afs_cell *afs_alloc_cell(struct afs_net *net,
cell->dns_source = vllist->source;
cell->dns_status = vllist->status;
smp_store_release(&cell->dns_lookup_count, 1); /* vs source/status */
- atomic_inc(&net->cells_outstanding);
ret = idr_alloc_cyclic(&net->cells_dyn_ino, cell,
2, INT_MAX / 2, GFP_KERNEL);
if (ret < 0)
goto error;
+ atomic_inc(&net->cells_outstanding);
cell->dynroot_ino = ret;
cell->debug_id = atomic_inc_return(&cell_debug_id);
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 10/17] afs: Fix reinitialisation of the inode, in particular ->lock_work
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (8 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 09/17] afs: Fix misplaced inc of net->cells_outstanding David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 11/17] afs: Fix callback service message parsers to pass through -EAGAIN David Howells
` (6 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Thomas Gleixner
It seems that initalising afs_vnode::lock_work a single time in the slab's
init function isn't sufficient for work_structs. This results in the
DEBUG_OBJECTS debugging stuff producing a warning occasionally when running
the generic/131 xfstest:
ODEBUG: activate not available (active state 0) object: 0000000016d8760f object type: work_struct hint: afs_lock_work+0x0/0x220
WARNING: lib/debugobjects.c:629 at debug_print_object+0x4b/0x90, CPU#3: locktest/7695
...
CPU: 3 UID: 0 PID: 7695 Comm: locktest Tainted: G S 7.1.0-build3+ #2771 PREEMPT
...
RIP: 0010:debug_print_object+0x65/0x90
...
Call Trace:
<TASK>
? __pfx_afs_lock_work+0x10/0x10
debug_object_activate+0x122/0x170
insert_work+0x25/0x60
__queue_work+0x2e0/0x340
queue_delayed_work_on+0x48/0x70
afs_fl_release_private+0x57/0x70
locks_release_private+0x5c/0xa0
locks_free_lock+0xe/0x20
posix_lock_inode+0x55f/0x5b0
locks_lock_inode_wait+0x81/0x140
? file_write_and_wait_range+0x50/0x70
afs_lock+0xcd/0x110
fcntl_setlk+0x10d/0x260
do_fcntl+0x24e/0x5b0
__do_sys_fcntl+0x6a/0x90
do_syscall_64+0x11e/0x310
entry_SYSCALL_64_after_hwframe+0x71/0x79
Fix this by reinitialising ->lock_work after allocating an inode.
Fixes: e8d6c554126b ("AFS: implement file locking")
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Thomas Gleixner <tglx@kernel.org>
cc: linux-afs@lists.infradead.org
---
fs/afs/super.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/afs/super.c b/fs/afs/super.c
index dec091e569c4..82bb713825a0 100644
--- a/fs/afs/super.c
+++ b/fs/afs/super.c
@@ -660,7 +660,6 @@ static void afs_i_init_once(void *_vnode)
INIT_LIST_HEAD(&vnode->wb_keys);
INIT_LIST_HEAD(&vnode->pending_locks);
INIT_LIST_HEAD(&vnode->granted_locks);
- INIT_DELAYED_WORK(&vnode->lock_work, afs_lock_work);
INIT_LIST_HEAD(&vnode->cb_mmap_link);
seqlock_init(&vnode->cb_lock);
}
@@ -694,6 +693,7 @@ static struct inode *afs_alloc_inode(struct super_block *sb)
init_rwsem(&vnode->rmdir_lock);
INIT_WORK(&vnode->cb_work, afs_invalidate_mmap_work);
+ INIT_DELAYED_WORK(&vnode->lock_work, afs_lock_work);
_leave(" = %p", &vnode->netfs.inode);
return &vnode->netfs.inode;
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 11/17] afs: Fix callback service message parsers to pass through -EAGAIN
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (9 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 10/17] afs: Fix reinitialisation of the inode, in particular ->lock_work David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 12/17] afs: Fix double netfs initialisation in afs_root_iget() David Howells
` (5 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel
The AFS filesystem client uses an rxrpc server to listen for callback
notifications. Each callback call type handler has a delivery function
that parses the incoming request stream, and this should return -EAGAIN the
last packet hasn't yet been seen, but all currently queued received data is
consumed. afs_extract_data() does this, but the -EAGAIN return is switched
to 0 inadvertantly
Fix callback service message parsers to pass through -EAGAIN
Fixes: d001648ec7cf ("rxrpc: Don't expose skbs to in-kernel users [ver #2]")
Closes: https://sashiko.dev/#/patchset/20260609081738.770127-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/cmservice.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c
index 263c60c811a5..db394f101fc6 100644
--- a/fs/afs/cmservice.c
+++ b/fs/afs/cmservice.c
@@ -334,7 +334,6 @@ static int afs_deliver_cb_init_call_back_state3(struct afs_call *call)
ret = afs_extract_data(call, false);
switch (ret) {
case 0: break;
- case -EAGAIN: return 0;
default: return ret;
}
@@ -456,7 +455,6 @@ static int afs_deliver_cb_probe_uuid(struct afs_call *call)
ret = afs_extract_data(call, false);
switch (ret) {
case 0: break;
- case -EAGAIN: return 0;
default: return ret;
}
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 12/17] afs: Fix double netfs initialisation in afs_root_iget()
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (10 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 11/17] afs: Fix callback service message parsers to pass through -EAGAIN David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 13/17] afs: Don't use AS_RELEASE_ALWAYS for dir/symlinks part 2 David Howells
` (4 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel
Fix afs_root_iget() to leave initialisation of the netfs_inode part of the
afs_vnode to afs_inode_init_from_status().
Fixes: bc899ee1c898 ("netfs: Add a netfs inode context")
Closes: https://sashiko.dev/#/patchset/20260609081738.770127-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/inode.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 21ac098d03ef..c8df1764d414 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -565,7 +565,6 @@ struct inode *afs_root_iget(struct super_block *sb, struct key *key)
vnode = AFS_FS_I(inode);
vnode->cb_v_check = atomic_read(&as->volume->cb_v_break);
- afs_set_netfs_context(vnode);
op = afs_alloc_operation(key, as->volume);
if (IS_ERR(op)) {
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 13/17] afs: Don't use AS_RELEASE_ALWAYS for dir/symlinks part 2
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (11 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 12/17] afs: Fix double netfs initialisation in afs_root_iget() David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop David Howells
` (3 subsequent siblings)
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Deepakkumar Karn
As an addendum to a previous patch, don't enable AS_RELEASE_ALWAYS for afs
dirs and symlinks in a couple of other places. Turning this flag on for
those file types is ineffective as they don't have any folios in their
->i_pages.
Fixes: eae9e78951bb ("afs: Use netfslib for symlinks, allowing them to be cached")
Closes: https://sashiko.dev/#/patchset/20260609081738.770127-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Deepakkumar Karn <dkarn@redhat.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/inode.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index c8df1764d414..54ac6ec21daf 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -52,9 +52,9 @@ static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *paren
/*
* Set parameters for the netfs library
*/
-static void afs_set_netfs_context(struct afs_vnode *vnode)
+static void afs_set_netfs_context(struct afs_vnode *vnode, bool is_file)
{
- netfs_inode_init(&vnode->netfs, &afs_req_ops, true);
+ netfs_inode_init(&vnode->netfs, &afs_req_ops, is_file);
}
/*
@@ -135,7 +135,7 @@ static int afs_inode_init_from_status(struct afs_operation *op,
i_size_write(inode, status->size);
inode_set_bytes(inode, status->size);
- afs_set_netfs_context(vnode);
+ afs_set_netfs_context(vnode, status->type == AFS_FTYPE_FILE);
vnode->invalid_before = status->data_version;
trace_afs_set_dv(vnode, status->data_version);
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (12 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 13/17] afs: Don't use AS_RELEASE_ALWAYS for dir/symlinks part 2 David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 8:25 ` Oleg Nesterov
2026-06-18 8:43 ` 答复: [????] " Li,Rongqing
2026-06-18 7:48 ` [PATCH v2 15/17] afs: Fix leak of ungot volume David Howells
` (2 subsequent siblings)
16 siblings, 2 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Oleg Nesterov, Li RongQing
This is an addendum to the patch to remove the erroneous seq |= 1 in volume
lookup loop.
Switch to using scoped_seqlock_read() as suggested by Oleg Nesterov[1].
Fixes: 32222f09782f ("afs: Apply server breaks to mmap'd files in the call processor")
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Oleg Nesterov <oleg@redhat.com>
cc: Li RongQing <lirongqing@baidu.com>
cc: linux-afs@lists.infradead.org
Link: https://lore.kernel.org/r/aifaeKvz3KemfzaS@redhat.com/ [1]
---
fs/afs/callback.c | 9 +--------
fs/afs/internal.h | 2 --
2 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/fs/afs/callback.c b/fs/afs/callback.c
index 833ac3178ddc..dd7a407ea368 100644
--- a/fs/afs/callback.c
+++ b/fs/afs/callback.c
@@ -113,16 +113,12 @@ static struct afs_volume *afs_lookup_volume_rcu(struct afs_cell *cell,
{
struct afs_volume *volume = NULL;
struct rb_node *p;
- int seq = 1;
- for (;;) {
+ scoped_seqlock_read(&cell->volume_lock, ss_lock) {
/* Unfortunately, rbtree walking doesn't give reliable results
* under just the RCU read lock, so we have to check for
* changes.
*/
- seq++; /* 2 on the 1st/lockless path, otherwise odd */
- read_seqbegin_or_lock(&cell->volume_lock, &seq);
-
p = rcu_dereference_raw(cell->volumes.rb_node);
while (p) {
volume = rb_entry(p, struct afs_volume, cell_node);
@@ -138,11 +134,8 @@ static struct afs_volume *afs_lookup_volume_rcu(struct afs_cell *cell,
if (volume && afs_try_get_volume(volume, afs_volume_trace_get_callback))
break;
- if (!need_seqretry(&cell->volume_lock, seq))
- break;
}
- done_seqretry(&cell->volume_lock, seq);
return volume;
}
diff --git a/fs/afs/internal.h b/fs/afs/internal.h
index 0b72a8566299..785c646856d7 100644
--- a/fs/afs/internal.h
+++ b/fs/afs/internal.h
@@ -750,8 +750,6 @@ static inline void afs_vnode_set_cache(struct afs_vnode *vnode,
{
#ifdef CONFIG_AFS_FSCACHE
vnode->netfs.cache = cookie;
- if (cookie)
- mapping_set_release_always(vnode->netfs.inode.i_mapping);
#endif
}
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop
2026-06-18 7:48 ` [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop David Howells
@ 2026-06-18 8:25 ` Oleg Nesterov
2026-06-18 11:59 ` David Howells
2026-06-18 13:53 ` David Howells
2026-06-18 8:43 ` 答复: [????] " Li,Rongqing
1 sibling, 2 replies; 23+ messages in thread
From: Oleg Nesterov @ 2026-06-18 8:25 UTC (permalink / raw)
To: David Howells
Cc: Christian Brauner, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Li RongQing
On 06/18, David Howells wrote:
>
> This is an addendum to the patch to remove the erroneous seq |= 1 in volume
> lookup loop.
>
> Switch to using scoped_seqlock_read() as suggested by Oleg Nesterov[1].
Thanks, but
> --- a/fs/afs/internal.h
> +++ b/fs/afs/internal.h
> @@ -750,8 +750,6 @@ static inline void afs_vnode_set_cache(struct afs_vnode *vnode,
> {
> #ifdef CONFIG_AFS_FSCACHE
> vnode->netfs.cache = cookie;
> - if (cookie)
> - mapping_set_release_always(vnode->netfs.inode.i_mapping);
> #endif
This change looks unrelated...
Oleg.
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop
2026-06-18 8:25 ` Oleg Nesterov
@ 2026-06-18 11:59 ` David Howells
2026-06-18 13:53 ` David Howells
1 sibling, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 11:59 UTC (permalink / raw)
To: Oleg Nesterov
Cc: dhowells, Christian Brauner, Marc Dionne, linux-afs,
linux-fsdevel, linux-kernel, Li RongQing
Oleg Nesterov <oleg@redhat.com> wrote:
> > - if (cookie)
> > - mapping_set_release_always(vnode->netfs.inode.i_mapping);
> > #endif
>
> This change looks unrelated...
Oh... That should've been in the preceding patch.
David
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop
2026-06-18 8:25 ` Oleg Nesterov
2026-06-18 11:59 ` David Howells
@ 2026-06-18 13:53 ` David Howells
2026-06-18 15:08 ` Oleg Nesterov
1 sibling, 1 reply; 23+ messages in thread
From: David Howells @ 2026-06-18 13:53 UTC (permalink / raw)
To: Oleg Nesterov
Cc: dhowells, Christian Brauner, Marc Dionne, linux-afs,
linux-fsdevel, linux-kernel, Li RongQing
Oleg Nesterov <oleg@redhat.com> wrote:
> Thanks, but
>
> > --- a/fs/afs/internal.h
> > +++ b/fs/afs/internal.h
> > @@ -750,8 +750,6 @@ static inline void afs_vnode_set_cache(struct afs_vnode *vnode,
> > {
> > #ifdef CONFIG_AFS_FSCACHE
> > vnode->netfs.cache = cookie;
> > - if (cookie)
> > - mapping_set_release_always(vnode->netfs.inode.i_mapping);
> > #endif
>
> This change looks unrelated...
If I remove that bit, can I add your R-b?
David
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop
2026-06-18 13:53 ` David Howells
@ 2026-06-18 15:08 ` Oleg Nesterov
0 siblings, 0 replies; 23+ messages in thread
From: Oleg Nesterov @ 2026-06-18 15:08 UTC (permalink / raw)
To: David Howells
Cc: Christian Brauner, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Li RongQing
On 06/18, David Howells wrote:
>
> Oleg Nesterov <oleg@redhat.com> wrote:
>
> > > --- a/fs/afs/internal.h
> > > +++ b/fs/afs/internal.h
> > > @@ -750,8 +750,6 @@ static inline void afs_vnode_set_cache(struct afs_vnode *vnode,
> > > {
> > > #ifdef CONFIG_AFS_FSCACHE
> > > vnode->netfs.cache = cookie;
> > > - if (cookie)
> > > - mapping_set_release_always(vnode->netfs.inode.i_mapping);
> > > #endif
> >
> > This change looks unrelated...
>
> If I remove that bit, can I add your R-b?
Yes, thank you!
Oleg.
^ permalink raw reply [flat|nested] 23+ messages in thread
* 答复: [????] [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop
2026-06-18 7:48 ` [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop David Howells
2026-06-18 8:25 ` Oleg Nesterov
@ 2026-06-18 8:43 ` Li,Rongqing
1 sibling, 0 replies; 23+ messages in thread
From: Li,Rongqing @ 2026-06-18 8:43 UTC (permalink / raw)
To: David Howells, Christian Brauner
Cc: Marc Dionne, linux-afs@lists.infradead.org,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
Oleg Nesterov
> 主题: [????] [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup
> loop
I think this title is inaccurate
>
> This is an addendum to the patch to remove the erroneous seq |= 1 in volume
> lookup loop.
>
> Switch to using scoped_seqlock_read() as suggested by Oleg Nesterov[1].
>
> Fixes: 32222f09782f ("afs: Apply server breaks to mmap'd files in the call
> processor")
And this Fixes is not needed due to the sixth patch
[Li,Rongqing]
> Signed-off-by: David Howells <dhowells@redhat.com>
> cc: Marc Dionne <marc.dionne@auristor.com>
> cc: Oleg Nesterov <oleg@redhat.com>
> cc: Li RongQing <lirongqing@baidu.com>
> cc: linux-afs@lists.infradead.org
> Link: https://lore.kernel.org/r/aifaeKvz3KemfzaS@redhat.com/ [1]
> ---
> fs/afs/callback.c | 9 +--------
> fs/afs/internal.h | 2 --
> 2 files changed, 1 insertion(+), 10 deletions(-)
>
> diff --git a/fs/afs/callback.c b/fs/afs/callback.c index
> 833ac3178ddc..dd7a407ea368 100644
> --- a/fs/afs/callback.c
> +++ b/fs/afs/callback.c
> @@ -113,16 +113,12 @@ static struct afs_volume
> *afs_lookup_volume_rcu(struct afs_cell *cell, {
> struct afs_volume *volume = NULL;
> struct rb_node *p;
> - int seq = 1;
>
> - for (;;) {
> + scoped_seqlock_read(&cell->volume_lock, ss_lock) {
> /* Unfortunately, rbtree walking doesn't give reliable results
> * under just the RCU read lock, so we have to check for
> * changes.
> */
> - seq++; /* 2 on the 1st/lockless path, otherwise odd */
> - read_seqbegin_or_lock(&cell->volume_lock, &seq);
> -
> p = rcu_dereference_raw(cell->volumes.rb_node);
> while (p) {
> volume = rb_entry(p, struct afs_volume, cell_node); @@ -138,11
> +134,8 @@ static struct afs_volume *afs_lookup_volume_rcu(struct afs_cell
> *cell,
>
> if (volume && afs_try_get_volume(volume,
> afs_volume_trace_get_callback))
> break;
> - if (!need_seqretry(&cell->volume_lock, seq))
> - break;
> }
>
> - done_seqretry(&cell->volume_lock, seq);
> return volume;
> }
>
> diff --git a/fs/afs/internal.h b/fs/afs/internal.h index
> 0b72a8566299..785c646856d7 100644
> --- a/fs/afs/internal.h
> +++ b/fs/afs/internal.h
> @@ -750,8 +750,6 @@ static inline void afs_vnode_set_cache(struct afs_vnode
> *vnode, { #ifdef CONFIG_AFS_FSCACHE
> vnode->netfs.cache = cookie;
> - if (cookie)
> - mapping_set_release_always(vnode->netfs.inode.i_mapping);
> #endif
> }
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v2 15/17] afs: Fix leak of ungot volume
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (13 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 14/17] afs: Remove erroneous seq |= 1 in volume lookup loop David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:48 ` [PATCH v2 16/17] afs: Fix missing NULL pointer check in afs_break_some_callbacks() David Howells
2026-06-18 7:49 ` [PATCH v2 17/17] afs: Fix vllist leak David Howells
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel, Deepakkumar Karn
Fix afs_lookup_volume_rcu() so that it doesn't leak a dying volume if
afs_try_get_volume() fails.
Fixes: 32222f09782f ("afs: Apply server breaks to mmap'd files in the call processor")
Closes: https://sashiko.dev/#/patchset/20260609081738.770127-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Deepakkumar Karn <dkarn@redhat.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/callback.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/fs/afs/callback.c b/fs/afs/callback.c
index dd7a407ea368..0035f51ce24a 100644
--- a/fs/afs/callback.c
+++ b/fs/afs/callback.c
@@ -134,6 +134,7 @@ static struct afs_volume *afs_lookup_volume_rcu(struct afs_cell *cell,
if (volume && afs_try_get_volume(volume, afs_volume_trace_get_callback))
break;
+ volume = NULL;
}
return volume;
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 16/17] afs: Fix missing NULL pointer check in afs_break_some_callbacks()
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (14 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 15/17] afs: Fix leak of ungot volume David Howells
@ 2026-06-18 7:48 ` David Howells
2026-06-18 7:49 ` [PATCH v2 17/17] afs: Fix vllist leak David Howells
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:48 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel
Fix afs_break_some_callbacks() to check to see if afs_lookup_volume_rcu()
returned NULL (e.g. the specified volume is unknown).
Fixes: 8230fd8217b7 ("afs: Make callback processing more efficient.")
Closes: https://sashiko.dev/#/patchset/20260609081738.770127-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/callback.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/afs/callback.c b/fs/afs/callback.c
index 0035f51ce24a..03a66d7033ef 100644
--- a/fs/afs/callback.c
+++ b/fs/afs/callback.c
@@ -214,7 +214,9 @@ static void afs_break_some_callbacks(struct afs_server *server,
rcu_read_lock();
volume = afs_lookup_volume_rcu(server->cell, vid);
- if (cbb->fid.vnode == 0 && cbb->fid.unique == 0) {
+ if (!volume) {
+ /* Ignore breaks on unknown volumes. */
+ } else if (cbb->fid.vnode == 0 && cbb->fid.unique == 0) {
afs_break_volume_callback(server, volume);
*_count -= 1;
if (*_count)
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v2 17/17] afs: Fix vllist leak
2026-06-18 7:48 [PATCH v2 00/17] afs: Miscellaneous fixes David Howells
` (15 preceding siblings ...)
2026-06-18 7:48 ` [PATCH v2 16/17] afs: Fix missing NULL pointer check in afs_break_some_callbacks() David Howells
@ 2026-06-18 7:49 ` David Howells
16 siblings, 0 replies; 23+ messages in thread
From: David Howells @ 2026-06-18 7:49 UTC (permalink / raw)
To: Christian Brauner
Cc: David Howells, Marc Dionne, linux-afs, linux-fsdevel,
linux-kernel
Fix a leak of the new vllist in afs_update_cell() in the event that it is an
empty list (nr_servers == 0), in which case the old list isn't displaced
unless the old list is also empty.
Fixes: d5c32c89b208 ("afs: Fix cell DNS lookup")
Closes: https://sashiko.dev/#/patchset/20260609081738.770127-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
---
fs/afs/cell.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/afs/cell.c b/fs/afs/cell.c
index e0fab1609f27..fbb8a43aa7cd 100644
--- a/fs/afs/cell.c
+++ b/fs/afs/cell.c
@@ -547,6 +547,8 @@ static int afs_update_cell(struct afs_cell *cell)
rcu_assign_pointer(cell->vl_servers, vllist);
cell->dns_source = vllist->source;
old = p;
+ } else {
+ old = vllist;
}
write_unlock(&cell->vl_servers_lock);
afs_put_vlserverlist(cell->net, old);
^ permalink raw reply related [flat|nested] 23+ messages in thread