From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E81F6C433E0 for ; Thu, 9 Jul 2020 14:41:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D2C672073A for ; Thu, 9 Jul 2020 14:41:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726517AbgGIOlA (ORCPT ); Thu, 9 Jul 2020 10:41:00 -0400 Received: from mx2.suse.de ([195.135.220.15]:39496 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726410AbgGIOlA (ORCPT ); Thu, 9 Jul 2020 10:41:00 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 384D2AB7D; Thu, 9 Jul 2020 14:40:58 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 46BD41E12C3; Thu, 9 Jul 2020 16:40:58 +0200 (CEST) From: Jan Kara To: Ted Tso Cc: , Jan Kara Subject: [PATCH] mke2fs: Warn if fs block size is incompatible with DAX Date: Thu, 9 Jul 2020 16:40:57 +0200 Message-Id: <20200709144057.21333-1-jack@suse.cz> X-Mailer: git-send-email 2.16.4 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org If we are creating filesystem on DAX capable device, warn if set block size is incompatible with DAX to give admin some hint why DAX might not be available. Signed-off-by: Jan Kara --- configure.ac | 3 +++ misc/mke2fs.c | 81 ++++++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/configure.ac b/configure.ac index 18e434bc6ebc..7d9210740387 100644 --- a/configure.ac +++ b/configure.ac @@ -1142,6 +1142,9 @@ if test -n "$BLKID_CMT"; then AC_CHECK_LIB(blkid, blkid_probe_get_topology, AC_DEFINE(HAVE_BLKID_PROBE_GET_TOPOLOGY, 1, [Define to 1 if blkid has blkid_probe_get_topology])) + AC_CHECK_LIB(blkid, blkid_topology_get_dax, + AC_DEFINE(HAVE_BLKID_TOPOLOGY_GET_DAX, 1, + [Define to 1 if blkid has blkid_topology_get_dax])) AC_CHECK_LIB(blkid, blkid_probe_enable_partitions, AC_DEFINE(HAVE_BLKID_PROBE_ENABLE_PARTITIONS, 1, [Define to 1 if blkid has blkid_probe_enable_partitions])) diff --git a/misc/mke2fs.c b/misc/mke2fs.c index c90dcf0e87c1..8c8f5ea467d3 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -1468,23 +1468,30 @@ int get_bool_from_profile(char **types, const char *opt, int def_val) extern const char *mke2fs_default_profile; static const char *default_files[] = { "", 0 }; +struct device_param { + unsigned long min_io; /* prefered minimum IO size */ + unsigned long opt_io; /* optimal IO size */ + unsigned long alignment_offset; /* alignment offset wrt physical block size */ + unsigned int dax:1; /* supports dax? */ +}; + #ifdef HAVE_BLKID_PROBE_GET_TOPOLOGY /* * Sets the geometry of a device (stripe/stride), and returns the * device's alignment offset, if any, or a negative error. */ static int get_device_geometry(const char *file, - struct ext2_super_block *param, - unsigned int psector_size) + unsigned int blocksize, + unsigned int psector_size, + struct device_param *dev_param) { int rc = -1; - unsigned int blocksize; blkid_probe pr; blkid_topology tp; - unsigned long min_io; - unsigned long opt_io; struct stat statbuf; + memset(dev_param, 0, sizeof(*dev_param)); + /* Nothing to do for a regular file */ if (!stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) return 0; @@ -1497,23 +1504,20 @@ static int get_device_geometry(const char *file, if (!tp) goto out; - min_io = blkid_topology_get_minimum_io_size(tp); - opt_io = blkid_topology_get_optimal_io_size(tp); - blocksize = EXT2_BLOCK_SIZE(param); - if ((min_io == 0) && (psector_size > blocksize)) - min_io = psector_size; - if ((opt_io == 0) && min_io) - opt_io = min_io; - if ((opt_io == 0) && (psector_size > blocksize)) - opt_io = psector_size; - - /* setting stripe/stride to blocksize is pointless */ - if (min_io > blocksize) - param->s_raid_stride = min_io / blocksize; - if (opt_io > blocksize) - param->s_raid_stripe_width = opt_io / blocksize; - - rc = blkid_topology_get_alignment_offset(tp); + dev_param->min_io = blkid_topology_get_minimum_io_size(tp); + dev_param->opt_io = blkid_topology_get_optimal_io_size(tp); + if ((dev_param->min_io == 0) && (psector_size > blocksize)) + dev_param->min_io = psector_size; + if ((dev_param->opt_io == 0) && dev_param->min_io > 0) + dev_param->opt_io = dev_param->min_io; + if ((dev_param->opt_io == 0) && (psector_size > blocksize)) + dev_param->opt_io = psector_size; + + dev_param->alignment_offset = blkid_topology_get_alignment_offset(tp); +#ifdef HAVE_BLKID_TOPOLOGY_GET_DAX + dev_param->dax = blkid_topology_get_dax(tp); +#endif + rc = 0; out: blkid_free_probe(pr); return rc; @@ -1562,6 +1566,7 @@ static void PRS(int argc, char *argv[]) int use_bsize; char *newpath; int pathlen = sizeof(PATH_SET) + 1; + struct device_param dev_param; if (oldpath) pathlen += strlen(oldpath); @@ -2307,17 +2312,35 @@ profile_error: } #ifdef HAVE_BLKID_PROBE_GET_TOPOLOGY - retval = get_device_geometry(device_name, &fs_param, - (unsigned int) psector_size); + retval = get_device_geometry(device_name, blocksize, + psector_size, &dev_param); if (retval < 0) { fprintf(stderr, _("warning: Unable to get device geometry for %s\n"), device_name); - } else if (retval) { - printf(_("%s alignment is offset by %lu bytes.\n"), - device_name, retval); - printf(_("This may result in very poor performance, " - "(re)-partitioning suggested.\n")); + } else { + /* setting stripe/stride to blocksize is pointless */ + if (dev_param.min_io > blocksize) + fs_param.s_raid_stride = dev_param.min_io / blocksize; + if (dev_param.opt_io > blocksize) { + fs_param.s_raid_stripe_width = + dev_param.opt_io / blocksize; + } + + if (dev_param.alignment_offset) { + printf(_("%s alignment is offset by %lu bytes.\n"), + device_name, dev_param.alignment_offset); + printf(_("This may result in very poor performance, " + "(re)-partitioning suggested.\n")); + } + + if (dev_param.dax && blocksize != sys_page_size) { + fprintf(stderr, + _("%s is capable of DAX but current block size " + "%u is different from system page size %u so " + "filesystem will not support DAX.\n"), + device_name, blocksize, sys_page_size); + } } #endif -- 2.16.4