From patchwork Wed Oct 9 11:30:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181021 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 58521912 for ; Wed, 9 Oct 2019 11:30:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 41F4F2133F for ; Wed, 9 Oct 2019 11:30:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725848AbfJILaR (ORCPT ); Wed, 9 Oct 2019 07:30:17 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33301 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725962AbfJILaR (ORCPT ); Wed, 9 Oct 2019 07:30:17 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BZAQBjw51d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBESWJeIUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcTgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgIBQImAgJHEAYThRmvcnV/MxqKLIEMKIFlikF4gQeBRIMdh1KCWASPNDeGPEOWWYIslTQMjhUDixwtqUeBek0uCjuCbFCBfxeOMGeOQCqCKgEB X-IPAS-Result: A2BZAQBjw51d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBESWJeIUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcTgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgIBQImAgJHEAYThRmvcnV/MxqKLIEMKIFlikF4gQeBRIMdh1KCWASPNDeGPEOWWYIslTQMjhUDixwtqUeBek0uCjuCbFCBfxeOMGeOQCqCKgEB X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216228960" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:16 +0800 Subject: [PATCH v5 01/17] vfs: Create fs_context-aware mount_bdev() replacement From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:16 +0800 Message-ID: <157062061592.32346.16071223118598694422.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: David Howells Create a function, get_tree_bdev(), that is fs_context-aware and a ->get_tree() counterpart of mount_bdev(). It caches the block device pointer in the fs_context struct so that this information can be passed into sget_fc()'s test and set functions. Signed-off-by: David Howells cc: Jens Axboe cc: linux-block@vger.kernel.org Signed-off-by: Al Viro --- fs/super.c | 94 ++++++++++++++++++++++++++++++++++++++++++++ include/linux/fs_context.h | 5 ++ 2 files changed, 99 insertions(+) diff --git a/fs/super.c b/fs/super.c index 113c58f19425..a7f62c964e58 100644 --- a/fs/super.c +++ b/fs/super.c @@ -1215,6 +1215,7 @@ int get_tree_single(struct fs_context *fc, EXPORT_SYMBOL(get_tree_single); #ifdef CONFIG_BLOCK + static int set_bdev_super(struct super_block *s, void *data) { s->s_bdev = data; @@ -1224,6 +1225,99 @@ static int set_bdev_super(struct super_block *s, void *data) return 0; } +static int set_bdev_super_fc(struct super_block *s, struct fs_context *fc) +{ + return set_bdev_super(s, fc->sget_key); +} + +static int test_bdev_super_fc(struct super_block *s, struct fs_context *fc) +{ + return s->s_bdev == fc->sget_key; +} + +/** + * get_tree_bdev - Get a superblock based on a single block device + * @fc: The filesystem context holding the parameters + * @fill_super: Helper to initialise a new superblock + */ +int get_tree_bdev(struct fs_context *fc, + int (*fill_super)(struct super_block *, + struct fs_context *)) +{ + struct block_device *bdev; + struct super_block *s; + fmode_t mode = FMODE_READ | FMODE_EXCL; + int error = 0; + + if (!(fc->sb_flags & SB_RDONLY)) + mode |= FMODE_WRITE; + + if (!fc->source) + return invalf(fc, "No source specified"); + + bdev = blkdev_get_by_path(fc->source, mode, fc->fs_type); + if (IS_ERR(bdev)) { + errorf(fc, "%s: Can't open blockdev", fc->source); + return PTR_ERR(bdev); + } + + /* Once the superblock is inserted into the list by sget_fc(), s_umount + * will protect the lockfs code from trying to start a snapshot while + * we are mounting + */ + mutex_lock(&bdev->bd_fsfreeze_mutex); + if (bdev->bd_fsfreeze_count > 0) { + mutex_unlock(&bdev->bd_fsfreeze_mutex); + warnf(fc, "%pg: Can't mount, blockdev is frozen", bdev); + return -EBUSY; + } + + fc->sb_flags |= SB_NOSEC; + fc->sget_key = bdev; + s = sget_fc(fc, test_bdev_super_fc, set_bdev_super_fc); + mutex_unlock(&bdev->bd_fsfreeze_mutex); + if (IS_ERR(s)) + return PTR_ERR(s); + + if (s->s_root) { + /* Don't summarily change the RO/RW state. */ + if ((fc->sb_flags ^ s->s_flags) & SB_RDONLY) { + warnf(fc, "%pg: Can't mount, would change RO state", bdev); + deactivate_locked_super(s); + blkdev_put(bdev, mode); + return -EBUSY; + } + + /* + * s_umount nests inside bd_mutex during + * __invalidate_device(). blkdev_put() acquires + * bd_mutex and can't be called under s_umount. Drop + * s_umount temporarily. This is safe as we're + * holding an active reference. + */ + up_write(&s->s_umount); + blkdev_put(bdev, mode); + down_write(&s->s_umount); + } else { + s->s_mode = mode; + snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev); + sb_set_blocksize(s, block_size(bdev)); + error = fill_super(s, fc); + if (error) { + deactivate_locked_super(s); + return error; + } + + s->s_flags |= SB_ACTIVE; + bdev->bd_super = s; + } + + BUG_ON(fc->root); + fc->root = dget(s->s_root); + return 0; +} +EXPORT_SYMBOL(get_tree_bdev); + static int test_bdev_super(struct super_block *s, void *data) { return (void *)s->s_bdev == data; diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h index 7c6fe3d47fa6..7bf6179a83fd 100644 --- a/include/linux/fs_context.h +++ b/include/linux/fs_context.h @@ -88,6 +88,7 @@ struct fs_context { struct mutex uapi_mutex; /* Userspace access mutex */ struct file_system_type *fs_type; void *fs_private; /* The filesystem's context */ + void *sget_key; struct dentry *root; /* The root and superblock */ struct user_namespace *user_ns; /* The user namespace for this mount */ struct net *net_ns; /* The network namespace for this mount */ @@ -154,6 +155,10 @@ extern int get_tree_single(struct fs_context *fc, int (*fill_super)(struct super_block *sb, struct fs_context *fc)); +extern int get_tree_bdev(struct fs_context *fc, + int (*fill_super)(struct super_block *sb, + struct fs_context *fc)); + extern const struct file_operations fscontext_fops; /* From patchwork Wed Oct 9 11:30:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181023 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E3CAB912 for ; Wed, 9 Oct 2019 11:30:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C38C521721 for ; Wed, 9 Oct 2019 11:30:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727657AbfJILaX (ORCPT ); Wed, 9 Oct 2019 07:30:23 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33301 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725962AbfJILaX (ORCPT ); Wed, 9 Oct 2019 07:30:23 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BYAQBjw51d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7iF2PKAEBAQMGgRGKHYUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcTgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBoUsr3J1fzMaiiyBDCiBZYpBeIEHgUSDHYQNg0WCWASPNDeGPEOWWYIslTQMjhUDixwtqUeBek0uCoMoT5BGjyeCVAEB X-IPAS-Result: A2BYAQBjw51d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7iF2PKAEBAQMGgRGKHYUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcTgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBoUsr3J1fzMaiiyBDCiBZYpBeIEHgUSDHYQNg0WCWASPNDeGPEOWWYIslTQMjhUDixwtqUeBek0uCoMoT5BGjyeCVAEB X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216228978" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:21 +0800 Subject: [PATCH v5 02/17] vfs: add missing blkdev_put() in get_tree_bdev() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:21 +0800 Message-ID: <157062062120.32346.6331183312304681728.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org There appear to be a couple of missing blkdev_put() in get_tree_bdev(). --- fs/super.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/super.c b/fs/super.c index a7f62c964e58..fd816014bd7d 100644 --- a/fs/super.c +++ b/fs/super.c @@ -1268,6 +1268,7 @@ int get_tree_bdev(struct fs_context *fc, mutex_lock(&bdev->bd_fsfreeze_mutex); if (bdev->bd_fsfreeze_count > 0) { mutex_unlock(&bdev->bd_fsfreeze_mutex); + blkdev_put(bdev, mode); warnf(fc, "%pg: Can't mount, blockdev is frozen", bdev); return -EBUSY; } @@ -1276,8 +1277,10 @@ int get_tree_bdev(struct fs_context *fc, fc->sget_key = bdev; s = sget_fc(fc, test_bdev_super_fc, set_bdev_super_fc); mutex_unlock(&bdev->bd_fsfreeze_mutex); - if (IS_ERR(s)) + if (IS_ERR(s)) { + blkdev_put(bdev, mode); return PTR_ERR(s); + } if (s->s_root) { /* Don't summarily change the RO/RW state. */ From patchwork Wed Oct 9 11:30:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181029 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 774D317EE for ; Wed, 9 Oct 2019 11:31:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 60F7420B7C for ; Wed, 9 Oct 2019 11:31:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729566AbfJILbF (ORCPT ); Wed, 9 Oct 2019 07:31:05 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725914AbfJILbE (ORCPT ); Wed, 9 Oct 2019 07:31:04 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4wPCQEBAQEBAQEBATcBAYQ7AwICgnI3Bg4CDAEBAQQBAQEBAQUDAYVYhhoCAQMjVhAYDQImAgJHEAYThRmvb3WBMhqKLIEMKAGBZIpBeIEHgUSDHYdSglgEjzQ3hjxDh2aOc4IslTQMjhUDixypc4F7TS4KgydQkEZnkRQBAQ X-IPAS-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4wPCQEBAQEBAQEBATcBAYQ7AwICgnI3Bg4CDAEBAQQBAQEBAQUDAYVYhhoCAQMjVhAYDQImAgJHEAYThRmvb3WBMhqKLIEMKAGBZIpBeIEHgUSDHYdSglgEjzQ3hjxDh2aOc4IslTQMjhUDixypc4F7TS4KgydQkEZnkRQBAQ X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216228991" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:26 +0800 Subject: [PATCH v5 03/17] xfs: remove very old mount option From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:26 +0800 Message-ID: <157062062643.32346.10294752229732110798.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org It appears the biosize mount option hasn't been documented as a vilid option since 2005. So remove it. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f9450235533c..1010097354a6 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -51,7 +51,7 @@ static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */ * Table driven mount option parser. */ enum { - Opt_logbufs, Opt_logbsize, Opt_logdev, Opt_rtdev, Opt_biosize, + Opt_logbufs, Opt_logbsize, Opt_logdev, Opt_rtdev, Opt_wsync, Opt_noalign, Opt_swalloc, Opt_sunit, Opt_swidth, Opt_nouuid, Opt_grpid, Opt_nogrpid, Opt_bsdgroups, Opt_sysvgroups, Opt_allocsize, Opt_norecovery, Opt_inode64, Opt_inode32, Opt_ikeep, @@ -67,7 +67,6 @@ static const match_table_t tokens = { {Opt_logbsize, "logbsize=%s"}, /* size of XFS log buffers */ {Opt_logdev, "logdev=%s"}, /* log device */ {Opt_rtdev, "rtdev=%s"}, /* realtime I/O device */ - {Opt_biosize, "biosize=%u"}, /* log2 of preferred buffered io size */ {Opt_wsync, "wsync"}, /* safe-mode nfs compatible mount */ {Opt_noalign, "noalign"}, /* turn off stripe alignment */ {Opt_swalloc, "swalloc"}, /* turn on stripe width allocation */ @@ -229,7 +228,6 @@ xfs_parseargs( return -ENOMEM; break; case Opt_allocsize: - case Opt_biosize: if (suffix_kstrtoint(args, 10, &iosize)) return -EINVAL; iosizelog = ffs(iosize) - 1; From patchwork Wed Oct 9 11:30:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181027 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4FDF117D4 for ; Wed, 9 Oct 2019 11:31:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 39BE121721 for ; Wed, 9 Oct 2019 11:31:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729686AbfJILbE (ORCPT ); Wed, 9 Oct 2019 07:31:04 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33489 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729566AbfJILbE (ORCPT ); Wed, 9 Oct 2019 07:31:04 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AbAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFoBgEBCwGBboJLhCOPKAEBAQMGgRGKHYUfihSBewkBAQEBAQEBAQE3AQGEOwMCAoJyNQgOAgwBAQEEAQEBAQEFAwGFWIYaAgEDI1YQGA0CJgICRxAGE4UZr291gTIaiiyBDCgBgWSKQXiBB4ERM4MdhB0BC4MpglgEjzQ3hVthQ5ZZgiyVNAyOFQOLHIQ3pSgCgg1NLgqDJ1CBfxeOMGeOQAGCUwEB X-IPAS-Result: A2AbAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFoBgEBCwGBboJLhCOPKAEBAQMGgRGKHYUfihSBewkBAQEBAQEBAQE3AQGEOwMCAoJyNQgOAgwBAQEEAQEBAQEFAwGFWIYaAgEDI1YQGA0CJgICRxAGE4UZr291gTIaiiyBDCgBgWSKQXiBB4ERM4MdhB0BC4MpglgEjzQ3hVthQ5ZZgiyVNAyOFQOLHIQ3pSgCgg1NLgqDJ1CBfxeOMGeOQAGCUwEB X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229006" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:31 +0800 Subject: [PATCH v5 04/17] xfs: mount-api - add fs parameter description From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:31 +0800 Message-ID: <157062063161.32346.15357252773768069084.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The new mount-api uses an array of struct fs_parameter_spec for parameter parsing, create this table populated with the xfs mount parameters. The new mount-api table definition is wider than the token based parameter table and interleaving the option description comments between each table line is much less readable than adding them to the end of each table entry. So add the option description comment to each entry line even though it causes quite a few of the entries to be longer than 80 characters. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 1010097354a6..9c1ce3d70c08 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -38,6 +38,8 @@ #include #include +#include +#include static const struct super_operations xfs_super_operations; struct bio_set xfs_ioend_bioset; @@ -108,6 +110,54 @@ static const match_table_t tokens = { {Opt_err, NULL}, }; +static const struct fs_parameter_spec xfs_param_specs[] = { + fsparam_u32 ("logbufs", Opt_logbufs), /* number of XFS log buffers */ + fsparam_string ("logbsize", Opt_logbsize), /* size of XFS log buffers */ + fsparam_string ("logdev", Opt_logdev), /* log device */ + fsparam_string ("rtdev", Opt_rtdev), /* realtime I/O device */ + fsparam_flag ("wsync", Opt_wsync), /* safe-mode nfs compatible mount */ + fsparam_flag ("noalign", Opt_noalign), /* turn off stripe alignment */ + fsparam_flag ("swalloc", Opt_swalloc), /* turn on stripe width allocation */ + fsparam_u32 ("sunit", Opt_sunit), /* data volume stripe unit */ + fsparam_u32 ("swidth", Opt_swidth), /* data volume stripe width */ + fsparam_flag ("nouuid", Opt_nouuid), /* ignore filesystem UUID */ + fsparam_flag ("grpid", Opt_grpid), /* group-ID from parent directory */ + fsparam_flag ("nogrpid", Opt_nogrpid), /* no group-ID from parent directory */ + fsparam_flag ("bsdgroups", Opt_bsdgroups), /* group-ID from parent directory */ + fsparam_flag ("sysvgroups", Opt_sysvgroups),/* group-ID from current process */ + fsparam_string ("allocsize", Opt_allocsize), /* preferred allocation size */ + fsparam_flag ("norecovery", Opt_norecovery),/* don't run XFS recovery */ + fsparam_flag ("inode64", Opt_inode64), /* inodes can be allocated anywhere */ + fsparam_flag ("inode32", Opt_inode32), /* inode allocation limited to XFS_MAXINUMBER_32 */ + fsparam_flag ("ikeep", Opt_ikeep), /* do not free empty inode clusters */ + fsparam_flag ("noikeep", Opt_noikeep), /* free empty inode clusters */ + fsparam_flag ("largeio", Opt_largeio), /* report large I/O sizes in stat() */ + fsparam_flag ("nolargeio", Opt_nolargeio), /* do not report large I/O sizes in stat() */ + fsparam_flag ("attr2", Opt_attr2), /* do use attr2 attribute format */ + fsparam_flag ("noattr2", Opt_noattr2), /* do not use attr2 attribute format */ + fsparam_flag ("filestreams",Opt_filestreams), /* use filestreams allocator */ + fsparam_flag ("quota", Opt_quota), /* disk quotas (user) */ + fsparam_flag ("noquota", Opt_noquota), /* no quotas */ + fsparam_flag ("usrquota", Opt_usrquota), /* user quota enabled */ + fsparam_flag ("grpquota", Opt_grpquota), /* group quota enabled */ + fsparam_flag ("prjquota", Opt_prjquota), /* project quota enabled */ + fsparam_flag ("uquota", Opt_uquota), /* user quota (IRIX variant) */ + fsparam_flag ("gquota", Opt_gquota), /* group quota (IRIX variant) */ + fsparam_flag ("pquota", Opt_pquota), /* project quota (IRIX variant) */ + fsparam_flag ("uqnoenforce",Opt_uqnoenforce), /* user quota limit enforcement */ + fsparam_flag ("gqnoenforce",Opt_gqnoenforce), /* group quota limit enforcement */ + fsparam_flag ("pqnoenforce",Opt_pqnoenforce), /* project quota limit enforcement */ + fsparam_flag ("qnoenforce", Opt_qnoenforce), /* same as uqnoenforce */ + fsparam_flag ("discard", Opt_discard), /* Discard unused blocks */ + fsparam_flag ("nodiscard", Opt_nodiscard), /* Do not discard unused blocks */ + fsparam_flag ("dax", Opt_dax), /* Enable direct access to bdev pages */ + {} +}; + +static const struct fs_parameter_description xfs_fs_parameters = { + .name = "XFS", + .specs = xfs_param_specs, +}; STATIC int suffix_kstrtoint(const substring_t *s, unsigned int base, int *res) From patchwork Wed Oct 9 11:30:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181025 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1F74D912 for ; Wed, 9 Oct 2019 11:31:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0AB9C21835 for ; Wed, 9 Oct 2019 11:31:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725848AbfJILbB (ORCPT ); Wed, 9 Oct 2019 07:31:01 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725914AbfJILbB (ORCPT ); Wed, 9 Oct 2019 07:31:01 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+EbIU8gWcJAQEBAQEBAQEBNwEBhDsDAgKCcjgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwogWWKQXiBB4FEgx2ELIMmglgEjzQ3hjxDllmCLJU0DIIui2cDEIsMLYQKpT2Bek0uCoMnUJBGZ5EUAQE X-IPAS-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+EbIU8gWcJAQEBAQEBAQEBNwEBhDsDAgKCcjgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwogWWKQXiBB4FEgx2ELIMmglgEjzQ3hjxDllmCLJU0DIIui2cDEIsMLYQKpT2Bek0uCoMnUJBGZ5EUAQE X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229011" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:36 +0800 Subject: [PATCH v5 05/17] xfs: mount-api - refactor suffix_kstrtoint() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:36 +0800 Message-ID: <157062063684.32346.12253005903079702405.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The mount-api doesn't have a "human unit" parse type yet so the options that have values like "10k" etc. still need to be converted by the fs. But the value comes to the fs as a string (not a substring_t type) so there's a need to change the conversion function to take a character string instead. After refactoring xfs_parseargs() and changing it to use xfs_parse_param() match_kstrtoint() will no longer be used and will be removed. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 9c1ce3d70c08..6a16750b1314 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -160,13 +160,13 @@ static const struct fs_parameter_description xfs_fs_parameters = { }; STATIC int -suffix_kstrtoint(const substring_t *s, unsigned int base, int *res) +suffix_kstrtoint(const char *s, unsigned int base, int *res) { int last, shift_left_factor = 0, _res; char *value; int ret = 0; - value = match_strdup(s); + value = kstrdup(s, GFP_KERNEL); if (!value) return -ENOMEM; @@ -191,6 +191,20 @@ suffix_kstrtoint(const substring_t *s, unsigned int base, int *res) return ret; } +STATIC int +match_kstrtoint(const substring_t *s, unsigned int base, int *res) +{ + const char *value; + int ret; + + value = match_strdup(s); + if (!value) + return -ENOMEM; + ret = suffix_kstrtoint(value, base, res); + kfree(value); + return ret; +} + /* * This function fills in xfs_mount_t fields based on mount args. * Note: the superblock has _not_ yet been read in. @@ -262,7 +276,7 @@ xfs_parseargs( return -EINVAL; break; case Opt_logbsize: - if (suffix_kstrtoint(args, 10, &mp->m_logbsize)) + if (match_kstrtoint(args, 10, &mp->m_logbsize)) return -EINVAL; break; case Opt_logdev: @@ -278,7 +292,7 @@ xfs_parseargs( return -ENOMEM; break; case Opt_allocsize: - if (suffix_kstrtoint(args, 10, &iosize)) + if (match_kstrtoint(args, 10, &iosize)) return -EINVAL; iosizelog = ffs(iosize) - 1; break; From patchwork Wed Oct 9 11:30:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181033 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3302617EE for ; Wed, 9 Oct 2019 11:31:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 136A220B7C for ; Wed, 9 Oct 2019 11:31:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729883AbfJILbH (ORCPT ); Wed, 9 Oct 2019 07:31:07 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33489 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729699AbfJILbH (ORCPT ); Wed, 9 Oct 2019 07:31:07 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4wPCQEBAQEBAQEBATcBAYQ7AwICgnI3Bg4CDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCgBgWSKQXiBB4ERM4Mdh1KCWASNBYIvN4Y8Q5ZZgiyVNAyCLotnAxCLDC2ECqU8gXtNLgqDJ1CQRmeRFAEB X-IPAS-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4wPCQEBAQEBAQEBATcBAYQ7AwICgnI3Bg4CDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCgBgWSKQXiBB4ERM4Mdh1KCWASNBYIvN4Y8Q5ZZgiyVNAyCLotnAxCLDC2ECqU8gXtNLgqDJ1CQRmeRFAEB X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229027" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:42 +0800 Subject: [PATCH v5 06/17] xfs: mount-api - refactor xfs_parseags() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:42 +0800 Message-ID: <157062064203.32346.8541704132111024167.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Refactor xfs_parseags(), move the entire token case block to a separate function in an attempt to highlight the code that actually changes in converting to use the new mount api. The only changes are what's needed to communicate the variables dsunit, dswidth and iosizelog back to xfs_parseags(). Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 290 ++++++++++++++++++++++++++++------------------------ 1 file changed, 155 insertions(+), 135 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 6a16750b1314..b04aebab69ab 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -205,6 +205,156 @@ match_kstrtoint(const substring_t *s, unsigned int base, int *res) return ret; } +STATIC int +xfs_parse_param( + int token, + char *p, + substring_t *args, + struct xfs_mount *mp, + int *dsunit, + int *dswidth, + uint8_t *iosizelog) +{ + int iosize = 0; + + switch (token) { + case Opt_logbufs: + if (match_int(args, &mp->m_logbufs)) + return -EINVAL; + break; + case Opt_logbsize: + if (match_kstrtoint(args, 10, &mp->m_logbsize)) + return -EINVAL; + break; + case Opt_logdev: + kfree(mp->m_logname); + mp->m_logname = match_strdup(args); + if (!mp->m_logname) + return -ENOMEM; + break; + case Opt_rtdev: + kfree(mp->m_rtname); + mp->m_rtname = match_strdup(args); + if (!mp->m_rtname) + return -ENOMEM; + break; + case Opt_allocsize: + if (match_kstrtoint(args, 10, &iosize)) + return -EINVAL; + *iosizelog = ffs(iosize) - 1; + break; + case Opt_grpid: + case Opt_bsdgroups: + mp->m_flags |= XFS_MOUNT_GRPID; + break; + case Opt_nogrpid: + case Opt_sysvgroups: + mp->m_flags &= ~XFS_MOUNT_GRPID; + break; + case Opt_wsync: + mp->m_flags |= XFS_MOUNT_WSYNC; + break; + case Opt_norecovery: + mp->m_flags |= XFS_MOUNT_NORECOVERY; + break; + case Opt_noalign: + mp->m_flags |= XFS_MOUNT_NOALIGN; + break; + case Opt_swalloc: + mp->m_flags |= XFS_MOUNT_SWALLOC; + break; + case Opt_sunit: + if (match_int(args, dsunit)) + return -EINVAL; + break; + case Opt_swidth: + if (match_int(args, dswidth)) + return -EINVAL; + break; + case Opt_inode32: + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; + break; + case Opt_inode64: + mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; + break; + case Opt_nouuid: + mp->m_flags |= XFS_MOUNT_NOUUID; + break; + case Opt_ikeep: + mp->m_flags |= XFS_MOUNT_IKEEP; + break; + case Opt_noikeep: + mp->m_flags &= ~XFS_MOUNT_IKEEP; + break; + case Opt_largeio: + mp->m_flags &= ~XFS_MOUNT_COMPAT_IOSIZE; + break; + case Opt_nolargeio: + mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; + break; + case Opt_attr2: + mp->m_flags |= XFS_MOUNT_ATTR2; + break; + case Opt_noattr2: + mp->m_flags &= ~XFS_MOUNT_ATTR2; + mp->m_flags |= XFS_MOUNT_NOATTR2; + break; + case Opt_filestreams: + mp->m_flags |= XFS_MOUNT_FILESTREAMS; + break; + case Opt_noquota: + mp->m_qflags &= ~XFS_ALL_QUOTA_ACCT; + mp->m_qflags &= ~XFS_ALL_QUOTA_ENFD; + mp->m_qflags &= ~XFS_ALL_QUOTA_ACTIVE; + break; + case Opt_quota: + case Opt_uquota: + case Opt_usrquota: + mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE | + XFS_UQUOTA_ENFD); + break; + case Opt_qnoenforce: + case Opt_uqnoenforce: + mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE); + mp->m_qflags &= ~XFS_UQUOTA_ENFD; + break; + case Opt_pquota: + case Opt_prjquota: + mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE | + XFS_PQUOTA_ENFD); + break; + case Opt_pqnoenforce: + mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); + mp->m_qflags &= ~XFS_PQUOTA_ENFD; + break; + case Opt_gquota: + case Opt_grpquota: + mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | + XFS_GQUOTA_ENFD); + break; + case Opt_gqnoenforce: + mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); + mp->m_qflags &= ~XFS_GQUOTA_ENFD; + break; + case Opt_discard: + mp->m_flags |= XFS_MOUNT_DISCARD; + break; + case Opt_nodiscard: + mp->m_flags &= ~XFS_MOUNT_DISCARD; + break; +#ifdef CONFIG_FS_DAX + case Opt_dax: + mp->m_flags |= XFS_MOUNT_DAX; + break; +#endif + default: + xfs_warn(mp, "unknown mount option [%s].", p); + return -EINVAL; + } + + return 0; +} + /* * This function fills in xfs_mount_t fields based on mount args. * Note: the superblock has _not_ yet been read in. @@ -226,7 +376,6 @@ xfs_parseargs( substring_t args[MAX_OPT_ARGS]; int dsunit = 0; int dswidth = 0; - int iosize = 0; uint8_t iosizelog = 0; /* @@ -265,145 +414,16 @@ xfs_parseargs( while ((p = strsep(&options, ",")) != NULL) { int token; + int ret; if (!*p) continue; token = match_token(p, tokens, args); - switch (token) { - case Opt_logbufs: - if (match_int(args, &mp->m_logbufs)) - return -EINVAL; - break; - case Opt_logbsize: - if (match_kstrtoint(args, 10, &mp->m_logbsize)) - return -EINVAL; - break; - case Opt_logdev: - kfree(mp->m_logname); - mp->m_logname = match_strdup(args); - if (!mp->m_logname) - return -ENOMEM; - break; - case Opt_rtdev: - kfree(mp->m_rtname); - mp->m_rtname = match_strdup(args); - if (!mp->m_rtname) - return -ENOMEM; - break; - case Opt_allocsize: - if (match_kstrtoint(args, 10, &iosize)) - return -EINVAL; - iosizelog = ffs(iosize) - 1; - break; - case Opt_grpid: - case Opt_bsdgroups: - mp->m_flags |= XFS_MOUNT_GRPID; - break; - case Opt_nogrpid: - case Opt_sysvgroups: - mp->m_flags &= ~XFS_MOUNT_GRPID; - break; - case Opt_wsync: - mp->m_flags |= XFS_MOUNT_WSYNC; - break; - case Opt_norecovery: - mp->m_flags |= XFS_MOUNT_NORECOVERY; - break; - case Opt_noalign: - mp->m_flags |= XFS_MOUNT_NOALIGN; - break; - case Opt_swalloc: - mp->m_flags |= XFS_MOUNT_SWALLOC; - break; - case Opt_sunit: - if (match_int(args, &dsunit)) - return -EINVAL; - break; - case Opt_swidth: - if (match_int(args, &dswidth)) - return -EINVAL; - break; - case Opt_inode32: - mp->m_flags |= XFS_MOUNT_SMALL_INUMS; - break; - case Opt_inode64: - mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; - break; - case Opt_nouuid: - mp->m_flags |= XFS_MOUNT_NOUUID; - break; - case Opt_ikeep: - mp->m_flags |= XFS_MOUNT_IKEEP; - break; - case Opt_noikeep: - mp->m_flags &= ~XFS_MOUNT_IKEEP; - break; - case Opt_largeio: - mp->m_flags &= ~XFS_MOUNT_COMPAT_IOSIZE; - break; - case Opt_nolargeio: - mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; - break; - case Opt_attr2: - mp->m_flags |= XFS_MOUNT_ATTR2; - break; - case Opt_noattr2: - mp->m_flags &= ~XFS_MOUNT_ATTR2; - mp->m_flags |= XFS_MOUNT_NOATTR2; - break; - case Opt_filestreams: - mp->m_flags |= XFS_MOUNT_FILESTREAMS; - break; - case Opt_noquota: - mp->m_qflags &= ~XFS_ALL_QUOTA_ACCT; - mp->m_qflags &= ~XFS_ALL_QUOTA_ENFD; - mp->m_qflags &= ~XFS_ALL_QUOTA_ACTIVE; - break; - case Opt_quota: - case Opt_uquota: - case Opt_usrquota: - mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE | - XFS_UQUOTA_ENFD); - break; - case Opt_qnoenforce: - case Opt_uqnoenforce: - mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE); - mp->m_qflags &= ~XFS_UQUOTA_ENFD; - break; - case Opt_pquota: - case Opt_prjquota: - mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE | - XFS_PQUOTA_ENFD); - break; - case Opt_pqnoenforce: - mp->m_qflags |= (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE); - mp->m_qflags &= ~XFS_PQUOTA_ENFD; - break; - case Opt_gquota: - case Opt_grpquota: - mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE | - XFS_GQUOTA_ENFD); - break; - case Opt_gqnoenforce: - mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); - mp->m_qflags &= ~XFS_GQUOTA_ENFD; - break; - case Opt_discard: - mp->m_flags |= XFS_MOUNT_DISCARD; - break; - case Opt_nodiscard: - mp->m_flags &= ~XFS_MOUNT_DISCARD; - break; -#ifdef CONFIG_FS_DAX - case Opt_dax: - mp->m_flags |= XFS_MOUNT_DAX; - break; -#endif - default: - xfs_warn(mp, "unknown mount option [%s].", p); - return -EINVAL; - } + ret = xfs_parse_param(token, p, args, mp, + &dsunit, &dswidth, &iosizelog); + if (ret) + return ret; } /* From patchwork Wed Oct 9 11:30:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181031 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CB2F3912 for ; Wed, 9 Oct 2019 11:31:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AC83921835 for ; Wed, 9 Oct 2019 11:31:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729831AbfJILbH (ORCPT ); Wed, 9 Oct 2019 07:31:07 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33503 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729575AbfJILbH (ORCPT ); Wed, 9 Oct 2019 07:31:07 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7gW+CS4QjjygBAQEDBoERgSOIeoUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcjgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwogWWKQXiBB4ERM4Iqc4dSglgEjQWCLzeFW2FDllmCLJU0DIIui2cDEIsMLYQKpT2Bek0uCoMnUIIrjhtnjkAqgioBAQ X-IPAS-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7gW+CS4QjjygBAQEDBoERgSOIeoUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcjgTAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwogWWKQXiBB4ERM4Iqc4dSglgEjQWCLzeFW2FDllmCLJU0DIIui2cDEIsMLYQKpT2Bek0uCoMnUIIrjhtnjkAqgioBAQ X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229036" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:47 +0800 Subject: [PATCH v5 07/17] xfs: mount-api - make xfs_parse_param() take context .parse_param() args From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:47 +0800 Message-ID: <157062064722.32346.9021818911822331325.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Make xfs_parse_param() take arguments of the fs context operation .parse_param() in preparation for switching to use the file system mount context for mount. The function fc_parse() only uses the file system context (fc here) when calling log macros warnf() and invalf() which in turn check only the fc->log field to determine if the message should be saved to a context buffer (for later retrival by userspace) or logged using printk(). In xfs_parse_param() immediately returning an error if fs_parse() returns one will lead to an inconsistent log entry for unknown parameters. But there's also a need to support saving error messages to the mount context when the fsxxx() system calls are used for passing options and performing the mount which needs to be done without possibly losing log entries. This isn't the way that the VFS mount api log macros work now so follow up patches will be needed later and they will need to be discussed to work out how this should acheived for xfs. Also the temporary function match_kstrtoint() is now unused, remove it. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 128 +++++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 56 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b04aebab69ab..7fd3975d5523 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -191,57 +191,51 @@ suffix_kstrtoint(const char *s, unsigned int base, int *res) return ret; } -STATIC int -match_kstrtoint(const substring_t *s, unsigned int base, int *res) -{ - const char *value; - int ret; - - value = match_strdup(s); - if (!value) - return -ENOMEM; - ret = suffix_kstrtoint(value, base, res); - kfree(value); - return ret; -} +struct xfs_fs_context { + int dsunit; + int dswidth; + uint8_t iosizelog; +}; STATIC int xfs_parse_param( - int token, - char *p, - substring_t *args, - struct xfs_mount *mp, - int *dsunit, - int *dswidth, - uint8_t *iosizelog) + struct fs_context *fc, + struct fs_parameter *param) { + struct xfs_fs_context *ctx = fc->fs_private; + struct xfs_mount *mp = fc->s_fs_info; + struct fs_parse_result result; int iosize = 0; + int opt; - switch (token) { + opt = fs_parse(fc, &xfs_fs_parameters, param, &result); + if (opt < 0) + return opt; + + switch (opt) { case Opt_logbufs: - if (match_int(args, &mp->m_logbufs)) - return -EINVAL; + mp->m_logbufs = result.uint_32; break; case Opt_logbsize: - if (match_kstrtoint(args, 10, &mp->m_logbsize)) + if (suffix_kstrtoint(param->string, 10, &mp->m_logbsize)) return -EINVAL; break; case Opt_logdev: kfree(mp->m_logname); - mp->m_logname = match_strdup(args); + mp->m_logname = kstrdup(param->string, GFP_KERNEL); if (!mp->m_logname) return -ENOMEM; break; case Opt_rtdev: kfree(mp->m_rtname); - mp->m_rtname = match_strdup(args); + mp->m_rtname = kstrdup(param->string, GFP_KERNEL); if (!mp->m_rtname) return -ENOMEM; break; case Opt_allocsize: - if (match_kstrtoint(args, 10, &iosize)) + if (suffix_kstrtoint(param->string, 10, &iosize)) return -EINVAL; - *iosizelog = ffs(iosize) - 1; + ctx->iosizelog = ffs(iosize) - 1; break; case Opt_grpid: case Opt_bsdgroups: @@ -264,12 +258,10 @@ xfs_parse_param( mp->m_flags |= XFS_MOUNT_SWALLOC; break; case Opt_sunit: - if (match_int(args, dsunit)) - return -EINVAL; + ctx->dsunit = result.uint_32; break; case Opt_swidth: - if (match_int(args, dswidth)) - return -EINVAL; + ctx->dswidth = result.uint_32; break; case Opt_inode32: mp->m_flags |= XFS_MOUNT_SMALL_INUMS; @@ -348,7 +340,7 @@ xfs_parse_param( break; #endif default: - xfs_warn(mp, "unknown mount option [%s].", p); + xfs_warn(mp, "unknown mount option [%s].", param->key); return -EINVAL; } @@ -373,10 +365,16 @@ xfs_parseargs( { const struct super_block *sb = mp->m_super; char *p; - substring_t args[MAX_OPT_ARGS]; - int dsunit = 0; - int dswidth = 0; - uint8_t iosizelog = 0; + struct fs_context fc; + struct xfs_fs_context context; + struct xfs_fs_context *ctx; + int ret; + + memset(&fc, 0, sizeof(fc)); + memset(&context, 0, sizeof(context)); + fc.fs_private = &context; + ctx = &context; + fc.s_fs_info = mp; /* * set up the mount name first so all the errors will refer to the @@ -413,16 +411,33 @@ xfs_parseargs( goto done; while ((p = strsep(&options, ",")) != NULL) { - int token; - int ret; + struct fs_parameter param; + char *value; if (!*p) continue; - token = match_token(p, tokens, args); - ret = xfs_parse_param(token, p, args, mp, - &dsunit, &dswidth, &iosizelog); - if (ret) + param.key = p; + param.type = fs_value_is_string; + param.string = NULL; + param.size = 0; + + value = strchr(p, '='); + if (value) { + *value++ = 0; + param.size = strlen(value); + if (param.size > 0) { + param.string = kmemdup_nul(value, + param.size, + GFP_KERNEL); + if (!param.string) + return -ENOMEM; + } + } + + ret = xfs_parse_param(&fc, ¶m); + kfree(param.string); + if (ret < 0) return ret; } @@ -435,7 +450,8 @@ xfs_parseargs( return -EINVAL; } - if ((mp->m_flags & XFS_MOUNT_NOALIGN) && (dsunit || dswidth)) { + if ((mp->m_flags & XFS_MOUNT_NOALIGN) && + (ctx->dsunit || ctx->dswidth)) { xfs_warn(mp, "sunit and swidth options incompatible with the noalign option"); return -EINVAL; @@ -448,28 +464,28 @@ xfs_parseargs( } #endif - if ((dsunit && !dswidth) || (!dsunit && dswidth)) { + if ((ctx->dsunit && !ctx->dswidth) || (!ctx->dsunit && ctx->dswidth)) { xfs_warn(mp, "sunit and swidth must be specified together"); return -EINVAL; } - if (dsunit && (dswidth % dsunit != 0)) { + if (ctx->dsunit && (ctx->dswidth % ctx->dsunit != 0)) { xfs_warn(mp, "stripe width (%d) must be a multiple of the stripe unit (%d)", - dswidth, dsunit); + ctx->dswidth, ctx->dsunit); return -EINVAL; } done: - if (dsunit && !(mp->m_flags & XFS_MOUNT_NOALIGN)) { + if (ctx->dsunit && !(mp->m_flags & XFS_MOUNT_NOALIGN)) { /* * At this point the superblock has not been read * in, therefore we do not know the block size. * Before the mount call ends we will convert * these to FSBs. */ - mp->m_dalign = dsunit; - mp->m_swidth = dswidth; + mp->m_dalign = ctx->dsunit; + mp->m_swidth = ctx->dswidth; } if (mp->m_logbufs != -1 && @@ -491,18 +507,18 @@ xfs_parseargs( return -EINVAL; } - if (iosizelog) { - if (iosizelog > XFS_MAX_IO_LOG || - iosizelog < XFS_MIN_IO_LOG) { + if (ctx->iosizelog) { + if (ctx->iosizelog > XFS_MAX_IO_LOG || + ctx->iosizelog < XFS_MIN_IO_LOG) { xfs_warn(mp, "invalid log iosize: %d [not %d-%d]", - iosizelog, XFS_MIN_IO_LOG, + ctx->iosizelog, XFS_MIN_IO_LOG, XFS_MAX_IO_LOG); return -EINVAL; } mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE; - mp->m_readio_log = iosizelog; - mp->m_writeio_log = iosizelog; + mp->m_readio_log = ctx->iosizelog; + mp->m_writeio_log = ctx->iosizelog; } return 0; From patchwork Wed Oct 9 11:30:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181035 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 51322912 for ; Wed, 9 Oct 2019 11:31:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3C26D21835 for ; Wed, 9 Oct 2019 11:31:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730000AbfJILbI (ORCPT ); Wed, 9 Oct 2019 07:31:08 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725914AbfJILbI (ORCPT ); Wed, 9 Oct 2019 07:31:08 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4wPCQEBAQEBAQEBATcBAYQ7AwICgnI3Bg4CDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCgBgWSKQXiBB4FEgx2EKYMpglgEjQWCLzeGPEOWWYIslTQMgi6LZwMQiwwthAqlPIF7TS4KgydQkEZnjkEBK4InAQE X-IPAS-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4wPCQEBAQEBAQEBATcBAYQ7AwICgnI3Bg4CDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCgBgWSKQXiBB4FEgx2EKYMpglgEjQWCLzeGPEOWWYIslTQMgi6LZwMQiwwthAqlPIF7TS4KgydQkEZnjkEBK4InAQE X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229049" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:52 +0800 Subject: [PATCH v5 08/17] xfs: mount-api - move xfs_parseargs() validation to a helper From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:52 +0800 Message-ID: <157062065250.32346.13350789812067183237.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Move the validation code of xfs_parseargs() into a helper for later use within the mount context methods. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 147 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 94 insertions(+), 53 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 7fd3975d5523..7008355df065 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -347,6 +347,98 @@ xfs_parse_param( return 0; } +STATIC int +xfs_validate_params( + struct xfs_mount *mp, + struct xfs_fs_context *ctx, + bool nooptions) +{ + if (nooptions) + goto noopts; + + /* + * no recovery flag requires a read-only mount + */ + if ((mp->m_flags & XFS_MOUNT_NORECOVERY) && + !(mp->m_flags & XFS_MOUNT_RDONLY)) { + xfs_warn(mp, "no-recovery mounts must be read-only."); + return -EINVAL; + } + + if ((mp->m_flags & XFS_MOUNT_NOALIGN) && + (ctx->dsunit || ctx->dswidth)) { + xfs_warn(mp, + "sunit and swidth options incompatible with the noalign option"); + return -EINVAL; + } + +#ifndef CONFIG_XFS_QUOTA + if (XFS_IS_QUOTA_RUNNING(mp)) { + xfs_warn(mp, "quota support not available in this kernel."); + return -EINVAL; + } +#endif + + if ((ctx->dsunit && !ctx->dswidth) || (!ctx->dsunit && ctx->dswidth)) { + xfs_warn(mp, "sunit and swidth must be specified together"); + return -EINVAL; + } + + if (ctx->dsunit && (ctx->dswidth % ctx->dsunit != 0)) { + xfs_warn(mp, + "stripe width (%d) must be a multiple of the stripe unit (%d)", + ctx->dswidth, ctx->dsunit); + return -EINVAL; + } + +noopts: + if (ctx->dsunit && !(mp->m_flags & XFS_MOUNT_NOALIGN)) { + /* + * At this point the superblock has not been read + * in, therefore we do not know the block size. + * Before the mount call ends we will convert + * these to FSBs. + */ + mp->m_dalign = ctx->dsunit; + mp->m_swidth = ctx->dswidth; + } + + if (mp->m_logbufs != -1 && + mp->m_logbufs != 0 && + (mp->m_logbufs < XLOG_MIN_ICLOGS || + mp->m_logbufs > XLOG_MAX_ICLOGS)) { + xfs_warn(mp, "invalid logbufs value: %d [not %d-%d]", + mp->m_logbufs, XLOG_MIN_ICLOGS, XLOG_MAX_ICLOGS); + return -EINVAL; + } + if (mp->m_logbsize != -1 && + mp->m_logbsize != 0 && + (mp->m_logbsize < XLOG_MIN_RECORD_BSIZE || + mp->m_logbsize > XLOG_MAX_RECORD_BSIZE || + !is_power_of_2(mp->m_logbsize))) { + xfs_warn(mp, + "invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]", + mp->m_logbsize); + return -EINVAL; + } + + if (ctx->iosizelog) { + if (ctx->iosizelog > XFS_MAX_IO_LOG || + ctx->iosizelog < XFS_MIN_IO_LOG) { + xfs_warn(mp, "invalid log iosize: %d [not %d-%d]", + ctx->iosizelog, XFS_MIN_IO_LOG, + XFS_MAX_IO_LOG); + return -EINVAL; + } + + mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE; + mp->m_readio_log = ctx->iosizelog; + mp->m_writeio_log = ctx->iosizelog; + } + + return 0; +} + /* * This function fills in xfs_mount_t fields based on mount args. * Note: the superblock has _not_ yet been read in. @@ -441,15 +533,6 @@ xfs_parseargs( return ret; } - /* - * no recovery flag requires a read-only mount - */ - if ((mp->m_flags & XFS_MOUNT_NORECOVERY) && - !(mp->m_flags & XFS_MOUNT_RDONLY)) { - xfs_warn(mp, "no-recovery mounts must be read-only."); - return -EINVAL; - } - if ((mp->m_flags & XFS_MOUNT_NOALIGN) && (ctx->dsunit || ctx->dswidth)) { xfs_warn(mp, @@ -477,51 +560,9 @@ xfs_parseargs( } done: - if (ctx->dsunit && !(mp->m_flags & XFS_MOUNT_NOALIGN)) { - /* - * At this point the superblock has not been read - * in, therefore we do not know the block size. - * Before the mount call ends we will convert - * these to FSBs. - */ - mp->m_dalign = ctx->dsunit; - mp->m_swidth = ctx->dswidth; - } + ret = xfs_validate_params(mp, &context, false); - if (mp->m_logbufs != -1 && - mp->m_logbufs != 0 && - (mp->m_logbufs < XLOG_MIN_ICLOGS || - mp->m_logbufs > XLOG_MAX_ICLOGS)) { - xfs_warn(mp, "invalid logbufs value: %d [not %d-%d]", - mp->m_logbufs, XLOG_MIN_ICLOGS, XLOG_MAX_ICLOGS); - return -EINVAL; - } - if (mp->m_logbsize != -1 && - mp->m_logbsize != 0 && - (mp->m_logbsize < XLOG_MIN_RECORD_BSIZE || - mp->m_logbsize > XLOG_MAX_RECORD_BSIZE || - !is_power_of_2(mp->m_logbsize))) { - xfs_warn(mp, - "invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]", - mp->m_logbsize); - return -EINVAL; - } - - if (ctx->iosizelog) { - if (ctx->iosizelog > XFS_MAX_IO_LOG || - ctx->iosizelog < XFS_MIN_IO_LOG) { - xfs_warn(mp, "invalid log iosize: %d [not %d-%d]", - ctx->iosizelog, XFS_MIN_IO_LOG, - XFS_MAX_IO_LOG); - return -EINVAL; - } - - mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE; - mp->m_readio_log = ctx->iosizelog; - mp->m_writeio_log = ctx->iosizelog; - } - - return 0; + return ret; } struct proc_xfs_info { From patchwork Wed Oct 9 11:30:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181039 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 97F8217D4 for ; Wed, 9 Oct 2019 11:31:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 820DB21835 for ; Wed, 9 Oct 2019 11:31:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729699AbfJILbK (ORCPT ); Wed, 9 Oct 2019 07:31:10 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33503 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729575AbfJILbK (ORCPT ); Wed, 9 Oct 2019 07:31:10 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AnAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFpBQEBCwGEOYQjjygBAQEDBoERih2FH4RshSiBewkBAQEBAQEBAQE3AQGEOwMCAoJyNgcOAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwoAYFkikF4gQeBETODHYdSglgEjQWCLzeGPEOWWYIslTQMjhUDixwthAqlLAGCCk0uCoMnUIF/F44wZ5EUAQE X-IPAS-Result: A2AnAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFpBQEBCwGEOYQjjygBAQEDBoERih2FH4RshSiBewkBAQEBAQEBAQE3AQGEOwMCAoJyNgcOAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwoAYFkikF4gQeBETODHYdSglgEjQWCLzeGPEOWWYIslTQMjhUDixwthAqlLAGCCk0uCoMnUIF/F44wZ5EUAQE X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229059" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:30:58 +0800 Subject: [PATCH v5 09/17] xfs: mount-api - refactor xfs_fs_fill_super() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:30:58 +0800 Message-ID: <157062065791.32346.8183392339697088078.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Much of the code in xfs_fs_fill_super() will be used by the fill super function of the new mount-api. So refactor the common code into a helper in an attempt to show what's actually changed. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 64 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 7008355df065..cc2da9093e34 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1712,27 +1712,14 @@ xfs_mount_alloc( STATIC int -xfs_fs_fill_super( - struct super_block *sb, - void *data, +__xfs_fs_fill_super( + struct xfs_mount *mp, int silent) { + struct super_block *sb = mp->m_super; struct inode *root; - struct xfs_mount *mp = NULL; - int flags = 0, error = -ENOMEM; - - /* - * allocate mp and do all low-level struct initializations before we - * attach it to the super - */ - mp = xfs_mount_alloc(sb); - if (!mp) - goto out; - sb->s_fs_info = mp; - - error = xfs_parseargs(mp, (char *)data); - if (error) - goto out_free_fsname; + int flags = 0; + int error; sb_min_blocksize(sb, BBSIZE); sb->s_xattr = xfs_xattr_handlers; @@ -1759,7 +1746,7 @@ xfs_fs_fill_super( error = xfs_open_devices(mp); if (error) - goto out_free_fsname; + goto out; error = xfs_init_mount_workqueues(mp); if (error) @@ -1894,10 +1881,6 @@ xfs_fs_fill_super( xfs_destroy_mount_workqueues(mp); out_close_devices: xfs_close_devices(mp); - out_free_fsname: - sb->s_fs_info = NULL; - xfs_free_fsname(mp); - kfree(mp); out: return error; @@ -1907,6 +1890,41 @@ xfs_fs_fill_super( goto out_free_sb; } +STATIC int +xfs_fs_fill_super( + struct super_block *sb, + void *data, + int silent) +{ + struct xfs_mount *mp; + int error; + + /* + * allocate mp and do all low-level struct initializations before we + * attach it to the super + */ + mp = xfs_mount_alloc(sb); + if (!mp) + return -ENOMEM; + sb->s_fs_info = mp; + + error = xfs_parseargs(mp, (char *)data); + if (error) + goto out_free_fsname; + + error = __xfs_fs_fill_super(mp, silent); + if (error) + goto out_free_fsname; + + return 0; + + out_free_fsname: + sb->s_fs_info = NULL; + xfs_free_fsname(mp); + kfree(mp); + return error; +} + STATIC void xfs_fs_put_super( struct super_block *sb) From patchwork Wed Oct 9 11:31:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181037 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E994117EE for ; Wed, 9 Oct 2019 11:31:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D496821835 for ; Wed, 9 Oct 2019 11:31:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725914AbfJILbJ (ORCPT ); Wed, 9 Oct 2019 07:31:09 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33489 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729699AbfJILbJ (ORCPT ); Wed, 9 Oct 2019 07:31:09 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCiBZYpBeIEHgREzgx2HUoJYBI80N4VbYUOWWYIslTQMjhUDixwthAqlPYF6TS4KgydQgX8XjjBnjkIrgicBAQ X-IPAS-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCiBZYpBeIEHgREzgx2HUoJYBI80N4VbYUOWWYIslTQMjhUDixwthAqlPYF6TS4KgydQgX8XjjBnjkIrgicBAQ X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229069" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:03 +0800 Subject: [PATCH v5 10/17] xfs: mount-api - add xfs_get_tree() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:03 +0800 Message-ID: <157062066316.32346.11258138585168789863.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Add the fs_context_operations method .get_tree that validates mount options and fills the super block as previously done by the file_system_type .mount method. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index cc2da9093e34..314acafffd0b 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1925,6 +1925,51 @@ xfs_fs_fill_super( return error; } +STATIC int +xfs_fill_super( + struct super_block *sb, + struct fs_context *fc) +{ + struct xfs_fs_context *ctx = fc->fs_private; + struct xfs_mount *mp = sb->s_fs_info; + int silent = fc->sb_flags & SB_SILENT; + int error = -ENOMEM; + + mp->m_super = sb; + + /* + * set up the mount name first so all the errors will refer to the + * correct device. + */ + mp->m_fsname = kstrndup(sb->s_id, MAXNAMELEN, GFP_KERNEL); + if (!mp->m_fsname) + goto out_error; + mp->m_fsname_len = strlen(mp->m_fsname) + 1; + + error = xfs_validate_params(mp, ctx, false); + if (error) + goto out_error; + + error = __xfs_fs_fill_super(mp, silent); + if (error) + goto out_error; + + return 0; + + out_error: + sb->s_fs_info = NULL; + xfs_free_fsname(mp); + kfree(mp); + return error; +} + +STATIC int +xfs_get_tree( + struct fs_context *fc) +{ + return get_tree_bdev(fc, xfs_fill_super); +} + STATIC void xfs_fs_put_super( struct super_block *sb) @@ -1995,6 +2040,11 @@ static const struct super_operations xfs_super_operations = { .free_cached_objects = xfs_fs_free_cached_objects, }; +static const struct fs_context_operations xfs_context_ops = { + .parse_param = xfs_parse_param, + .get_tree = xfs_get_tree, +}; + static struct file_system_type xfs_fs_type = { .owner = THIS_MODULE, .name = "xfs", From patchwork Wed Oct 9 11:31:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181041 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CD13717D4 for ; Wed, 9 Oct 2019 11:31:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B6B5321835 for ; Wed, 9 Oct 2019 11:31:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729575AbfJILbL (ORCPT ); Wed, 9 Oct 2019 07:31:11 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730111AbfJILbL (ORCPT ); Wed, 9 Oct 2019 07:31:11 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBosuhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyNwYOAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwoAYFkikF4gQeEYYdSglgEjHsKgi83hjxDcZVogiyVNAyCLotnAxCLDC2ECos1mgeBe00uCoMnUJBGZ5EUAQE X-IPAS-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBosuhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyNwYOAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwoAYFkikF4gQeEYYdSglgEjHsKgi83hjxDcZVogiyVNAyCLotnAxCLDC2ECos1mgeBe00uCoMnUJBGZ5EUAQE X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229078" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:09 +0800 Subject: [PATCH v5 11/17] xfs: mount-api - add xfs_remount_rw() helper From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:09 +0800 Message-ID: <157062066896.32346.115451854887763480.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Factor the remount read write code into a helper to simplify the subsequent change from the super block method .remount_fs to the mount-api fs_context_operations method .reconfigure. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 115 +++++++++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 51 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 314acafffd0b..94996d1a8c0f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1363,6 +1363,68 @@ xfs_test_remount_options( return error; } +STATIC int +xfs_remount_rw( + struct xfs_mount *mp) +{ + xfs_sb_t *sbp = &mp->m_sb; + int error; + + if (mp->m_flags & XFS_MOUNT_NORECOVERY) { + xfs_warn(mp, + "ro->rw transition prohibited on norecovery mount"); + return -EINVAL; + } + + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_ro_compat_feature(sbp, XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { + xfs_warn(mp, + "ro->rw transition prohibited on unknown (0x%x) ro-compat filesystem", + (sbp->sb_features_ro_compat & + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); + return -EINVAL; + } + + mp->m_flags &= ~XFS_MOUNT_RDONLY; + + /* + * If this is the first remount to writeable state we + * might have some superblock changes to update. + */ + if (mp->m_update_sb) { + error = xfs_sync_sb(mp, false); + if (error) { + xfs_warn(mp, "failed to write sb changes"); + return error; + } + mp->m_update_sb = false; + } + + /* + * Fill out the reserve pool if it is empty. Use the stashed + * value if it is non-zero, otherwise go with the default. + */ + xfs_restore_resvblks(mp); + xfs_log_work_queue(mp); + + /* Recover any CoW blocks that never got remapped. */ + error = xfs_reflink_recover_cow(mp); + if (error) { + xfs_err(mp, + "Error %d recovering leftover CoW allocations.", error); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + return error; + } + xfs_start_block_reaping(mp); + + /* Create the per-AG metadata reservation pool .*/ + error = xfs_fs_reserve_ag_blocks(mp); + if (error && error != -ENOSPC) + return error; + + return 0; +} + STATIC int xfs_fs_remount( struct super_block *sb, @@ -1426,57 +1488,8 @@ xfs_fs_remount( /* ro -> rw */ if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & SB_RDONLY)) { - if (mp->m_flags & XFS_MOUNT_NORECOVERY) { - xfs_warn(mp, - "ro->rw transition prohibited on norecovery mount"); - return -EINVAL; - } - - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && - xfs_sb_has_ro_compat_feature(sbp, - XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { - xfs_warn(mp, -"ro->rw transition prohibited on unknown (0x%x) ro-compat filesystem", - (sbp->sb_features_ro_compat & - XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); - return -EINVAL; - } - - mp->m_flags &= ~XFS_MOUNT_RDONLY; - - /* - * If this is the first remount to writeable state we - * might have some superblock changes to update. - */ - if (mp->m_update_sb) { - error = xfs_sync_sb(mp, false); - if (error) { - xfs_warn(mp, "failed to write sb changes"); - return error; - } - mp->m_update_sb = false; - } - - /* - * Fill out the reserve pool if it is empty. Use the stashed - * value if it is non-zero, otherwise go with the default. - */ - xfs_restore_resvblks(mp); - xfs_log_work_queue(mp); - - /* Recover any CoW blocks that never got remapped. */ - error = xfs_reflink_recover_cow(mp); - if (error) { - xfs_err(mp, - "Error %d recovering leftover CoW allocations.", error); - xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); - return error; - } - xfs_start_block_reaping(mp); - - /* Create the per-AG metadata reservation pool .*/ - error = xfs_fs_reserve_ag_blocks(mp); - if (error && error != -ENOSPC) + error = xfs_remount_rw(mp); + if (error) return error; } From patchwork Wed Oct 9 11:31:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181043 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3151F912 for ; Wed, 9 Oct 2019 11:31:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1C70E21721 for ; Wed, 9 Oct 2019 11:31:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730339AbfJILbQ (ORCPT ); Wed, 9 Oct 2019 07:31:16 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730111AbfJILbQ (ORCPT ); Wed, 9 Oct 2019 07:31:16 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AaAABxxJ1d/0e30XYNWRsBAQEBAQEBBQEBAREBAQMDAQEBgWoDAQEBCwGEOYQjjygBAQEDBosuhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyNwYOAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwoAYFkikF4gQeBEYNQh1KCWASNBYIvN4Y8Q5ZZgiyVNAyCLotnAxCLDC2ECqU8gXtNLgqDJ1CBfxeOMGeRFAEB X-IPAS-Result: A2AaAABxxJ1d/0e30XYNWRsBAQEBAQEBBQEBAREBAQMDAQEBgWoDAQEBCwGEOYQjjygBAQEDBosuhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyNwYOAgwBAQEEAQEBAQEFAwGFWIYaAgEDIwRSEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwoAYFkikF4gQeBEYNQh1KCWASNBYIvN4Y8Q5ZZgiyVNAyCLotnAxCLDC2ECqU8gXtNLgqDJ1CBfxeOMGeRFAEB X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229089" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:14 +0800 Subject: [PATCH v5 12/17] xfs: mount-api - add xfs_remount_ro() helper From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:14 +0800 Message-ID: <157062067418.32346.306283917170690609.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Factor the remount read only code into a helper to simplify the subsequent change from the super block method .remount_fs to the mount-api fs_context_operations method .reconfigure. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 73 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 94996d1a8c0f..7e634706626b 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1425,6 +1425,47 @@ xfs_remount_rw( return 0; } +STATIC int +xfs_remount_ro( + struct xfs_mount *mp) +{ + int error; + + /* + * Cancel background eofb scanning so it cannot race with the + * final log force+buftarg wait and deadlock the remount. + */ + xfs_stop_block_reaping(mp); + + /* Get rid of any leftover CoW reservations... */ + error = xfs_icache_free_cowblocks(mp, NULL); + if (error) { + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + return error; + } + + /* Free the per-AG metadata reservation pool. */ + error = xfs_fs_unreserve_ag_blocks(mp); + if (error) { + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + return error; + } + + /* + * Before we sync the metadata, we need to free up the reserve + * block pool so that the used block count in the superblock on + * disk is correct at the end of the remount. Stash the current + * reserve pool size so that if we get remounted rw, we can + * return it to the same size. + */ + xfs_save_resvblks(mp); + + xfs_quiesce_attr(mp); + mp->m_flags |= XFS_MOUNT_RDONLY; + + return 0; +} + STATIC int xfs_fs_remount( struct super_block *sb, @@ -1495,37 +1536,9 @@ xfs_fs_remount( /* rw -> ro */ if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (*flags & SB_RDONLY)) { - /* - * Cancel background eofb scanning so it cannot race with the - * final log force+buftarg wait and deadlock the remount. - */ - xfs_stop_block_reaping(mp); - - /* Get rid of any leftover CoW reservations... */ - error = xfs_icache_free_cowblocks(mp, NULL); - if (error) { - xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); - return error; - } - - /* Free the per-AG metadata reservation pool. */ - error = xfs_fs_unreserve_ag_blocks(mp); - if (error) { - xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + error = xfs_remount_ro(mp); + if (error) return error; - } - - /* - * Before we sync the metadata, we need to free up the reserve - * block pool so that the used block count in the superblock on - * disk is correct at the end of the remount. Stash the current - * reserve pool size so that if we get remounted rw, we can - * return it to the same size. - */ - xfs_save_resvblks(mp); - - xfs_quiesce_attr(mp); - mp->m_flags |= XFS_MOUNT_RDONLY; } return 0; From patchwork Wed Oct 9 11:31:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181045 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 43B5B17EE for ; Wed, 9 Oct 2019 11:31:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2E82021835 for ; Wed, 9 Oct 2019 11:31:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730384AbfJILbW (ORCPT ); Wed, 9 Oct 2019 07:31:22 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730111AbfJILbW (ORCPT ); Wed, 9 Oct 2019 07:31:22 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBE0FEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwogWWKQXiBB4EQNIMdh1KCWASPNDeGPEOWWYIslTQMjhUDixwthAqlPYF6TS4KgydQkEZnjkIrgicBAQ X-IPAS-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBE0FEBgNAiYCAkcQBhOFGa9vdX8zGoosgQwogWWKQXiBB4EQNIMdh1KCWASPNDeGPEOWWYIslTQMjhUDixwthAqlPYF6TS4KgydQkEZnjkIrgicBAQ X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229097" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:19 +0800 Subject: [PATCH v5 13/17] xfs: mount api - add xfs_reconfigure() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:19 +0800 Message-ID: <157062067944.32346.8228418435930532076.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Add the fs_context_operations method .reconfigure that performs remount validation as previously done by the super_operations .remount_fs method. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 7e634706626b..230b0e2a184c 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1544,6 +1544,67 @@ xfs_fs_remount( return 0; } +/* + * Logically we would return an error here to prevent users + * from believing they might have changed mount options using + * remount which can't be changed. + * + * But unfortunately mount(8) adds all options from mtab and + * fstab to the mount arguments in some cases so we can't + * blindly reject options, but have to check for each specified + * option if it actually differs from the currently set option + * and only reject it if that's the case. + * + * Until that is implemented we return success for every remount + * request, and silently ignore all options that we can't actually + * change. + */ +STATIC int +xfs_reconfigure( + struct fs_context *fc) +{ + struct xfs_fs_context *ctx = fc->fs_private; + struct xfs_mount *mp = XFS_M(fc->root->d_sb); + struct xfs_mount *new_mp = fc->s_fs_info; + xfs_sb_t *sbp = &mp->m_sb; + int flags = fc->sb_flags; + int error; + + error = xfs_validate_params(new_mp, ctx, false); + if (error) + return error; + + /* inode32 -> inode64 */ + if ((mp->m_flags & XFS_MOUNT_SMALL_INUMS) && + !(new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) { + mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; + mp->m_maxagi = xfs_set_inode_alloc(mp, sbp->sb_agcount); + } + + /* inode64 -> inode32 */ + if (!(mp->m_flags & XFS_MOUNT_SMALL_INUMS) && + (new_mp->m_flags & XFS_MOUNT_SMALL_INUMS)) { + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; + mp->m_maxagi = xfs_set_inode_alloc(mp, sbp->sb_agcount); + } + + /* ro -> rw */ + if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(flags & SB_RDONLY)) { + error = xfs_remount_rw(mp); + if (error) + return error; + } + + /* rw -> ro */ + if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (flags & SB_RDONLY)) { + error = xfs_remount_ro(mp); + if (error) + return error; + } + + return 0; +} + /* * Second stage of a freeze. The data is already frozen so we only * need to take care of the metadata. Once that's done sync the superblock @@ -2069,6 +2130,7 @@ static const struct super_operations xfs_super_operations = { static const struct fs_context_operations xfs_context_ops = { .parse_param = xfs_parse_param, .get_tree = xfs_get_tree, + .reconfigure = xfs_reconfigure, }; static struct file_system_type xfs_fs_type = { From patchwork Wed Oct 9 11:31:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181047 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8C82817D4 for ; Wed, 9 Oct 2019 11:31:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 76DE421721 for ; Wed, 9 Oct 2019 11:31:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730504AbfJILb1 (ORCPT ); Wed, 9 Oct 2019 07:31:27 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730398AbfJILb1 (ORCPT ); Wed, 9 Oct 2019 07:31:27 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGCgmFGa9vdX8zGoosgQwogWWKQXiBB4FEgx2HUoJYBI80N4Y8Q5ZZgiyVNAyOFQOLHC2ECqU9gXpNLgqDJ1CBfxeOMGeRFAEB X-IPAS-Result: A2BZAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7hDqEI48oAQEBAwaBEYodhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGCgmFGa9vdX8zGoosgQwogWWKQXiBB4FEgx2HUoJYBI80N4Y8Q5ZZgiyVNAyOFQOLHC2ECqU9gXpNLgqDJ1CBfxeOMGeRFAEB X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229105" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:24 +0800 Subject: [PATCH v5 14/17] xfs: mount-api - add xfs_fc_free() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:24 +0800 Message-ID: <157062068470.32346.8530858639686710763.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Add the fs_context_operations method .free that performs fs context cleanup on context release. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 230b0e2a184c..c7c33395b648 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -2127,10 +2127,29 @@ static const struct super_operations xfs_super_operations = { .free_cached_objects = xfs_fs_free_cached_objects, }; +static void xfs_fc_free(struct fs_context *fc) +{ + struct xfs_fs_context *ctx = fc->fs_private; + struct xfs_mount *mp = fc->s_fs_info; + + /* + * mp and ctx are stored in the fs_context when it is + * initialized. mp is transferred to the superblock on + * a successful mount, but if an error occurs before the + * transfer we have to free it here. + */ + if (mp) { + xfs_free_fsname(mp); + kfree(mp); + } + kfree(ctx); +} + static const struct fs_context_operations xfs_context_ops = { .parse_param = xfs_parse_param, .get_tree = xfs_get_tree, .reconfigure = xfs_reconfigure, + .free = xfs_fc_free, }; static struct file_system_type xfs_fs_type = { From patchwork Wed Oct 9 11:31:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181049 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1C4F2912 for ; Wed, 9 Oct 2019 11:31:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 052F920B7C for ; Wed, 9 Oct 2019 11:31:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730523AbfJILbb (ORCPT ); Wed, 9 Oct 2019 07:31:31 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33473 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730398AbfJILbb (ORCPT ); Wed, 9 Oct 2019 07:31:31 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BYAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7gW+CS4QjjygBAQEDBosuhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCiBZYpBeIEHgRGDUIdSglgEjzQ3hjxDllmCLJU0DI4VA4scLYQKpT2Bek0uCoMnUIF/F44wZ5EUAQE X-IPAS-Result: A2BYAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7gW+CS4QjjygBAQEDBosuhR+MDwkBAQEBAQEBAQE3AQGEOwMCAoJyOBMCDAEBAQQBAQEBAQUDAYVYhhoCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCiBZYpBeIEHgRGDUIdSglgEjzQ3hjxDllmCLJU0DI4VA4scLYQKpT2Bek0uCoMnUIF/F44wZ5EUAQE X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229114" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:30 +0800 Subject: [PATCH v5 15/17] xfs: mount-api - dont set sb in xfs_mount_alloc() From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:30 +0800 Message-ID: <157062068996.32346.198461609951852574.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org When changing to use the new mount api the super block won't be available when the xfs_mount info struct is allocated so move setting the super block in xfs_mount to xfs_fs_fill_super(). Also change xfs_mount_alloc() decalaration static -> STATIC. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index c7c33395b648..910739789aed 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1766,9 +1766,8 @@ xfs_destroy_percpu_counters( percpu_counter_destroy(&mp->m_delalloc_blks); } -static struct xfs_mount * -xfs_mount_alloc( - struct super_block *sb) +STATIC struct xfs_mount * +xfs_mount_alloc(void) { struct xfs_mount *mp; @@ -1776,7 +1775,6 @@ xfs_mount_alloc( if (!mp) return NULL; - mp->m_super = sb; spin_lock_init(&mp->m_sb_lock); spin_lock_init(&mp->m_agirotor_lock); INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC); @@ -1990,9 +1988,10 @@ xfs_fs_fill_super( * allocate mp and do all low-level struct initializations before we * attach it to the super */ - mp = xfs_mount_alloc(sb); + mp = xfs_mount_alloc(); if (!mp) return -ENOMEM; + mp->m_super = sb; sb->s_fs_info = mp; error = xfs_parseargs(mp, (char *)data); From patchwork Wed Oct 9 11:31:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181051 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 81556912 for ; Wed, 9 Oct 2019 11:31:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 598BC21848 for ; Wed, 9 Oct 2019 11:31:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729686AbfJILbk (ORCPT ); Wed, 9 Oct 2019 07:31:40 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33659 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730111AbfJILbk (ORCPT ); Wed, 9 Oct 2019 07:31:40 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DbAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7AoQ4hCOPKAEBAQMGgRGKHYUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcjgTAgwBAQEEAQEBAQEFAwGFWIEQAQwBhHwCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCgBgWSKQXiBB4EQATODHYQpgymCWASNBS+CADeFW2FDllmCLJU0DIIui2cDEIsMhDelPYF6TS4KgydQgX8XjjBnglCLcYJTAQE X-IPAS-Result: A2DbAQBxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYF7AoQ4hCOPKAEBAQMGgRGKHYUfjA8JAQEBAQEBAQEBNwEBhDsDAgKCcjgTAgwBAQEEAQEBAQEFAwGFWIEQAQwBhHwCAQMjBFIQGA0CJgICRxAGE4UZr291fzMaiiyBDCgBgWSKQXiBB4EQATODHYQpgymCWASNBS+CADeFW2FDllmCLJU0DIIui2cDEIsMhDelPYF6TS4KgydQgX8XjjBnglCLcYJTAQE X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229118" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:35 +0800 Subject: [PATCH v5 16/17] xfs: mount-api - switch to new mount-api From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:35 +0800 Message-ID: <157062069523.32346.10316532216437532792.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org The infrastructure needed to use the new mount api is now in place, switch over to use it. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 321 ++++++++-------------------------------------------- 1 file changed, 49 insertions(+), 272 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 910739789aed..680dcad3cd1e 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -439,132 +439,6 @@ xfs_validate_params( return 0; } -/* - * This function fills in xfs_mount_t fields based on mount args. - * Note: the superblock has _not_ yet been read in. - * - * Note that this function leaks the various device name allocations on - * failure. The caller takes care of them. - * - * *sb is const because this is also used to test options on the remount - * path, and we don't want this to have any side effects at remount time. - * Today this function does not change *sb, but just to future-proof... - */ -STATIC int -xfs_parseargs( - struct xfs_mount *mp, - char *options) -{ - const struct super_block *sb = mp->m_super; - char *p; - struct fs_context fc; - struct xfs_fs_context context; - struct xfs_fs_context *ctx; - int ret; - - memset(&fc, 0, sizeof(fc)); - memset(&context, 0, sizeof(context)); - fc.fs_private = &context; - ctx = &context; - fc.s_fs_info = mp; - - /* - * set up the mount name first so all the errors will refer to the - * correct device. - */ - mp->m_fsname = kstrndup(sb->s_id, MAXNAMELEN, GFP_KERNEL); - if (!mp->m_fsname) - return -ENOMEM; - mp->m_fsname_len = strlen(mp->m_fsname) + 1; - - /* - * Copy binary VFS mount flags we are interested in. - */ - if (sb_rdonly(sb)) - mp->m_flags |= XFS_MOUNT_RDONLY; - if (sb->s_flags & SB_DIRSYNC) - mp->m_flags |= XFS_MOUNT_DIRSYNC; - if (sb->s_flags & SB_SYNCHRONOUS) - mp->m_flags |= XFS_MOUNT_WSYNC; - - /* - * Set some default flags that could be cleared by the mount option - * parsing. - */ - mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; - - /* - * These can be overridden by the mount option parsing. - */ - mp->m_logbufs = -1; - mp->m_logbsize = -1; - - if (!options) - goto done; - - while ((p = strsep(&options, ",")) != NULL) { - struct fs_parameter param; - char *value; - - if (!*p) - continue; - - param.key = p; - param.type = fs_value_is_string; - param.string = NULL; - param.size = 0; - - value = strchr(p, '='); - if (value) { - *value++ = 0; - param.size = strlen(value); - if (param.size > 0) { - param.string = kmemdup_nul(value, - param.size, - GFP_KERNEL); - if (!param.string) - return -ENOMEM; - } - } - - ret = xfs_parse_param(&fc, ¶m); - kfree(param.string); - if (ret < 0) - return ret; - } - - if ((mp->m_flags & XFS_MOUNT_NOALIGN) && - (ctx->dsunit || ctx->dswidth)) { - xfs_warn(mp, - "sunit and swidth options incompatible with the noalign option"); - return -EINVAL; - } - -#ifndef CONFIG_XFS_QUOTA - if (XFS_IS_QUOTA_RUNNING(mp)) { - xfs_warn(mp, "quota support not available in this kernel."); - return -EINVAL; - } -#endif - - if ((ctx->dsunit && !ctx->dswidth) || (!ctx->dsunit && ctx->dswidth)) { - xfs_warn(mp, "sunit and swidth must be specified together"); - return -EINVAL; - } - - if (ctx->dsunit && (ctx->dswidth % ctx->dsunit != 0)) { - xfs_warn(mp, - "stripe width (%d) must be a multiple of the stripe unit (%d)", - ctx->dswidth, ctx->dsunit); - return -EINVAL; - } - -done: - ret = xfs_validate_params(mp, &context, false); - - return ret; -} - struct proc_xfs_info { uint64_t flag; char *str; @@ -1343,26 +1217,6 @@ xfs_quiesce_attr( xfs_log_quiesce(mp); } -STATIC int -xfs_test_remount_options( - struct super_block *sb, - char *options) -{ - int error = 0; - struct xfs_mount *tmp_mp; - - tmp_mp = kmem_zalloc(sizeof(*tmp_mp), KM_MAYFAIL); - if (!tmp_mp) - return -ENOMEM; - - tmp_mp->m_super = sb; - error = xfs_parseargs(tmp_mp, options); - xfs_free_fsname(tmp_mp); - kmem_free(tmp_mp); - - return error; -} - STATIC int xfs_remount_rw( struct xfs_mount *mp) @@ -1466,84 +1320,6 @@ xfs_remount_ro( return 0; } -STATIC int -xfs_fs_remount( - struct super_block *sb, - int *flags, - char *options) -{ - struct xfs_mount *mp = XFS_M(sb); - xfs_sb_t *sbp = &mp->m_sb; - substring_t args[MAX_OPT_ARGS]; - char *p; - int error; - - /* First, check for complete junk; i.e. invalid options */ - error = xfs_test_remount_options(sb, options); - if (error) - return error; - - sync_filesystem(sb); - while ((p = strsep(&options, ",")) != NULL) { - int token; - - if (!*p) - continue; - - token = match_token(p, tokens, args); - switch (token) { - case Opt_inode64: - mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; - mp->m_maxagi = xfs_set_inode_alloc(mp, sbp->sb_agcount); - break; - case Opt_inode32: - mp->m_flags |= XFS_MOUNT_SMALL_INUMS; - mp->m_maxagi = xfs_set_inode_alloc(mp, sbp->sb_agcount); - break; - default: - /* - * Logically we would return an error here to prevent - * users from believing they might have changed - * mount options using remount which can't be changed. - * - * But unfortunately mount(8) adds all options from - * mtab and fstab to the mount arguments in some cases - * so we can't blindly reject options, but have to - * check for each specified option if it actually - * differs from the currently set option and only - * reject it if that's the case. - * - * Until that is implemented we return success for - * every remount request, and silently ignore all - * options that we can't actually change. - */ -#if 0 - xfs_info(mp, - "mount option \"%s\" not supported for remount", p); - return -EINVAL; -#else - break; -#endif - } - } - - /* ro -> rw */ - if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & SB_RDONLY)) { - error = xfs_remount_rw(mp); - if (error) - return error; - } - - /* rw -> ro */ - if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (*flags & SB_RDONLY)) { - error = xfs_remount_ro(mp); - if (error) - return error; - } - - return 0; -} - /* * Logically we would return an error here to prevent users * from believing they might have changed mount options using @@ -1975,42 +1751,6 @@ __xfs_fs_fill_super( goto out_free_sb; } -STATIC int -xfs_fs_fill_super( - struct super_block *sb, - void *data, - int silent) -{ - struct xfs_mount *mp; - int error; - - /* - * allocate mp and do all low-level struct initializations before we - * attach it to the super - */ - mp = xfs_mount_alloc(); - if (!mp) - return -ENOMEM; - mp->m_super = sb; - sb->s_fs_info = mp; - - error = xfs_parseargs(mp, (char *)data); - if (error) - goto out_free_fsname; - - error = __xfs_fs_fill_super(mp, silent); - if (error) - goto out_free_fsname; - - return 0; - - out_free_fsname: - sb->s_fs_info = NULL; - xfs_free_fsname(mp); - kfree(mp); - return error; -} - STATIC int xfs_fill_super( struct super_block *sb, @@ -2081,16 +1821,6 @@ xfs_fs_put_super( kfree(mp); } -STATIC struct dentry * -xfs_fs_mount( - struct file_system_type *fs_type, - int flags, - const char *dev_name, - void *data) -{ - return mount_bdev(fs_type, flags, dev_name, data, xfs_fs_fill_super); -} - static long xfs_fs_nr_cached_objects( struct super_block *sb, @@ -2120,7 +1850,6 @@ static const struct super_operations xfs_super_operations = { .freeze_fs = xfs_fs_freeze, .unfreeze_fs = xfs_fs_unfreeze, .statfs = xfs_fs_statfs, - .remount_fs = xfs_fs_remount, .show_options = xfs_fs_show_options, .nr_cached_objects = xfs_fs_nr_cached_objects, .free_cached_objects = xfs_fs_free_cached_objects, @@ -2151,10 +1880,58 @@ static const struct fs_context_operations xfs_context_ops = { .free = xfs_fc_free, }; +/* + * Set up the filesystem mount context. + */ +int xfs_init_fs_context(struct fs_context *fc) +{ + struct xfs_fs_context *ctx; + struct xfs_mount *mp; + + ctx = kzalloc(sizeof(struct xfs_fs_context), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + mp = xfs_mount_alloc(); + if (!mp) { + kfree(ctx); + return -ENOMEM; + } + + /* + * Set some default flags that could be cleared by the mount option + * parsing. + */ + mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; + + /* + * These can be overridden by the mount option parsing. + */ + mp->m_logbufs = -1; + mp->m_logbsize = -1; + + /* + * Copy binary VFS mount flags we are interested in. + */ + if (fc->sb_flags & SB_RDONLY) + mp->m_flags |= XFS_MOUNT_RDONLY; + if (fc->sb_flags & SB_DIRSYNC) + mp->m_flags |= XFS_MOUNT_DIRSYNC; + if (fc->sb_flags & SB_SYNCHRONOUS) + mp->m_flags |= XFS_MOUNT_WSYNC; + + fc->fs_private = ctx; + fc->s_fs_info = mp; + fc->ops = &xfs_context_ops; + + return 0; +} + static struct file_system_type xfs_fs_type = { .owner = THIS_MODULE, .name = "xfs", - .mount = xfs_fs_mount, + .init_fs_context = xfs_init_fs_context, + .parameters = &xfs_fs_parameters, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; From patchwork Wed Oct 9 11:31:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11181053 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DF2E617D4 for ; Wed, 9 Oct 2019 11:31:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C999A21835 for ; Wed, 9 Oct 2019 11:31:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730757AbfJILbp (ORCPT ); Wed, 9 Oct 2019 07:31:45 -0400 Received: from icp-osb-irony-out3.external.iinet.net.au ([203.59.1.153]:33684 "EHLO icp-osb-irony-out3.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730111AbfJILbp (ORCPT ); Wed, 9 Oct 2019 07:31:45 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4oogWcJAQEBAQEBAQEBNwEBhDsDAgKCcjcGDgIMAQEBBAEBAQEBBQMBhViGGgIBAyNWEBgNAiYCAkcQBhOFGa9vdYEyGoosgQwoAYFkikF4gQeBETODHYQdAQsDgyaCWASNBYIvN4Y8Q5ZZgiyVNAyOFQOLHIQ3pTyBe00uCoMnUIF/F44wZ45AAYJTAQE X-IPAS-Result: A2BRAABxxJ1d/0e30XYNWRwBAQEBAQcBAREBBAQBAYFqBAEBCwGEOYQjjygBAQEDBoERih2FH4oogWcJAQEBAQEBAQEBNwEBhDsDAgKCcjcGDgIMAQEBBAEBAQEBBQMBhViGGgIBAyNWEBgNAiYCAkcQBhOFGa9vdYEyGoosgQwoAYFkikF4gQeBETODHYQdAQsDgyaCWASNBYIvN4Y8Q5ZZgiyVNAyOFQOLHIQ3pTyBe00uCoMnUIF/F44wZ45AAYJTAQE X-IronPort-AV: E=Sophos;i="5.67,273,1566835200"; d="scan'208";a="216229125" Received: from unknown (HELO [192.168.1.222]) ([118.209.183.71]) by icp-osb-irony-out3.iinet.net.au with ESMTP; 09 Oct 2019 19:31:40 +0800 Subject: [PATCH v5 17/17] xfs: mount-api - remove remaining legacy mount code From: Ian Kent To: linux-xfs Cc: Brian Foster , Eric Sandeen , David Howells , Dave Chinner , Al Viro Date: Wed, 09 Oct 2019 19:31:40 +0800 Message-ID: <157062070050.32346.18387589090342427440.stgit@fedora-28> In-Reply-To: <157062043952.32346.977737248061083292.stgit@fedora-28> References: <157062043952.32346.977737248061083292.stgit@fedora-28> User-Agent: StGit/unknown-version MIME-Version: 1.0 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Now that the new mount api is being used the remaining old mount code can be removed. Signed-off-by: Ian Kent Reviewed-by: Brian Foster --- fs/xfs/xfs_super.c | 48 +----------------------------------------------- 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 680dcad3cd1e..f3f204f202c6 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -61,53 +61,7 @@ enum { Opt_filestreams, Opt_quota, Opt_noquota, Opt_usrquota, Opt_grpquota, Opt_prjquota, Opt_uquota, Opt_gquota, Opt_pquota, Opt_uqnoenforce, Opt_gqnoenforce, Opt_pqnoenforce, Opt_qnoenforce, - Opt_discard, Opt_nodiscard, Opt_dax, Opt_err, -}; - -static const match_table_t tokens = { - {Opt_logbufs, "logbufs=%u"}, /* number of XFS log buffers */ - {Opt_logbsize, "logbsize=%s"}, /* size of XFS log buffers */ - {Opt_logdev, "logdev=%s"}, /* log device */ - {Opt_rtdev, "rtdev=%s"}, /* realtime I/O device */ - {Opt_wsync, "wsync"}, /* safe-mode nfs compatible mount */ - {Opt_noalign, "noalign"}, /* turn off stripe alignment */ - {Opt_swalloc, "swalloc"}, /* turn on stripe width allocation */ - {Opt_sunit, "sunit=%u"}, /* data volume stripe unit */ - {Opt_swidth, "swidth=%u"}, /* data volume stripe width */ - {Opt_nouuid, "nouuid"}, /* ignore filesystem UUID */ - {Opt_grpid, "grpid"}, /* group-ID from parent directory */ - {Opt_nogrpid, "nogrpid"}, /* group-ID from current process */ - {Opt_bsdgroups, "bsdgroups"}, /* group-ID from parent directory */ - {Opt_sysvgroups,"sysvgroups"}, /* group-ID from current process */ - {Opt_allocsize, "allocsize=%s"},/* preferred allocation size */ - {Opt_norecovery,"norecovery"}, /* don't run XFS recovery */ - {Opt_inode64, "inode64"}, /* inodes can be allocated anywhere */ - {Opt_inode32, "inode32"}, /* inode allocation limited to - * XFS_MAXINUMBER_32 */ - {Opt_ikeep, "ikeep"}, /* do not free empty inode clusters */ - {Opt_noikeep, "noikeep"}, /* free empty inode clusters */ - {Opt_largeio, "largeio"}, /* report large I/O sizes in stat() */ - {Opt_nolargeio, "nolargeio"}, /* do not report large I/O sizes - * in stat(). */ - {Opt_attr2, "attr2"}, /* do use attr2 attribute format */ - {Opt_noattr2, "noattr2"}, /* do not use attr2 attribute format */ - {Opt_filestreams,"filestreams"},/* use filestreams allocator */ - {Opt_quota, "quota"}, /* disk quotas (user) */ - {Opt_noquota, "noquota"}, /* no quotas */ - {Opt_usrquota, "usrquota"}, /* user quota enabled */ - {Opt_grpquota, "grpquota"}, /* group quota enabled */ - {Opt_prjquota, "prjquota"}, /* project quota enabled */ - {Opt_uquota, "uquota"}, /* user quota (IRIX variant) */ - {Opt_gquota, "gquota"}, /* group quota (IRIX variant) */ - {Opt_pquota, "pquota"}, /* project quota (IRIX variant) */ - {Opt_uqnoenforce,"uqnoenforce"},/* user quota limit enforcement */ - {Opt_gqnoenforce,"gqnoenforce"},/* group quota limit enforcement */ - {Opt_pqnoenforce,"pqnoenforce"},/* project quota limit enforcement */ - {Opt_qnoenforce, "qnoenforce"}, /* same as uqnoenforce */ - {Opt_discard, "discard"}, /* Discard unused blocks */ - {Opt_nodiscard, "nodiscard"}, /* Do not discard unused blocks */ - {Opt_dax, "dax"}, /* Enable direct access to bdev pages */ - {Opt_err, NULL}, + Opt_discard, Opt_nodiscard, Opt_dax, }; static const struct fs_parameter_spec xfs_param_specs[] = {