All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heming Zhao <heming.zhao@suse.com>
To: Cen Zhang <zzzccc427@gmail.com>
Cc: mark@fasheh.com, jlbec@evilplan.org, joseph.qi@linux.alibaba.com,
	 akpm@linux-foundation.org, kmehltretter@gmail.com,
	ericterminal@gmail.com, kees@kernel.org,
	 sunil.mushran@oracle.com, christophe.jaillet@wanadoo.fr,
	ocfs2-devel@lists.linux.dev,  linux-kernel@vger.kernel.org,
	baijiaju1990@gmail.com, jjzuming@gmail.com
Subject: Re: [PATCH] ocfs2: Pin the node manager module for open debugfs files
Date: Mon, 12 Oct 2026 14:02:24 +0800	[thread overview]
Message-ID: <asx3pAlqeVkKNRfB@p15> (raw)
In-Reply-To: <pm-ocfs2-objects-candidate-0089-v2-4c67f48d4e2d0fc85990@gmail.com>

On Mon, Oct 12, 2026 at 09:31:38AM +0800, Cen Zhang wrote:
> The node manager debugfs file operation tables do not set owner.
> The debugfs full proxy obtains real_fops with fops_get() at open and
> keeps it until final release. Without an owner, this does not acquire
> a module reference. Normal unload can free the ocfs2_nodemanager
> module image while an open file still holds its operation table.
> 
> Closing connected_nodes then makes full_proxy_release() read
> real_fops->release from freed module memory. Removing the debugfs
> entries during module exit does not drain retained open files.
> 
> Set owner to THIS_MODULE in the o2net and heartbeat debugfs operation
> tables. The existing debugfs get/put pair then keeps the module and
> its callbacks alive until the last open file is released.
> 
> A controlled test used an unloadable OCFS2 module and case-local probe
> filters without changing the candidate open, unload or release logic.
> Closing a retained connected_nodes file after normal unload produced:
> 
>   BUG: unable to handle page fault for address: fffffbfff804cfef
>   Oops: Oops: 0000 [#1] SMP KASAN NOPTI
>   RIP: 0010:full_proxy_release+0xbf/0x190
>   Call Trace:
>    <TASK>
>    __fput+0x39a/0xa60
>    fput_close_sync+0xff/0x200
>    __x64_sys_close+0x8c/0xf0
>    do_syscall_64+0x114/0x620
>    entry_SYSCALL_64_after_hwframe+0x77/0x7f
>    </TASK>
>   Modules linked in: [last unloaded: ocfs2_nodemanager]
> 
> Fixes: 2309e9e040fe ("ocfs2/net: Add debug interface to o2net")
> Fixes: 87d3d3f3931f ("ocfs2/hb: Expose the list of heartbeating nodes via debugfs")
> Fixes: 3ba169ccec1c ("ocfs2/cluster: Add new function o2net_fill_node_map()")
> Assisted-by: LLM
> Signed-off-by: Cen Zhang <zzzccc427@gmail.com>


Thanks for spotting this. I applied the same test to 
/sys/kernel/debug/ocfs2/<id>/fs_state and confirmed the same issue.
It looks like all debugfs ops in ocfs2 are missing .owner.
Would you have time to check and fix them?

Thanks,
Heming
> ---
> diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c
> index 8e6ead433228..1d4f71190d27 100644
> --- a/fs/ocfs2/cluster/heartbeat.c
> +++ b/fs/ocfs2/cluster/heartbeat.c
> @@ -1447,6 +1447,7 @@ static ssize_t o2hb_debug_read(struct file *file, char __user *buf,
>  #endif  /* CONFIG_DEBUG_FS */
>  
>  static const struct file_operations o2hb_debug_fops = {
> +	.owner = THIS_MODULE,
>  	.open =		o2hb_debug_open,
>  	.release =	o2hb_debug_release,
>  	.read =		o2hb_debug_read,
> diff --git a/fs/ocfs2/cluster/netdebug.c b/fs/ocfs2/cluster/netdebug.c
> index f7ab66e70799..5d373002297d 100644
> --- a/fs/ocfs2/cluster/netdebug.c
> +++ b/fs/ocfs2/cluster/netdebug.c
> @@ -183,6 +183,7 @@ static int nst_fop_release(struct inode *inode, struct file *file)
>  }
>  
>  static const struct file_operations nst_seq_fops = {
> +	.owner = THIS_MODULE,
>  	.open = nst_fop_open,
>  	.read = seq_read,
>  	.llseek = seq_lseek,
> @@ -415,6 +416,7 @@ static int stats_fop_open(struct inode *inode, struct file *file)
>  }
>  
>  static const struct file_operations stats_seq_fops = {
> +	.owner = THIS_MODULE,
>  	.open = stats_fop_open,
>  	.read = seq_read,
>  	.llseek = seq_lseek,
> @@ -427,6 +429,7 @@ static int sc_fop_open(struct inode *inode, struct file *file)
>  }
>  
>  static const struct file_operations sc_seq_fops = {
> +	.owner = THIS_MODULE,
>  	.open = sc_fop_open,
>  	.read = seq_read,
>  	.llseek = seq_lseek,
> @@ -476,6 +479,7 @@ static ssize_t o2net_debug_read(struct file *file, char __user *buf,
>  }
>  
>  static const struct file_operations nodes_fops = {
> +	.owner		= THIS_MODULE,
>  	.open		= nodes_fop_open,
>  	.release	= o2net_debug_release,
>  	.read		= o2net_debug_read,

  reply	other threads:[~2026-10-12  6:02 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-12  1:31 [PATCH] ocfs2: Pin the node manager module for open debugfs files Cen Zhang
2026-10-12  6:02 ` Heming Zhao [this message]
2026-10-12 12:01   ` Cen Zhang

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=asx3pAlqeVkKNRfB@p15 \
    --to=heming.zhao@suse.com \
    --cc=akpm@linux-foundation.org \
    --cc=baijiaju1990@gmail.com \
    --cc=christophe.jaillet@wanadoo.fr \
    --cc=ericterminal@gmail.com \
    --cc=jjzuming@gmail.com \
    --cc=jlbec@evilplan.org \
    --cc=joseph.qi@linux.alibaba.com \
    --cc=kees@kernel.org \
    --cc=kmehltretter@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark@fasheh.com \
    --cc=ocfs2-devel@lists.linux.dev \
    --cc=sunil.mushran@oracle.com \
    --cc=zzzccc427@gmail.com \
    /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 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.