From patchwork Mon Jun 24 02:58:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11012083 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 00F4D17D2 for ; Mon, 24 Jun 2019 03:07:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DFB6E28AF8 for ; Mon, 24 Jun 2019 03:07:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D378528B08; Mon, 24 Jun 2019 03:07:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 40B8D28AF8 for ; Mon, 24 Jun 2019 03:07:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726965AbfFXDHo (ORCPT ); Sun, 23 Jun 2019 23:07:44 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33246 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726323AbfFXDHo (ORCPT ); Sun, 23 Jun 2019 23:07:44 -0400 X-Greylist: delayed 557 seconds by postgrey-1.27 at vger.kernel.org; Sun, 23 Jun 2019 23:07:42 EDT X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BbAACVOxBd/3Gu0HYNVx0BAQUBBwUBgVYFAQsBgWeCRYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwKDAzcGDgEDAQEBBAEBAQEEAZB9J1YoDQImAkkWE4UZoklxgTEaihGBDCgBgWGKE3iBB4ERM4MdhB0BC4MlglgEjkqFHFs/lQkJghaTfQyNIAOKGIQQoieBek0uCoMngk0Xji1ljWABglEBAQ X-IPAS-Result: A2BbAACVOxBd/3Gu0HYNVx0BAQUBBwUBgVYFAQsBgWeCRYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwKDAzcGDgEDAQEBBAEBAQEEAZB9J1YoDQImAkkWE4UZoklxgTEaihGBDCgBgWGKE3iBB4ERM4MdhB0BC4MlglgEjkqFHFs/lQkJghaTfQyNIAOKGIQQoieBek0uCoMngk0Xji1ljWABglEBAQ X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015566" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:58:23 +0800 Subject: [PATCH 01/10] xfs: mount-api - add fs parameter description From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:58:22 +0800 Message-ID: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP 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: Darrick J. Wong --- fs/xfs/xfs_super.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index a14d11d78bd8..ab8145bf6fff 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -51,6 +51,8 @@ #include #include #include +#include +#include static const struct super_operations xfs_super_operations; struct bio_set xfs_ioend_bioset; @@ -60,9 +62,6 @@ static struct kset *xfs_kset; /* top-level xfs sysfs dir */ static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */ #endif -/* - * Table driven mount option parser. - */ enum { Opt_logbufs, Opt_logbsize, Opt_logdev, Opt_rtdev, Opt_biosize, Opt_wsync, Opt_noalign, Opt_swalloc, Opt_sunit, Opt_swidth, Opt_nouuid, @@ -122,6 +121,49 @@ 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_u32 ("biosize", Opt_biosize), /* log2 of preferred buffered io size */ + 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_no("grpid", Opt_grpid), /* group-ID from parent directory (or not) */ + 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_no("ikeep", Opt_ikeep), /* do not free (or keep) empty inode clusters */ + fsparam_flag_no("largeio", Opt_largeio), /* report (or do not report) large I/O sizes in stat() */ + fsparam_flag_no("attr2", Opt_attr2), /* do (or do not) use attr2 attribute format */ + fsparam_flag ("filestreams",Opt_filestreams), /* use filestreams allocator */ + fsparam_flag_no("quota", Opt_quota), /* disk quotas (user) */ + 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_no("discard", Opt_discard), /* Do (or do not) 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 Mon Jun 24 02:58: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: 11012085 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8667876 for ; Mon, 24 Jun 2019 03:07:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 744EC28AF8 for ; Mon, 24 Jun 2019 03:07:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6538028B08; Mon, 24 Jun 2019 03:07:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1050A28AF8 for ; Mon, 24 Jun 2019 03:07:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727013AbfFXDHs (ORCPT ); Sun, 23 Jun 2019 23:07:48 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33246 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726323AbfFXDHs (ORCPT ); Sun, 23 Jun 2019 23:07:48 -0400 X-Greylist: delayed 557 seconds by postgrey-1.27 at vger.kernel.org; Sun, 23 Jun 2019 23:07:42 EDT X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AKAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXhF+FMYFnCQEBAQEBAQEBATcBAQGEOgMCAoMBOBMBAwEBAQQBAQEBBAGQewIBAyMEUhAYDQImAgJHEAYThRmiSXF+MxqKEYEMKIFiihN4gQeBRIMdhCyDIoJYBI5KhXc/lQkJghaTfQyCHIsEAxCKCC2DY6IogXlNLgqDJ5ERZZAyAQE X-IPAS-Result: A2AKAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXhF+FMYFnCQEBAQEBAQEBATcBAQGEOgMCAoMBOBMBAwEBAQQBAQEBBAGQewIBAyMEUhAYDQImAgJHEAYThRmiSXF+MxqKEYEMKIFiihN4gQeBRIMdhCyDIoJYBI5KhXc/lQkJghaTfQyCHIsEAxCKCC2DY6IogXlNLgqDJ5ERZZAyAQE X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015621" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:58:31 +0800 Subject: [PATCH 02/10] xfs: mount-api - refactor suffix_kstrtoint() From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:58:30 +0800 Message-ID: <156134510851.2519.2387740442257250106.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP 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 switching to use the new mount-api match_kstrtoint() will no longer be called and will be removed. Signed-off-by: Ian Kent --- 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 ab8145bf6fff..14c2a775786c 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -166,13 +166,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; @@ -197,6 +197,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. @@ -268,7 +282,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: @@ -285,7 +299,7 @@ xfs_parseargs( break; case Opt_allocsize: case Opt_biosize: - if (suffix_kstrtoint(args, 10, &iosize)) + if (match_kstrtoint(args, 10, &iosize)) return -EINVAL; iosizelog = ffs(iosize) - 1; break; From patchwork Mon Jun 24 02:58: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: 11012087 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D54C376 for ; Mon, 24 Jun 2019 03:07:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C680828AF8 for ; Mon, 24 Jun 2019 03:07:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BA45E28B08; Mon, 24 Jun 2019 03:07:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 44EBE28AF8 for ; Mon, 24 Jun 2019 03:07:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727026AbfFXDHv (ORCPT ); Sun, 23 Jun 2019 23:07:51 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33246 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726323AbfFXDHv (ORCPT ); Sun, 23 Jun 2019 23:07:51 -0400 X-Greylist: delayed 557 seconds by postgrey-1.27 at vger.kernel.org; Sun, 23 Jun 2019 23:07:42 EDT X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AeAACVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgVUFAQELAYQshBaTSQaBEYl4hReJfIF7CQEBAQEBAQEBATcBAQGEOgMCAoMBNgcOAQMBAQEEAQEBAQQBkHsCAQMjBFIQGA0CJgICRxAGE4UZoklxfjMaihGBDCgBgWGKE3iBB4FEgx2HToJYBI5KhRxbP5UJCYIWk30MghyLBAMQiggtg2OiGAuBfk0uCoMnkRFlkDIBAQ X-IPAS-Result: A2AeAACVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgVUFAQELAYQshBaTSQaBEYl4hReJfIF7CQEBAQEBAQEBATcBAQGEOgMCAoMBNgcOAQMBAQEEAQEBAQQBkHsCAQMjBFIQGA0CJgICRxAGE4UZoklxfjMaihGBDCgBgWGKE3iBB4FEgx2HToJYBI5KhRxbP5UJCYIWk30MghyLBAMQiggtg2OiGAuBfk0uCoMnkRFlkDIBAQ X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015645" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:58:37 +0800 Subject: [PATCH 03/10] xfs: mount-api - add xfs_parse_param() From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:58:36 +0800 Message-ID: <156134511636.2519.2203014992522713286.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP Add the fs_context_operations method .parse_param that's called by the mount-api ito parse each file system mount option. Signed-off-by: Ian Kent --- fs/xfs/xfs_super.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 14c2a775786c..e78fea14d598 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -495,6 +495,178 @@ xfs_parseargs( return 0; } +struct xfs_fs_context { + int dsunit; + int dswidth; + uint8_t iosizelog; +}; + +/* + * 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. + */ +STATIC int +xfs_parse_param( + 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; + + opt = fs_parse(fc, &xfs_fs_parameters, param, &result); + if (opt < 0) + return opt; + + switch (opt) { + case Opt_logbufs: + mp->m_logbufs = result.uint_32; + break; + case Opt_logbsize: + if (suffix_kstrtoint(param->string, 10, &mp->m_logbsize)) + return -EINVAL; + break; + case Opt_logdev: + kfree(mp->m_logname); + 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 = kstrdup(param->string, GFP_KERNEL); + if (!mp->m_rtname) + return -ENOMEM; + break; + case Opt_allocsize: + case Opt_biosize: + if (suffix_kstrtoint(param->string, 10, &iosize)) + return -EINVAL; + ctx->iosizelog = ffs(iosize) - 1; + break; + case Opt_bsdgroups: + mp->m_flags |= XFS_MOUNT_GRPID; + break; + case Opt_grpid: + if (result.negated) + mp->m_flags &= ~XFS_MOUNT_GRPID; + else + mp->m_flags |= XFS_MOUNT_GRPID; + break; + 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: + ctx->dsunit = result.uint_32; + break; + case Opt_swidth: + ctx->dswidth = result.uint_32; + 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: + if (result.negated) + mp->m_flags &= ~XFS_MOUNT_IKEEP; + else + mp->m_flags |= XFS_MOUNT_IKEEP; + break; + case Opt_largeio: + if (result.negated) + mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; + else + mp->m_flags &= ~XFS_MOUNT_COMPAT_IOSIZE; + break; + case Opt_attr2: + if (!result.negated) { + mp->m_flags |= XFS_MOUNT_ATTR2; + } else { + 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_quota: + if (!result.negated) { + mp->m_qflags |= (XFS_UQUOTA_ACCT | XFS_UQUOTA_ACTIVE | + XFS_UQUOTA_ENFD); + } else { + mp->m_qflags &= ~XFS_ALL_QUOTA_ACCT; + mp->m_qflags &= ~XFS_ALL_QUOTA_ENFD; + mp->m_qflags &= ~XFS_ALL_QUOTA_ACTIVE; + } + break; + 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: + if (result.negated) + mp->m_flags &= ~XFS_MOUNT_DISCARD; + else + mp->m_flags |= XFS_MOUNT_DISCARD; + break; +#ifdef CONFIG_FS_DAX + case Opt_dax: + mp->m_flags |= XFS_MOUNT_DAX; + break; +#endif + default: + return invalf(fc, "XFS: unknown mount option [%s].", param->key); + } + + return 0; +} + struct proc_xfs_info { uint64_t flag; char *str; @@ -1914,6 +2086,10 @@ 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, +}; + static struct file_system_type xfs_fs_type = { .owner = THIS_MODULE, .name = "xfs", From patchwork Mon Jun 24 02:58:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11012089 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 45DFC76 for ; Mon, 24 Jun 2019 03:08:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 367E728AF8 for ; Mon, 24 Jun 2019 03:08:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2AD2428B08; Mon, 24 Jun 2019 03:08:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CA2E628AF8 for ; Mon, 24 Jun 2019 03:08:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726579AbfFXDID (ORCPT ); Sun, 23 Jun 2019 23:08:03 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33315 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726323AbfFXDID (ORCPT ); Sun, 23 Jun 2019 23:08:03 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AeAACVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgVUFAQELAYQshBaTSQaBEYl4hReEX4UdgXsJAQEBAQEBAQEBNwEBAYQ6AwICgwE2Bw4BAwEBAQQBAQEBBAGQewIBAyMEUhAYDQImAgJHEAYThRmiSXF+MxqKEYEMKAGBYYoTeIEHgREzgx2HToJYBIt8gk6Fdz+VCQmCFpN9DI0gA4oYLYNjnSiEcAyBfU0uCoMngk0Xji1lkDIBAQ X-IPAS-Result: A2AeAACVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgVUFAQELAYQshBaTSQaBEYl4hReEX4UdgXsJAQEBAQEBAQEBNwEBAYQ6AwICgwE2Bw4BAwEBAQQBAQEBBAGQewIBAyMEUhAYDQImAgJHEAYThRmiSXF+MxqKEYEMKAGBYYoTeIEHgREzgx2HToJYBIt8gk6Fdz+VCQmCFpN9DI0gA4oYLYNjnSiEcAyBfU0uCoMngk0Xji1lkDIBAQ X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015739" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:58:45 +0800 Subject: [PATCH 04/10] xfs: mount-api - refactor xfs_fs_fill_super() From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:58:44 +0800 Message-ID: <156134512264.2519.11045220600510784871.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP Much of the code in xfs_fs_fill_super() will be used by the fill super function used by 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 --- fs/xfs/xfs_super.c | 65 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index e78fea14d598..cf8efb465969 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1823,27 +1823,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; @@ -1870,7 +1857,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) @@ -2003,10 +1990,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; @@ -2016,6 +1999,42 @@ 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 = NULL; + int 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; + + 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); +out: + return error; +} + STATIC void xfs_fs_put_super( struct super_block *sb) From patchwork Mon Jun 24 02:58:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11012091 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 78D7F76 for ; Mon, 24 Jun 2019 03:08:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6AB5528AF8 for ; Mon, 24 Jun 2019 03:08:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5F35328B08; Mon, 24 Jun 2019 03:08:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E538528AF8 for ; Mon, 24 Jun 2019 03:08:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726323AbfFXDIF (ORCPT ); Sun, 23 Jun 2019 23:08:05 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33323 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727027AbfFXDIF (ORCPT ); Sun, 23 Jun 2019 23:08:05 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE4EwEDAQEBBAEBAQEEAZB7AgEDIwRNBRAYDQImAgJHEAYThRmiSXF+MxqKEYEMKIFiihN4gQeBETODHYQpgyWCWASOSoUcWz+VCQmCFpN9DIIciwQDEIoILYNjoiiBeU0uCoMngk0Xji1ljWEBK4IlAQE X-IPAS-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE4EwEDAQEBBAEBAQEEAZB7AgEDIwRNBRAYDQImAgJHEAYThRmiSXF+MxqKEYEMKIFiihN4gQeBETODHYQpgyWCWASOSoUcWz+VCQmCFpN9DIIciwQDEIoILYNjoiiBeU0uCoMngk0Xji1ljWEBK4IlAQE X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015786" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:58:51 +0800 Subject: [PATCH 05/10] xfs: mount-api - add xfs_get_tree() From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:58:50 +0800 Message-ID: <156134513061.2519.15444193018279732348.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP 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 --- fs/xfs/xfs_super.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index cf8efb465969..0ec0142b94e1 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1629,6 +1629,98 @@ xfs_fs_remount( return 0; } +STATIC int +xfs_validate_params( + struct xfs_mount *mp, + struct xfs_fs_context *ctx, + enum fs_context_purpose purpose) +{ + /* + * 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; + } + + 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. + */ + if (purpose == FS_CONTEXT_FOR_MOUNT) { + 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; + } + + if (purpose == FS_CONTEXT_FOR_MOUNT) { + mp->m_flags |= XFS_MOUNT_DFLT_IOSIZE; + mp->m_readio_log = ctx->iosizelog; + mp->m_writeio_log = ctx->iosizelog; + } + } + + 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 @@ -2035,6 +2127,52 @@ 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) + return -ENOMEM; + mp->m_fsname_len = strlen(mp->m_fsname) + 1; + + error = xfs_validate_params(mp, ctx, fc->purpose); + 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_get_tree( + struct fs_context *fc) +{ + return vfs_get_block_super(fc, xfs_fill_super); +} + STATIC void xfs_fs_put_super( struct super_block *sb) @@ -2107,6 +2245,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, }; static struct file_system_type xfs_fs_type = { From patchwork Mon Jun 24 02:58:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11012095 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F18EA17D2 for ; Mon, 24 Jun 2019 03:08:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E161628AF8 for ; Mon, 24 Jun 2019 03:08:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D5E4528B08; Mon, 24 Jun 2019 03:08:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4D00D28AF8 for ; Mon, 24 Jun 2019 03:08:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727043AbfFXDIW (ORCPT ); Sun, 23 Jun 2019 23:08:22 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33360 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727027AbfFXDIW (ORCPT ); Sun, 23 Jun 2019 23:08:22 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE4EwEDAQEBBAEBAQEEAZB7AgEDIwRNBRAYDQImAgJHEAYThRmiSXF+MxqKEYEMKIFiihN4gQeBEAEzgx2HToJYBItygliFdz9qlB8JghaLL4hODIIciwQDihgtg2OKRZdjgXlNLgqDJ4JNF44tZY1iK4IlAQE X-IPAS-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE4EwEDAQEBBAEBAQEEAZB7AgEDIwRNBRAYDQImAgJHEAYThRmiSXF+MxqKEYEMKIFiihN4gQeBEAEzgx2HToJYBItygliFdz9qlB8JghaLL4hODIIciwQDihgtg2OKRZdjgXlNLgqDJ4JNF44tZY1iK4IlAQE X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015813" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:58:56 +0800 Subject: [PATCH 06/10] xfs: mount api - add xfs_reconfigure() From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:58:56 +0800 Message-ID: <156134513640.2519.16288235480703050854.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP Add the fs_context_operations method .reconfigure that performs remount validation as previously done by the super_operations .remount_fs method. An attempt has also been made to update the comment about options handling problems with mount(8) to reflect the current situation. Signed-off-by: Ian Kent --- fs/xfs/xfs_super.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 0ec0142b94e1..7326b21b32d1 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1721,6 +1721,176 @@ xfs_validate_params( return 0; } +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, fc->purpose); + if (error) + return error; + + /* + * There have been problems in the past with options + * passed from mount(8). + * + * The problem being that options passed by mount(8) in + * the case where only the the mount point path is given + * would consist of the existing fstab options with the + * options from mtab for the current mount merged in and + * the options given on the command line last. But the + * result couldn't be relied upon to accurately reflect the + * current mount options so that rejecting options that + * can't be changed on reconfigure could erronously cause + * mount failure. + * + * The mount-api uses a legacy mount options handler + * in the VFS to accomodate mount(8) so these options + * will continue to be passed. Even if mount(8) is + * updated to use fsopen()/fsconfig()/fsmount() it's + * likely to continue to set the existing options so + * options problems with reconfigure could continue. + * + * For the longest time mtab locking was a problem and + * this could have been one possible cause. It's also + * possible there could have been options order problems. + * + * That has changed now as mtab is a link to the proc + * file system mount table so mtab options should be + * always accurate. + * + * Consulting the util-linux maintainer (Karel Zak) he + * is confident that, in this case, the options passed + * by mount(8) will be those of the current mount and + * the options order should be a correct merge of fstab + * and mtab options, and new options given on the command + * line. + * + * So, in theory, it should be possible to compare incoming + * options and return an error for options that differ from + * the current mount and can't be changed on reconfigure to + * prevent users from believing they might have changed mount + * options using remount which can't be changed. + * + * But for now continue to return success for every reconfigure + * request, and silently ignore all options that can't actually + * be changed. + */ + + /* 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)) { + 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; + } + + /* 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); + 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; +} + /* * 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 @@ -2246,6 +2416,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 Mon Jun 24 02:59:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11012093 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 33F5117D2 for ; Mon, 24 Jun 2019 03:08:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 239AC28AF8 for ; Mon, 24 Jun 2019 03:08:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1688E28B08; Mon, 24 Jun 2019 03:08:16 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BD4D428AF8 for ; Mon, 24 Jun 2019 03:08:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727031AbfFXDIP (ORCPT ); Sun, 23 Jun 2019 23:08:15 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33360 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727027AbfFXDIP (ORCPT ); Sun, 23 Jun 2019 23:08:15 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE4EwEDAQEBBAEBAQEEAZB7AgEDIwRSEBgNAiYCAkcQBhOFGaJJcX4zGooRgQwogWKKE3iBB4FEgx2HToJYBI5KhXc/lQkJghaTfQyNIAOKGC2DY6IogXlNLgqDJ4JNF44tZZAyAQE X-IPAS-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE4EwEDAQEBBAEBAQEEAZB7AgEDIwRSEBgNAiYCAkcQBhOFGaJJcX4zGooRgQwogWKKE3iBB4FEgx2HToJYBI5KhXc/lQkJghaTfQyNIAOKGC2DY6IogXlNLgqDJ4JNF44tZZAyAQE X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015855" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:59:02 +0800 Subject: [PATCH 07/10] xfs: mount-api - add xfs_fc_free() From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:59:02 +0800 Message-ID: <156134514204.2519.9597800141023778002.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP Add the fs_context_operations method .free that performs fs context cleanup on context release. Signed-off-by: Ian Kent --- fs/xfs/xfs_super.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 7326b21b32d1..0a771e1390e7 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -2413,10 +2413,33 @@ 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; + + if (mp) { + /* + * If an error occurs before ownership the xfs_mount + * info struct is passed to xfs by the VFS (by assigning + * it to sb->s_fs_info and clearing the corresponding + * fs_context field, done before calling fill super via + * .get_tree()) there may be some strings to cleanup. + */ + if (mp->m_logname) + kfree(mp->m_logname); + if (mp->m_rtname) + kfree(mp->m_rtname); + 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 Mon Jun 24 02:59:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11012103 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8EB8917D2 for ; Mon, 24 Jun 2019 03:08:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7EA9528AF8 for ; Mon, 24 Jun 2019 03:08:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 734AD28B08; Mon, 24 Jun 2019 03:08:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0C91E28AF8 for ; Mon, 24 Jun 2019 03:08:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727135AbfFXDIm (ORCPT ); Sun, 23 Jun 2019 23:08:42 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33430 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726858AbfFXDIm (ORCPT ); Sun, 23 Jun 2019 23:08:42 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A8AACVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgVYEAQELAYQshBaTSQaLCYUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE3Bg4BAwEBAQQBAQEBBAGQewIBAyMEUhAYDQImAgJHEAYThRmiSXF+MxqKEYEMKAGBYYoTeIEHgRGDUIdOglgEjkqFHFs/lQkJghaTfQyNIAOKGIQQoieBek0uCoMnkRFlkDIBAQ X-IPAS-Result: A2A8AACVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgVYEAQELAYQshBaTSQaLCYUXi3cJAQEBAQEBAQEBNwEBAYQ6AwICgwE3Bg4BAwEBAQQBAQEBBAGQewIBAyMEUhAYDQImAgJHEAYThRmiSXF+MxqKEYEMKAGBYYoTeIEHgRGDUIdOglgEjkqFHFs/lQkJghaTfQyNIAOKGIQQoieBek0uCoMnkRFlkDIBAQ X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015868" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:59:09 +0800 Subject: [PATCH 08/10] xfs: mount-api - switch to new mount-api From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:59:07 +0800 Message-ID: <156134514772.2519.274012421344093746.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP The infrastructure needed to use the new mount-api is now in place, switch over to use it. Also remove Opt_err enum as it's no longer used. Signed-off-by: Ian Kent --- fs/xfs/xfs_super.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 0a771e1390e7..6e6eace31e07 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -71,7 +71,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, + Opt_discard, Opt_nodiscard, Opt_dax, }; static const match_table_t tokens = { @@ -118,7 +118,6 @@ static const match_table_t tokens = { {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}, }; static const struct fs_parameter_spec xfs_param_specs[] = { @@ -2407,7 +2406,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, @@ -2442,10 +2440,76 @@ 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 = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL); + if (!mp) { + kfree(ctx); + return -ENOMEM; + } + + spin_lock_init(&mp->m_sb_lock); + spin_lock_init(&mp->m_agirotor_lock); + INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC); + spin_lock_init(&mp->m_perag_lock); + mutex_init(&mp->m_growlock); + atomic_set(&mp->m_active_trans, 0); + INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); + INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker); + INIT_DELAYED_WORK(&mp->m_cowblocks_work, xfs_cowblocks_worker); + mp->m_kobj.kobject.kset = xfs_kset; + /* + * We don't create the finobt per-ag space reservation until after log + * recovery, so we must set this to true so that an ifree transaction + * started during log recovery will not depend on space reservations + * for finobt expansion. + */ + mp->m_finobt_nores = true; + + /* + * 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 Mon Jun 24 02:59:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Kent X-Patchwork-Id: 11012097 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2F67676 for ; Mon, 24 Jun 2019 03:08:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1DCBF28AF8 for ; Mon, 24 Jun 2019 03:08:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1028F28B0A; Mon, 24 Jun 2019 03:08:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0B5BD28AF8 for ; Mon, 24 Jun 2019 03:08:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727065AbfFXDId (ORCPT ); Sun, 23 Jun 2019 23:08:33 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33399 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726981AbfFXDId (ORCPT ); Sun, 23 Jun 2019 23:08:33 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXihCBZwkBAQEBAQEBAQE3AQEBhDoDAgKDATgTAQMBAQEEAQEBAQQBkHsCAQMjBFIQGA0CJgICRxAGE4UZoklxfjMaihGBDCiBYooTeIEHgRABM4MdhCkDgyKCWASLcgovgh+FHFs/apQfCYIWk30MghyLBAMQigiEEIpFl2OBeU0uCoMngk0Xji1ljWGCUQEB X-IPAS-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXihCBZwkBAQEBAQEBAQE3AQEBhDoDAgKDATgTAQMBAQEEAQEBAQQBkHsCAQMjBFIQGA0CJgICRxAGE4UZoklxfjMaihGBDCiBYooTeIEHgRABM4MdhCkDgyKCWASLcgovgh+FHFs/apQfCYIWk30MghyLBAMQigiEEIpFl2OBeU0uCoMngk0Xji1ljWGCUQEB X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015929" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:59:16 +0800 Subject: [PATCH 09/10] xfs: mount-api - remove legacy mount functions From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:59:15 +0800 Message-ID: <156134515477.2519.17589095049157758592.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP Now that the new mount-api is being used the old mount functions can be removed. Signed-off-by: Ian Kent --- fs/xfs/xfs_super.c | 551 ---------------------------------------------------- 1 file changed, 551 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 6e6eace31e07..643b40e8a328 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -196,304 +196,6 @@ 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; -} - -/* - * 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; - substring_t args[MAX_OPT_ARGS]; - int dsunit = 0; - int dswidth = 0; - int iosize = 0; - uint8_t iosizelog = 0; - - /* - * 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) { - int token; - - 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: - case Opt_biosize: - 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; - } - } - - /* - * 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) && (dsunit || 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 ((dsunit && !dswidth) || (!dsunit && dswidth)) { - xfs_warn(mp, "sunit and swidth must be specified together"); - return -EINVAL; - } - - if (dsunit && (dswidth % dsunit != 0)) { - xfs_warn(mp, - "stripe width (%d) must be a multiple of the stripe unit (%d)", - dswidth, dsunit); - return -EINVAL; - } - -done: - if (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; - } - - 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 (iosizelog) { - if (iosizelog > XFS_MAX_IO_LOG || - iosizelog < XFS_MIN_IO_LOG) { - xfs_warn(mp, "invalid log iosize: %d [not %d-%d]", - 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; - } - - return 0; -} - struct xfs_fs_context { int dsunit; int dswidth; @@ -1453,181 +1155,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_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)) { - 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; - } - - /* 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); - 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_validate_params( struct xfs_mount *mp, @@ -2051,38 +1578,6 @@ xfs_destroy_percpu_counters( percpu_counter_destroy(&mp->m_delalloc_blks); } -static struct xfs_mount * -xfs_mount_alloc( - struct super_block *sb) -{ - struct xfs_mount *mp; - - mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL); - 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); - spin_lock_init(&mp->m_perag_lock); - mutex_init(&mp->m_growlock); - atomic_set(&mp->m_active_trans, 0); - INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); - INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker); - INIT_DELAYED_WORK(&mp->m_cowblocks_work, xfs_cowblocks_worker); - mp->m_kobj.kobject.kset = xfs_kset; - /* - * We don't create the finobt per-ag space reservation until after log - * recovery, so we must set this to true so that an ifree transaction - * started during log recovery will not depend on space reservations - * for finobt expansion. - */ - mp->m_finobt_nores = true; - return mp; -} - - STATIC int __xfs_fs_fill_super( struct xfs_mount *mp, @@ -2260,42 +1755,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 = NULL; - int 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; - - 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); -out: - return error; -} - STATIC int xfs_fill_super( struct super_block *sb, @@ -2367,16 +1826,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, From patchwork Mon Jun 24 02:59: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: 11012099 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 401C7186E for ; Mon, 24 Jun 2019 03:08:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2DF0C28B02 for ; Mon, 24 Jun 2019 03:08:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2257128B1E; Mon, 24 Jun 2019 03:08:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C730D28B02 for ; Mon, 24 Jun 2019 03:08:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726981AbfFXDIe (ORCPT ); Sun, 23 Jun 2019 23:08:34 -0400 Received: from icp-osb-irony-out1.external.iinet.net.au ([203.59.1.210]:33411 "EHLO icp-osb-irony-out1.external.iinet.net.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726980AbfFXDIe (ORCPT ); Sun, 23 Jun 2019 23:08:34 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXihCBZwkBAQEBAQEBAQE3AQEBhDoDAgKDATgTAQMBAQEEAQEBAQQBkHsCAQMjVhAYDQImAgJHEAYThRmiSXGBMRqKEYEMKIFiihN4gQeBRIMdhCyDIoJYBI5KhXc/lQkJghaTfQyNIAOKGC2DY6IogXlNLgqDJ4JNF44tZZAyAQE X-IPAS-Result: A2AJAQCVOxBd/3Gu0HYNVxwBAQEEAQEHBAEBgWeELYQWk0kGgRGJeIUXihCBZwkBAQEBAQEBAQE3AQEBhDoDAgKDATgTAQMBAQEEAQEBAQQBkHsCAQMjVhAYDQImAgJHEAYThRmiSXGBMRqKEYEMKIFiihN4gQeBRIMdhCyDIoJYBI5KhXc/lQkJghaTfQyNIAOKGC2DY6IogXlNLgqDJ4JNF44tZZAyAQE X-IronPort-AV: E=Sophos;i="5.63,410,1557158400"; d="scan'208";a="221015963" Received: from unknown (HELO [192.168.1.222]) ([118.208.174.113]) by icp-osb-irony-out1.iinet.net.au with ESMTP; 24 Jun 2019 10:59:22 +0800 Subject: [PATCH 10/10] xfs: mount-api - rename xfs_fill_super() From: Ian Kent To: linux-xfs Cc: Dave Chinner , David Howells , Al Viro Date: Mon, 24 Jun 2019 10:59:21 +0800 Message-ID: <156134516161.2519.11373830976371295990.stgit@fedora-28> In-Reply-To: <156134510205.2519.16185588460828778620.stgit@fedora-28> References: <156134510205.2519.16185588460828778620.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 X-Virus-Scanned: ClamAV using ClamSMTP Now the legacy mount functions have been removed xfs_fill_super() can be renamed to xfs_fs_fill_super() in keeping with the previous xfs naming convention. Signed-off-by: Ian Kent Reviewed-by: Darrick J. Wong --- fs/xfs/xfs_super.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 643b40e8a328..38f3af44fbbf 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1756,7 +1756,7 @@ __xfs_fs_fill_super( } STATIC int -xfs_fill_super( +xfs_fs_fill_super( struct super_block *sb, struct fs_context *fc) { @@ -1798,7 +1798,7 @@ STATIC int xfs_get_tree( struct fs_context *fc) { - return vfs_get_block_super(fc, xfs_fill_super); + return vfs_get_block_super(fc, xfs_fs_fill_super); } STATIC void