All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] fix removal of nfsd listeners
@ 2025-01-15 23:24 Olga Kornievskaia
  2025-01-15 23:24 ` [PATCH 1/3] llist: add ability to remove a particular entry from the list Olga Kornievskaia
                   ` (3 more replies)
  0 siblings, 4 replies; 20+ messages in thread
From: Olga Kornievskaia @ 2025-01-15 23:24 UTC (permalink / raw)
  To: chuck.lever, jlayton; +Cc: linux-nfs, Olga Kornievskaia

Currently if a root user using nfsdctl command tries to remove a particular
listener from the list of previously added ones, then starting the nfsd
leads to the following problem:

[  158.835354] refcount_t: addition on 0; use-after-free.
[  158.835603] WARNING: CPU: 2 PID: 9145 at lib/refcount.c:25 refcount_warn_saturate+0x160/0x1a0
[  158.836017] Modules linked in: rpcrdma rdma_cm iw_cm ib_cm ib_core nfsd auth_rpcgss nfs_acl lockd grace overlay isofs uinput snd_seq_dummy snd_hrtimer nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 rfkill ip_set nf_tables qrtr sunrpc vfat fat uvcvideo videobuf2_vmalloc videobuf2_memops uvc videobuf2_v4l2 videodev videobuf2_common snd_hda_codec_generic mc e1000e snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore sg loop dm_multipath dm_mod nfnetlink vsock_loopback vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vmw_vmci vsock xfs libcrc32c crct10dif_ce ghash_ce vmwgfx sha2_ce sha256_arm64 sr_mod sha1_ce cdrom nvme drm_client_lib drm_ttm_helper ttm nvme_core drm_kms_helper nvme_auth drm fuse
[  158.840093] CPU: 2 UID: 0 PID: 9145 Comm: nfsd Kdump: loaded Tainted: G    B   W          6.13.0-rc6+ #7
[  158.840624] Tainted: [B]=BAD_PAGE, [W]=WARN
[  158.840802] Hardware name: VMware, Inc. VMware20,1/VBSA, BIOS VMW201.00V.24006586.BA64.2406042154 06/04/2024
[  158.841220] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
[  158.841563] pc : refcount_warn_saturate+0x160/0x1a0
[  158.841780] lr : refcount_warn_saturate+0x160/0x1a0
[  158.842000] sp : ffff800089be7d80
[  158.842147] x29: ffff800089be7d80 x28: ffff00008e68c148 x27: ffff00008e68c148
[  158.842492] x26: ffff0002e3b5c000 x25: ffff600011cd1829 x24: ffff00008653c010
[  158.842832] x23: ffff00008653c000 x22: 1fffe00011cd1829 x21: ffff00008653c028
[  158.843175] x20: 0000000000000002 x19: ffff00008653c010 x18: 0000000000000000
[  158.843505] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
[  158.843836] x14: 0000000000000000 x13: 0000000000000001 x12: ffff600050a26493
[  158.844143] x11: 1fffe00050a26492 x10: ffff600050a26492 x9 : dfff800000000000
[  158.844475] x8 : 00009fffaf5d9b6e x7 : ffff000285132493 x6 : 0000000000000001
[  158.844823] x5 : ffff000285132490 x4 : ffff600050a26493 x3 : ffff8000805e72bc
[  158.845174] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000098588000
[  158.845528] Call trace:
[  158.845658]  refcount_warn_saturate+0x160/0x1a0 (P)
[  158.845894]  svc_recv+0x58c/0x680 [sunrpc]
[  158.846183]  nfsd+0x1fc/0x348 [nfsd]
[  158.846390]  kthread+0x274/0x2f8
[  158.846546]  ret_from_fork+0x10/0x20
[  158.846714] ---[ end trace 0000000000000000 ]---

nfsd_nl_listener_set_doit() would manipulate the list of transports of
server's sv_permsocks and svc_xprt_close() the specified listener but
the other list of transports (server's sp_xprts list) would not be
changed leading to the problem.

the other problem is that sp_xprt is a lwq structure of lockless
list which does not have an ability to remove a single entry from
the list.

this patch series addis a function to remove a single entry, then modifies
nfsd_nl_listener_set_doit() to make sure the to-be-removed listener is
removed from both lists and then it also ensures that the remaining
listeners are added back in the correct state.

Olga Kornievskaia (3):
  llist: add ability to remove a particular entry from the list
  SUNRPC: add ability to remove specific server transport
  nfsd: fix management of listener transports

 fs/nfsd/nfsctl.c           |  4 +++-
 include/linux/llist.h      | 36 ++++++++++++++++++++++++++++++++++++
 include/linux/sunrpc/svc.h |  1 +
 net/sunrpc/svc_xprt.c      | 11 +++++++++++
 4 files changed, 51 insertions(+), 1 deletion(-)

-- 
2.47.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2025-01-24  0:58 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-15 23:24 [PATCH 0/3] fix removal of nfsd listeners Olga Kornievskaia
2025-01-15 23:24 ` [PATCH 1/3] llist: add ability to remove a particular entry from the list Olga Kornievskaia
2025-01-16 14:26   ` Chuck Lever
2025-01-16 14:54     ` Olga Kornievskaia
2025-01-16 15:33       ` Chuck Lever
2025-01-16 15:42         ` Jeff Layton
2025-01-16 16:00           ` Chuck Lever
2025-01-16 16:31             ` Olga Kornievskaia
2025-01-16 16:44               ` Chuck Lever
2025-01-17  4:08   ` kernel test robot
2025-01-17  4:08   ` kernel test robot
2025-01-24  0:57   ` kernel test robot
2025-01-15 23:24 ` [PATCH 2/3] SUNRPC: add ability to remove specific server transport Olga Kornievskaia
2025-01-15 23:24 ` [PATCH 3/3] nfsd: fix management of listener transports Olga Kornievskaia
2025-01-16 14:27   ` Chuck Lever
2025-01-16 14:46     ` Jeff Layton
2025-01-16 14:55       ` Chuck Lever
2025-01-16 15:34         ` Olga Kornievskaia
2025-01-16 15:42           ` Chuck Lever
2025-01-16 11:53 ` [PATCH 0/3] fix removal of nfsd listeners Jeff Layton

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.