From patchwork Wed Sep 13 11:09:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 138862 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp1129476vqx; Wed, 13 Sep 2023 07:33:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE1WOPAx4FSwNCYoVoA5KAZgjS7tlBD243PkSyjn6k6r30nEETDSCGACsh216FS767Qjvw6 X-Received: by 2002:a54:4e93:0:b0:3a4:39e5:5c69 with SMTP id c19-20020a544e93000000b003a439e55c69mr2393401oiy.53.1694615637023; Wed, 13 Sep 2023 07:33:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694615636; cv=none; d=google.com; s=arc-20160816; b=P9t9Kx6ETRwVQeljXIbyCdhbvTGBeupy7cdNcgP0DB90XNQwe4lndha7hNcuxd1y3y XdgYPx+ymYnjKB/vYPXzJUSiDhdjTKx16EtViCPb0bPL/NnVxcDzlXuydlxxscBIyKsl k3ggw7HU4Lu8f+goR/PBSLuUHm1FChdlbvpPWeiSCgTemLohdjFrj1VSRX40NVN08jCR V3iOirqxxWOAfGT7Brj7P3ThuV21qY3LmCDF/xfJU4ZEszIg3q9yJFD41ehyzwV19j0B HsrUoAo66hRovIaeF91UP3HhIhqFfvtlBCL7rj8bulAVMkJ9eL18xlEBZ2sWETExQIFU joxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3avJL3u53FV6NqWfVNR/cHfMXbZSKZNFLdERG/9TrPo=; fh=BKhaubn3NgfOFdJuURkVVw5laQp2qzBZJf/ffKnJtu8=; b=pJdXgfQz8T1pEo+wUavxlgxq0eqQRSOl2W7EObIffoFcxZHfgu1A4m/6leFwjDbZ+t xau4zQtYmuBFFI3Gksdmns2Wm6285jM8VHS6tg/YCdKghC+LQ+/BZJekSb7XY+Pnnhn4 HpCgW7HPHnR6iDfu1ZTWrmEEZXBkodVlQO1cWw8QwmuUHu/T7jhxJYqSy2+TUefnjTk3 f1jnkbJRcNS2Eu8TqK3wt9BHldxw3FZItHDka6iKzrgCHjEH7+srOci4LQyRxPGjfCZ+ sZ93viQlE2gkXDmYAH0pFgRV8FouwxueBwNV4E15ofjAAPRoRx6GeCp6Bwx1eq9j8T67 G62g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=bombadil.20210309 header.b=AHb5SmSe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from pete.vger.email (pete.vger.email. [23.128.96.36]) by mx.google.com with ESMTPS id o12-20020a63fb0c000000b00564f4a7f70asi10244224pgh.412.2023.09.13.07.33.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Sep 2023 07:33:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) client-ip=23.128.96.36; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=bombadil.20210309 header.b=AHb5SmSe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id E607E82C9DBA; Wed, 13 Sep 2023 04:11:58 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240085AbjIMLLN (ORCPT + 36 others); Wed, 13 Sep 2023 07:11:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240007AbjIMLLK (ORCPT ); Wed, 13 Sep 2023 07:11:10 -0400 Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F4C31BCE; Wed, 13 Sep 2023 04:10:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=3avJL3u53FV6NqWfVNR/cHfMXbZSKZNFLdERG/9TrPo=; b=AHb5SmSeP1rGpHmMiLyXBAyBuz NjiS5PHlRkymtdfwux/qZCDQDIhM1N03z03eV/bhcgSRfsq1UoeSHVegcNUcwLYyYpypbVAoBw5+Y 7jrfAvyWIAwP9VDwES3HzHe7vUZ4D2v65qMImxcaTZkLU59GQG5cgWK4BG0rNV3hcWeLjgCrY53Kd y4AUawhEdkcUbSAxYjMGh9hxwzKpgPcnF/+a7grduzv0tLcl64dckW5I/thHtke5Pmn8d0yK5Ma/B 2kJitaOaVl4nuKta7Dg1FYZf+Ce2rkVt3h+ihx6AJyaeunVkBysmTk9TCJE4jZCzYV3+ZnRahYlvR hzrcqXfw==; Received: from [190.210.221.22] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.96 #2 (Red Hat Linux)) id 1qgNlR-005hvq-2K; Wed, 13 Sep 2023 11:10:34 +0000 From: Christoph Hellwig To: Christian Brauner , Al Viro Cc: Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Fenghua Yu , Reinette Chatre , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Dennis Dalessandro , Tejun Heo , Trond Myklebust , Anna Schumaker , Kees Cook , Damien Le Moal , Naohiro Aota , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org, linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org, linux-hardening@vger.kernel.org, cgroups@vger.kernel.org Subject: [PATCH 03/19] fs: release anon dev_t in deactivate_locked_super Date: Wed, 13 Sep 2023 08:09:57 -0300 Message-Id: <20230913111013.77623-4-hch@lst.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230913111013.77623-1-hch@lst.de> References: <20230913111013.77623-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Wed, 13 Sep 2023 04:11:59 -0700 (PDT) X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776933285886319725 X-GMAIL-MSGID: 1776933285886319725 Releasing an anon dev_t is a very common thing when freeing a super_block, as that's done for basically any not block based file system (modulo the odd mtd special case). So instead of requiring a special ->kill_sb helper and a lot of boilerplate in more complicated file systems, just release the anon dev_t in deactivate_locked_super if the super_block was using one. As the freeing is done after the main call to kill_super_notify, this removes the need for having two slightly different call sites for it. Signed-off-by: Christoph Hellwig Signed-off-by: Christian Brauner --- block/bdev.c | 1 - drivers/dax/super.c | 1 - drivers/dma-buf/dma-buf.c | 1 - drivers/gpu/drm/drm_drv.c | 1 - drivers/misc/cxl/api.c | 1 - drivers/scsi/cxlflash/ocxl_hw.c | 1 - fs/9p/vfs_super.c | 2 +- fs/afs/super.c | 2 +- fs/aio.c | 1 - fs/anon_inodes.c | 1 - fs/autofs/inode.c | 4 ++-- fs/btrfs/super.c | 3 ++- fs/btrfs/tests/btrfs-tests.c | 1 - fs/ceph/super.c | 2 +- fs/coda/inode.c | 1 - fs/ecryptfs/main.c | 3 ++- fs/erofs/super.c | 4 ++-- fs/fuse/inode.c | 2 +- fs/fuse/virtio_fs.c | 2 +- fs/hostfs/hostfs_kern.c | 2 +- fs/kernfs/mount.c | 2 +- fs/nfs/super.c | 2 +- fs/nsfs.c | 1 - fs/openpromfs/inode.c | 1 - fs/orangefs/super.c | 2 +- fs/overlayfs/super.c | 1 - fs/pipe.c | 1 - fs/proc/root.c | 4 ++-- fs/smb/client/cifsfs.c | 2 +- fs/super.c | 22 ++++++++-------------- fs/ubifs/super.c | 3 ++- fs/vboxsf/super.c | 1 - include/linux/fs.h | 1 - kernel/resource.c | 1 - mm/secretmem.c | 1 - net/socket.c | 1 - security/apparmor/apparmorfs.c | 1 - 37 files changed, 30 insertions(+), 53 deletions(-) diff --git a/block/bdev.c b/block/bdev.c index f3b13aa1b7d428..9db691401497bb 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -358,7 +358,6 @@ static int bd_init_fs_context(struct fs_context *fc) static struct file_system_type bd_type = { .name = "bdev", .init_fs_context = bd_init_fs_context, - .kill_sb = kill_anon_super, }; struct super_block *blockdev_superblock __read_mostly; diff --git a/drivers/dax/super.c b/drivers/dax/super.c index 0da9232ea1754b..a9315b7396e68a 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -397,7 +397,6 @@ static int dax_init_fs_context(struct fs_context *fc) static struct file_system_type dax_fs_type = { .name = "dax", .init_fs_context = dax_init_fs_context, - .kill_sb = kill_anon_super, }; static int dax_test(struct inode *inode, void *data) diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 21916bba77d58b..7313e99f6e8ea5 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -125,7 +125,6 @@ static int dma_buf_fs_init_context(struct fs_context *fc) static struct file_system_type dma_buf_fs_type = { .name = "dmabuf", .init_fs_context = dma_buf_fs_init_context, - .kill_sb = kill_anon_super, }; static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma) diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 3eda026ffac6a9..83676229cbe233 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -530,7 +530,6 @@ static struct file_system_type drm_fs_type = { .name = "drm", .owner = THIS_MODULE, .init_fs_context = drm_fs_init_fs_context, - .kill_sb = kill_anon_super, }; static struct inode *drm_fs_inode_new(void) diff --git a/drivers/misc/cxl/api.c b/drivers/misc/cxl/api.c index d85c5653086357..05b40076a0b481 100644 --- a/drivers/misc/cxl/api.c +++ b/drivers/misc/cxl/api.c @@ -44,7 +44,6 @@ static struct file_system_type cxl_fs_type = { .name = "cxl", .owner = THIS_MODULE, .init_fs_context = cxl_fs_init_fs_context, - .kill_sb = kill_anon_super, }; diff --git a/drivers/scsi/cxlflash/ocxl_hw.c b/drivers/scsi/cxlflash/ocxl_hw.c index 6542818e595a64..20f22610b104df 100644 --- a/drivers/scsi/cxlflash/ocxl_hw.c +++ b/drivers/scsi/cxlflash/ocxl_hw.c @@ -43,7 +43,6 @@ static struct file_system_type ocxlflash_fs_type = { .name = "ocxlflash", .owner = THIS_MODULE, .init_fs_context = ocxlflash_fs_init_fs_context, - .kill_sb = kill_anon_super, }; /* diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 73db55c050bf10..9e60eddf5179ed 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c @@ -217,7 +217,7 @@ static void v9fs_kill_super(struct super_block *s) p9_debug(P9_DEBUG_VFS, " %p\n", s); - kill_anon_super(s); + generic_shutdown_super(s); v9fs_session_cancel(v9ses); v9fs_session_close(v9ses); diff --git a/fs/afs/super.c b/fs/afs/super.c index 95d713074dc813..754b9828233497 100644 --- a/fs/afs/super.c +++ b/fs/afs/super.c @@ -544,7 +544,7 @@ static void afs_kill_super(struct super_block *sb) */ if (as->volume) rcu_assign_pointer(as->volume->sb, NULL); - kill_anon_super(sb); + generic_shutdown_super(sb); if (as->volume) afs_deactivate_volume(as->volume); afs_destroy_sbi(as); diff --git a/fs/aio.c b/fs/aio.c index a4c2a6bac72ce9..de56e4a880debe 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -293,7 +293,6 @@ static int __init aio_setup(void) static struct file_system_type aio_fs = { .name = "aio", .init_fs_context = aio_init_fs_context, - .kill_sb = kill_anon_super, }; aio_mnt = kern_mount(&aio_fs); if (IS_ERR(aio_mnt)) diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 24192a7667edf7..9c670bbe0f62ce 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -52,7 +52,6 @@ static int anon_inodefs_init_fs_context(struct fs_context *fc) static struct file_system_type anon_inode_fs_type = { .name = "anon_inodefs", .init_fs_context = anon_inodefs_init_fs_context, - .kill_sb = kill_anon_super, }; static struct inode *anon_inode_make_secure_inode( diff --git a/fs/autofs/inode.c b/fs/autofs/inode.c index 2b49662ed237de..c3b64799155840 100644 --- a/fs/autofs/inode.c +++ b/fs/autofs/inode.c @@ -44,7 +44,7 @@ void autofs_kill_sb(struct super_block *sb) /* * In the event of a failure in get_sb_nodev the superblock * info is not present so nothing else has been setup, so - * just call kill_anon_super when we are called from + * just call generic_shutdown_super when we are called from * deactivate_super. */ if (sbi) { @@ -54,7 +54,7 @@ void autofs_kill_sb(struct super_block *sb) } pr_debug("shutting down\n"); - kill_litter_super(sb); + generic_shutdown_super(sb); if (sbi) kfree_rcu(sbi, rcu); } diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 09bfe68d2ea3fc..01b86bd4eae8dc 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -2141,7 +2141,8 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) static void btrfs_kill_super(struct super_block *sb) { struct btrfs_fs_info *fs_info = btrfs_sb(sb); - kill_anon_super(sb); + + generic_shutdown_super(sb); btrfs_free_fs_info(fs_info); } diff --git a/fs/btrfs/tests/btrfs-tests.c b/fs/btrfs/tests/btrfs-tests.c index ca09cf9afce800..c30280376fc32e 100644 --- a/fs/btrfs/tests/btrfs-tests.c +++ b/fs/btrfs/tests/btrfs-tests.c @@ -48,7 +48,6 @@ static int btrfs_test_init_fs_context(struct fs_context *fc) static struct file_system_type test_type = { .name = "btrfs_test_fs", .init_fs_context = btrfs_test_init_fs_context, - .kill_sb = kill_anon_super, }; struct inode *btrfs_new_test_inode(void) diff --git a/fs/ceph/super.c b/fs/ceph/super.c index 2d7f5a8d4a9260..7feef0b35b97b5 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c @@ -1557,7 +1557,7 @@ static void ceph_kill_sb(struct super_block *s) } mdsc->stopping = CEPH_MDSC_STOPPING_FLUSHED; - kill_anon_super(s); + generic_shutdown_super(s); fsc->client->extra_mon_dispatch = NULL; ceph_fs_debugfs_cleanup(fsc); diff --git a/fs/coda/inode.c b/fs/coda/inode.c index 0c7c2528791ebc..2d4ee3c7e8654b 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c @@ -325,7 +325,6 @@ struct file_system_type coda_fs_type = { .owner = THIS_MODULE, .name = "coda", .mount = coda_mount, - .kill_sb = kill_anon_super, .fs_flags = FS_BINARY_MOUNTDATA, }; MODULE_ALIAS_FS("coda"); diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 2dc927ba067fec..d99b2311759166 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -625,7 +625,8 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags static void ecryptfs_kill_block_super(struct super_block *sb) { struct ecryptfs_sb_info *sb_info = ecryptfs_superblock_to_private(sb); - kill_anon_super(sb); + + generic_shutdown_super(sb); if (!sb_info) return; ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat); diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 44a24d573f1fd3..07c36ccf454e53 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -878,12 +878,12 @@ static void erofs_kill_sb(struct super_block *sb) /* pseudo mount for anon inodes */ if (sb->s_flags & SB_KERNMOUNT) { - kill_anon_super(sb); + generic_shutdown_super(sb); return; } if (erofs_is_fscache_mode(sb)) - kill_anon_super(sb); + generic_shutdown_super(sb); else kill_block_super(sb); diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 2e4eb7cf26fb33..42523edb32fd53 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -1840,7 +1840,7 @@ EXPORT_SYMBOL(fuse_mount_destroy); static void fuse_kill_sb_anon(struct super_block *sb) { fuse_sb_destroy(sb); - kill_anon_super(sb); + generic_shutdown_super(sb); fuse_mount_destroy(get_fuse_mount_super(sb)); } diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c index 5f1be1da92ce94..0a0d593e5a9c79 100644 --- a/fs/fuse/virtio_fs.c +++ b/fs/fuse/virtio_fs.c @@ -1398,7 +1398,7 @@ static void virtio_kill_sb(struct super_block *sb) if (last) virtio_fs_conn_destroy(fm); } - kill_anon_super(sb); + generic_shutdown_super(sb); fuse_mount_destroy(fm); } diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index dc5a5cea5fae41..97f3c9709418c9 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -981,7 +981,7 @@ static struct dentry *hostfs_read_sb(struct file_system_type *type, static void hostfs_kill_sb(struct super_block *s) { - kill_anon_super(s); + generic_shutdown_super(s); kfree(s->s_fs_info); } diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c index c4bf26142eec9b..772d059d4054ec 100644 --- a/fs/kernfs/mount.c +++ b/fs/kernfs/mount.c @@ -399,7 +399,7 @@ void kernfs_kill_sb(struct super_block *sb) * Remove the superblock from fs_supers/s_instances * so we can't find it, before freeing kernfs_super_info. */ - kill_anon_super(sb); + generic_shutdown_super(sb); kfree(info); } diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 0d6473cb00cb3e..29d6a55b9d400d 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1341,7 +1341,7 @@ void nfs_kill_super(struct super_block *s) struct nfs_server *server = NFS_SB(s); nfs_sysfs_move_sb_to_server(server); - kill_anon_super(s); + generic_shutdown_super(s); nfs_fscache_release_super_cookie(s); diff --git a/fs/nsfs.c b/fs/nsfs.c index 647a22433bd8a9..d5fb7c00fe21f1 100644 --- a/fs/nsfs.c +++ b/fs/nsfs.c @@ -277,7 +277,6 @@ static int nsfs_init_fs_context(struct fs_context *fc) static struct file_system_type nsfs = { .name = "nsfs", .init_fs_context = nsfs_init_fs_context, - .kill_sb = kill_anon_super, }; void __init nsfs_init(void) diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index b2457cb97fa008..3b51dd926d11c8 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c @@ -427,7 +427,6 @@ static struct file_system_type openprom_fs_type = { .owner = THIS_MODULE, .name = "openpromfs", .init_fs_context = openpromfs_init_fs_context, - .kill_sb = kill_anon_super, }; MODULE_ALIAS_FS("openpromfs"); diff --git a/fs/orangefs/super.c b/fs/orangefs/super.c index 5254256a224d7a..42cb3e9b1effee 100644 --- a/fs/orangefs/super.c +++ b/fs/orangefs/super.c @@ -602,7 +602,7 @@ void orangefs_kill_sb(struct super_block *sb) gossip_debug(GOSSIP_SUPER_DEBUG, "orangefs_kill_sb: called\n"); /* provided sb cleanup */ - kill_anon_super(sb); + generic_shutdown_super(sb); if (!ORANGEFS_SB(sb)) { mutex_lock(&orangefs_request_mutex); diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index def266b5e2a33b..194cf18787496d 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -1507,7 +1507,6 @@ struct file_system_type ovl_fs_type = { .init_fs_context = ovl_init_fs_context, .parameters = ovl_parameter_spec, .fs_flags = FS_USERNS_MOUNT, - .kill_sb = kill_anon_super, }; MODULE_ALIAS_FS("overlay"); diff --git a/fs/pipe.c b/fs/pipe.c index 6c1a9b1db9076c..858e8b19d78527 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1439,7 +1439,6 @@ static int pipefs_init_fs_context(struct fs_context *fc) static struct file_system_type pipe_fs_type = { .name = "pipefs", .init_fs_context = pipefs_init_fs_context, - .kill_sb = kill_anon_super, }; #ifdef CONFIG_SYSCTL diff --git a/fs/proc/root.c b/fs/proc/root.c index 9191248f2dacb4..2282366449ac0b 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -262,14 +262,14 @@ static void proc_kill_sb(struct super_block *sb) struct proc_fs_info *fs_info = proc_sb_info(sb); if (!fs_info) { - kill_anon_super(sb); + generic_shutdown_super(sb); return; } dput(fs_info->proc_self); dput(fs_info->proc_thread_self); - kill_anon_super(sb); + generic_shutdown_super(sb); put_pid_ns(fs_info->pid_ns); kfree(fs_info); } diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index 22869cda13565e..fb792acffeca37 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -302,7 +302,7 @@ static void cifs_kill_sb(struct super_block *sb) cifs_sb->root = NULL; } - kill_anon_super(sb); + generic_shutdown_super(sb); cifs_umount(cifs_sb); } diff --git a/fs/super.c b/fs/super.c index ab234e6af48605..bbe55f0651cca4 100644 --- a/fs/super.c +++ b/fs/super.c @@ -438,10 +438,6 @@ static void kill_super_notify(struct super_block *sb) { lockdep_assert_not_held(&sb->s_umount); - /* already notified earlier */ - if (sb->s_flags & SB_DEAD) - return; - /* * Remove it from @fs_supers so it isn't found by new * sget{_fc}() walkers anymore. Any concurrent mounter still @@ -491,6 +487,13 @@ void deactivate_locked_super(struct super_block *s) kill_super_notify(s); + /* + * If the super_block was using an anon dev_t, release it now that we've + * notified everyone that the super_block is going away. + */ + if (s->s_dev && MAJOR(s->s_dev) == 0) + free_anon_bdev(s->s_dev); + /* * Since list_lru_destroy() may sleep, we cannot call it from * put_super(), where we hold the sb_lock. Therefore we destroy @@ -1291,20 +1294,11 @@ int set_anon_super(struct super_block *s, void *data) } EXPORT_SYMBOL(set_anon_super); -void kill_anon_super(struct super_block *sb) -{ - dev_t dev = sb->s_dev; - generic_shutdown_super(sb); - kill_super_notify(sb); - free_anon_bdev(dev); -} -EXPORT_SYMBOL(kill_anon_super); - void kill_litter_super(struct super_block *sb) { if (sb->s_root) d_genocide(sb->s_root); - kill_anon_super(sb); + generic_shutdown_super(sb); } EXPORT_SYMBOL(kill_litter_super); diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index b08fb28d16b55b..6527175591a729 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -2350,7 +2350,8 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags, static void kill_ubifs_super(struct super_block *s) { struct ubifs_info *c = s->s_fs_info; - kill_anon_super(s); + + generic_shutdown_super(s); kfree(c); } diff --git a/fs/vboxsf/super.c b/fs/vboxsf/super.c index 1fb8f4df60cbb3..aa7e627bf9bd4b 100644 --- a/fs/vboxsf/super.c +++ b/fs/vboxsf/super.c @@ -450,7 +450,6 @@ static struct file_system_type vboxsf_fs_type = { .owner = THIS_MODULE, .name = "vboxsf", .init_fs_context = vboxsf_init_fs_context, - .kill_sb = kill_anon_super }; /* Module initialization/finalization handlers */ diff --git a/include/linux/fs.h b/include/linux/fs.h index 4aeb3fa1192771..129b8c0c83960b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2382,7 +2382,6 @@ extern struct dentry *mount_subtree(struct vfsmount *mnt, const char *path); void retire_super(struct super_block *sb); void generic_shutdown_super(struct super_block *sb); void kill_block_super(struct super_block *sb); -void kill_anon_super(struct super_block *sb); void kill_litter_super(struct super_block *sb); void deactivate_super(struct super_block *sb); void deactivate_locked_super(struct super_block *sb); diff --git a/kernel/resource.c b/kernel/resource.c index b1763b2fd7ef3e..fde412517ef0cc 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -1979,7 +1979,6 @@ static struct file_system_type iomem_fs_type = { .name = "iomem", .owner = THIS_MODULE, .init_fs_context = iomem_fs_init_fs_context, - .kill_sb = kill_anon_super, }; static int __init iomem_init_inode(void) diff --git a/mm/secretmem.c b/mm/secretmem.c index 3afb5ad701e14a..74e1cdb1317cd7 100644 --- a/mm/secretmem.c +++ b/mm/secretmem.c @@ -275,7 +275,6 @@ static int secretmem_init_fs_context(struct fs_context *fc) static struct file_system_type secretmem_fs = { .name = "secretmem", .init_fs_context = secretmem_init_fs_context, - .kill_sb = kill_anon_super, }; static int __init secretmem_init(void) diff --git a/net/socket.c b/net/socket.c index c8b08b32f097ec..a137b08a7d94d1 100644 --- a/net/socket.c +++ b/net/socket.c @@ -425,7 +425,6 @@ static struct vfsmount *sock_mnt __read_mostly; static struct file_system_type sock_fs_type = { .name = "sockfs", .init_fs_context = sockfs_init_fs_context, - .kill_sb = kill_anon_super, }; /* diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c index bd6a910f65282a..eceb5443842cdf 100644 --- a/security/apparmor/apparmorfs.c +++ b/security/apparmor/apparmorfs.c @@ -198,7 +198,6 @@ static struct file_system_type aafs_ops = { .owner = THIS_MODULE, .name = AAFS_NAME, .init_fs_context = apparmorfs_init_fs_context, - .kill_sb = kill_anon_super, }; /**