| From 1d625050c7c2dd877e108e382b8aaf1ae3cfe1f4 Mon Sep 17 00:00:00 2001 |
| From: Patrick Ho <Patrick.Ho@netapp.com> |
| Date: Sat, 21 Aug 2021 02:56:26 -0400 |
| Subject: nfsd: fix error handling of register_pernet_subsys() in init_nfsd() |
| |
| From: Patrick Ho <Patrick.Ho@netapp.com> |
| |
| commit 1d625050c7c2dd877e108e382b8aaf1ae3cfe1f4 upstream. |
| |
| init_nfsd() should not unregister pernet subsys if the register fails |
| but should instead unwind from the last successful operation which is |
| register_filesystem(). |
| |
| Unregistering a failed register_pernet_subsys() call can result in |
| a kernel GPF as revealed by programmatically injecting an error in |
| register_pernet_subsys(). |
| |
| Verified the fix handled failure gracefully with no lingering nfsd |
| entry in /proc/filesystems. This change was introduced by the commit |
| bd5ae9288d64 ("nfsd: register pernet ops last, unregister first"), |
| the original error handling logic was correct. |
| |
| Fixes: bd5ae9288d64 ("nfsd: register pernet ops last, unregister first") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Patrick Ho <Patrick.Ho@netapp.com> |
| Acked-by: J. Bruce Fields <bfields@redhat.com> |
| Signed-off-by: Chuck Lever <chuck.lever@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/nfsd/nfsctl.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/nfsd/nfsctl.c |
| +++ b/fs/nfsd/nfsctl.c |
| @@ -1547,7 +1547,7 @@ static int __init init_nfsd(void) |
| goto out_free_all; |
| return 0; |
| out_free_all: |
| - unregister_pernet_subsys(&nfsd_net_ops); |
| + unregister_filesystem(&nfsd_fs_type); |
| out_free_exports: |
| remove_proc_entry("fs/nfs/exports", NULL); |
| remove_proc_entry("fs/nfs", NULL); |