From patchwork Wed Oct 3 18:15:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Verma, Vishal L" X-Patchwork-Id: 10625155 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 619E815E8 for ; Wed, 3 Oct 2018 18:16:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 476D428D55 for ; Wed, 3 Oct 2018 18:16:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3B6AF28F01; Wed, 3 Oct 2018 18:16:08 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C778928D55 for ; Wed, 3 Oct 2018 18:16:07 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 8D4A721A07A92; Wed, 3 Oct 2018 11:16:07 -0700 (PDT) X-Original-To: linux-nvdimm@lists.01.org Delivered-To: linux-nvdimm@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=vishal.l.verma@intel.com; receiver=linux-nvdimm@lists.01.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 1FBE421962301 for ; Wed, 3 Oct 2018 11:16:05 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Oct 2018 11:16:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,336,1534834800"; d="scan'208";a="75931286" Received: from vverma7-desk1.lm.intel.com ([10.232.112.170]) by fmsmga008.fm.intel.com with ESMTP; 03 Oct 2018 11:15:12 -0700 From: Vishal Verma To: Subject: [ndctl PATCH v2 1/5] ndctl, lib: refactor badblocks retrieval routines Date: Wed, 3 Oct 2018 12:15:02 -0600 Message-Id: <20181003181506.17682-1-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.17.1 X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP From: Dan Williams The kernel provides two locations in sysfs that contain badblocks information. The only one ndctl currently uses is region based badblocks. The problem with this is that this requires root privileges to calculate namespace-offset badblocks. Since the kernel already provides a world readable location for namespace badblocks, we can fall back to that. Refactor the badblocks retrieval routines to use a bb_iter structure that contains information for what badblocks file in sysfs to use, to prepare for a direct namespace-badblocks fallback. Signed-off-by: Dan Williams [vishal] remove an error print triggered by opening an invalid file Signed-off-by: Vishal Verma --- ndctl/lib/libndctl.c | 141 +++++++++++++++++++++++-------------------- ndctl/lib/private.h | 6 ++ 2 files changed, 82 insertions(+), 65 deletions(-) No changes since v1 diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c index 481b110..d58be47 100644 --- a/ndctl/lib/libndctl.c +++ b/ndctl/lib/libndctl.c @@ -178,8 +178,7 @@ struct ndctl_region { int state; unsigned long long cookie; } iset; - FILE *badblocks; - struct badblock bb; + struct badblocks_iter bb_iter; enum ndctl_persistence_domain persistence_domain; /* file descriptor for deep flush sysfs entry */ int flush_fd; @@ -376,6 +375,77 @@ NDCTL_EXPORT struct ndctl_ctx *ndctl_ref(struct ndctl_ctx *ctx) return ctx; } +static void badblocks_iter_free(struct badblocks_iter *bb_iter) +{ + if (bb_iter->file) + fclose(bb_iter->file); +} + +static int badblocks_iter_init(struct badblocks_iter *bb_iter, const char *path) +{ + char *bb_path; + int rc = 0; + + /* if the file is already open */ + if (bb_iter->file) { + fclose(bb_iter->file); + bb_iter->file = NULL; + } + + if (asprintf(&bb_path, "%s/badblocks", path) < 0) + return -errno; + + bb_iter->file = fopen(bb_path, "re"); + if (!bb_iter->file) { + rc = -errno; + free(bb_path); + return rc; + } + + free(bb_path); + return rc; +} + +static struct badblock *badblocks_iter_next(struct badblocks_iter *bb_iter) +{ + int rc; + char *buf = NULL; + size_t rlen = 0; + + if (!bb_iter->file) + return NULL; + + rc = getline(&buf, &rlen, bb_iter->file); + if (rc == -1) { + free(buf); + return NULL; + } + + rc = sscanf(buf, "%llu %u", &bb_iter->bb.offset, &bb_iter->bb.len); + free(buf); + if (rc != 2) { + fclose(bb_iter->file); + bb_iter->file = NULL; + bb_iter->bb.offset = 0; + bb_iter->bb.len = 0; + return NULL; + } + + return &bb_iter->bb; +} + +static struct badblock *badblocks_iter_first(struct badblocks_iter *bb_iter, + struct ndctl_ctx *ctx, const char *path) +{ + int rc; + + rc = badblocks_iter_init(bb_iter, path); + if (rc < 0) + return NULL; + + return badblocks_iter_next(bb_iter); +} + static void free_namespace(struct ndctl_namespace *ndns, struct list_head *head) { struct ndctl_bb *bb, *next; @@ -511,8 +581,7 @@ static void free_region(struct ndctl_region *region) kmod_module_unref(region->module); free(region->region_buf); free(region->region_path); - if (region->badblocks) - fclose(region->badblocks); + badblocks_iter_free(®ion->bb_iter); if (region->flush_fd > 0) close(region->flush_fd); free(region); @@ -2253,73 +2322,15 @@ NDCTL_EXPORT int ndctl_region_get_numa_node(struct ndctl_region *region) return region->numa_node; } -static int regions_badblocks_init(struct ndctl_region *region) -{ - struct ndctl_ctx *ctx = ndctl_region_get_ctx(region); - char *bb_path; - int rc = 0; - - /* if the file is already open */ - if (region->badblocks) { - fclose(region->badblocks); - region->badblocks = NULL; - } - - if (asprintf(&bb_path, "%s/badblocks", - region->region_path) < 0) { - rc = -errno; - err(ctx, "region badblocks path allocation failure\n"); - return rc; - } - - region->badblocks = fopen(bb_path, "re"); - if (!region->badblocks) { - rc = -errno; - free(bb_path); - return rc; - } - - free(bb_path); - return rc; -} - NDCTL_EXPORT struct badblock *ndctl_region_get_next_badblock(struct ndctl_region *region) { - int rc; - char *buf = NULL; - size_t rlen = 0; - - if (!region->badblocks) - return NULL; - - rc = getline(&buf, &rlen, region->badblocks); - if (rc == -1) { - free(buf); - return NULL; - } - - rc = sscanf(buf, "%llu %u", ®ion->bb.offset, ®ion->bb.len); - free(buf); - if (rc != 2) { - fclose(region->badblocks); - region->badblocks = NULL; - region->bb.offset = 0; - region->bb.len = 0; - return NULL; - } - - return ®ion->bb; + return badblocks_iter_next(®ion->bb_iter); } NDCTL_EXPORT struct badblock *ndctl_region_get_first_badblock(struct ndctl_region *region) { - int rc; - - rc = regions_badblocks_init(region); - if (rc < 0) - return NULL; - - return ndctl_region_get_next_badblock(region); + return badblocks_iter_first(®ion->bb_iter, + ndctl_region_get_ctx(region), region->region_path); } NDCTL_EXPORT enum ndctl_persistence_domain diff --git a/ndctl/lib/private.h b/ndctl/lib/private.h index b6e438a..d8ed614 100644 --- a/ndctl/lib/private.h +++ b/ndctl/lib/private.h @@ -185,6 +185,11 @@ struct ndctl_lbasize { int num; }; +struct badblocks_iter { + struct badblock bb; + FILE *file; +}; + /** * struct ndctl_namespace - device claimed by the nd_blk or nd_pmem driver * @module: kernel module @@ -209,6 +214,7 @@ struct ndctl_namespace { int generation; unsigned long long resource, size; enum ndctl_namespace_mode enforce_mode; + struct badblocks_iter bb_iter; char *alt_name; uuid_t uuid; struct ndctl_lbasize lbasize; From patchwork Wed Oct 3 18:15:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Verma, Vishal L" X-Patchwork-Id: 10625157 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 3D50A1515 for ; Wed, 3 Oct 2018 18:16:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2CEDF28D55 for ; Wed, 3 Oct 2018 18:16:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 20D6528F01; Wed, 3 Oct 2018 18:16:09 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C0EFE28D55 for ; Wed, 3 Oct 2018 18:16:08 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id ABEA021161231; Wed, 3 Oct 2018 11:16:08 -0700 (PDT) X-Original-To: linux-nvdimm@lists.01.org Delivered-To: linux-nvdimm@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=vishal.l.verma@intel.com; receiver=linux-nvdimm@lists.01.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 1AF9F21161209 for ; Wed, 3 Oct 2018 11:16:07 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Oct 2018 11:16:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,336,1534834800"; d="scan'208";a="75931288" Received: from vverma7-desk1.lm.intel.com ([10.232.112.170]) by fmsmga008.fm.intel.com with ESMTP; 03 Oct 2018 11:15:12 -0700 From: Vishal Verma To: Subject: [ndctl PATCH v2 2/5] ndctl, lib: add APIs for retrieving namespace badblocks Date: Wed, 3 Oct 2018 12:15:03 -0600 Message-Id: <20181003181506.17682-2-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181003181506.17682-1-vishal.l.verma@intel.com> References: <20181003181506.17682-1-vishal.l.verma@intel.com> X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP From: Dan Williams Use the new bb_iter mechanism to provide APIs that retrieve the namespace badblocks from the kernel's block device representation in sysfs. This paves the way for a namespace based fallback if region-badblocks are unavailable. Signed-off-by: Dan Williams [vishal] add the new global symbols to libndctl.sym [vishal] fix the badblocks path to remove the trailing 'badblocks' Signed-off-by: Vishal Verma --- ndctl/lib/libndctl.c | 42 ++++++++++++++++++++++++++++++++++++++++++ ndctl/lib/libndctl.sym | 6 ++++++ ndctl/libndctl.h | 6 ++++++ 3 files changed, 54 insertions(+) No changes since v1 diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c index d58be47..d341100 100644 --- a/ndctl/lib/libndctl.c +++ b/ndctl/lib/libndctl.c @@ -3610,6 +3610,48 @@ NDCTL_EXPORT int ndctl_namespace_is_enabled(struct ndctl_namespace *ndns) return is_enabled(ndctl_namespace_get_bus(ndns), path); } +NDCTL_EXPORT struct badblock *ndctl_namespace_get_next_badblock( + struct ndctl_namespace *ndns) +{ + return badblocks_iter_next(&ndns->bb_iter); +} + +NDCTL_EXPORT struct badblock *ndctl_namespace_get_first_badblock( + struct ndctl_namespace *ndns) +{ + struct ndctl_btt *btt = ndctl_namespace_get_btt(ndns); + struct ndctl_pfn *pfn = ndctl_namespace_get_pfn(ndns); + struct ndctl_dax *dax = ndctl_namespace_get_dax(ndns); + struct ndctl_ctx *ctx = ndctl_namespace_get_ctx(ndns); + const char *dev = ndctl_namespace_get_devname(ndns); + char path[SYSFS_ATTR_SIZE]; + ssize_t len = sizeof(path); + const char *bdev; + + if (btt || dax) { + dbg(ctx, "%s: badblocks not supported for %s\n", dev, + btt ? "btt" : "device-dax"); + return NULL; + } + + if (pfn) + bdev = ndctl_pfn_get_block_device(pfn); + else + bdev = ndctl_namespace_get_block_device(ndns); + + if (!bdev) { + dbg(ctx, "%s: failed to determine block device\n", dev); + return NULL; + } + + if (snprintf(path, len, "/sys/block/%s", bdev) >= len) { + err(ctx, "%s: buffer too small!\n", dev); + return NULL; + } + + return badblocks_iter_first(&ndns->bb_iter, ctx, path); +} + static int ndctl_bind(struct ndctl_ctx *ctx, struct kmod_module *module, const char *devname) { diff --git a/ndctl/lib/libndctl.sym b/ndctl/lib/libndctl.sym index a6849ee..185ee4a 100644 --- a/ndctl/lib/libndctl.sym +++ b/ndctl/lib/libndctl.sym @@ -378,3 +378,9 @@ global: ndctl_region_get_max_available_extent; ndctl_cmd_smart_inject_ctrl_temperature; } LIBNDCTL_16; + +LIBNDCTL_18 { +global: + ndctl_namespace_get_first_badblock; + ndctl_namespace_get_next_badblock; +} LIBNDCTL_17; diff --git a/ndctl/libndctl.h b/ndctl/libndctl.h index 83d6c6c..500c7de 100644 --- a/ndctl/libndctl.h +++ b/ndctl/libndctl.h @@ -439,6 +439,12 @@ struct ndctl_namespace *ndctl_namespace_get_next(struct ndctl_namespace *ndns); ndns != NULL; \ ndns = _ndns, \ _ndns = _ndns ? ndctl_namespace_get_next(_ndns) : NULL) +struct badblock *ndctl_namespace_get_first_badblock(struct ndctl_namespace *ndns); +struct badblock *ndctl_namespace_get_next_badblock(struct ndctl_namespace *ndns); +#define ndctl_namespace_badblock_foreach(ndns, badblock) \ + for (badblock = ndctl_namespace_get_first_badblock(ndns); \ + badblock != NULL; \ + badblock = ndctl_namespace_get_next_badblock(ndns)) struct ndctl_ctx *ndctl_namespace_get_ctx(struct ndctl_namespace *ndns); struct ndctl_bus *ndctl_namespace_get_bus(struct ndctl_namespace *ndns); struct ndctl_region *ndctl_namespace_get_region(struct ndctl_namespace *ndns); From patchwork Wed Oct 3 18:15:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Verma, Vishal L" X-Patchwork-Id: 10625163 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 2F3F61515 for ; Wed, 3 Oct 2018 18:16:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1F05D28D55 for ; Wed, 3 Oct 2018 18:16:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1393B28F01; Wed, 3 Oct 2018 18:16:11 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D292328D55 for ; Wed, 3 Oct 2018 18:16:10 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id F16642194D3B3; Wed, 3 Oct 2018 11:16:08 -0700 (PDT) X-Original-To: linux-nvdimm@lists.01.org Delivered-To: linux-nvdimm@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=vishal.l.verma@intel.com; receiver=linux-nvdimm@lists.01.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 68BBE21161209 for ; Wed, 3 Oct 2018 11:16:07 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Oct 2018 11:16:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,336,1534834800"; d="scan'208";a="75931290" Received: from vverma7-desk1.lm.intel.com ([10.232.112.170]) by fmsmga008.fm.intel.com with ESMTP; 03 Oct 2018 11:15:12 -0700 From: Vishal Verma To: Subject: [ndctl PATCH v2 3/5] util/json: fix an error check for region resource Date: Wed, 3 Oct 2018 12:15:04 -0600 Message-Id: <20181003181506.17682-3-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181003181506.17682-1-vishal.l.verma@intel.com> References: <20181003181506.17682-1-vishal.l.verma@intel.com> X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP The return type of ndctl_region_get_resource() is 'unsigned long long', and therefore the error checking for it should be done against ULLONG_MAX. Fix an instance where we were checking against ULONG_MAX. Reviewed-by: Dan Williams Signed-off-by: Vishal Verma --- util/json.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/json.c b/util/json.c index 2d15859..30b56c3 100644 --- a/util/json.c +++ b/util/json.c @@ -470,7 +470,7 @@ struct json_object *util_region_badblocks_to_json(struct ndctl_region *region, /* get start address of region */ addr = ndctl_region_get_resource(region); - if (addr == ULONG_MAX) + if (addr == ULLONG_MAX) goto err_array; /* get address of bad block */ From patchwork Wed Oct 3 18:15:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Verma, Vishal L" X-Patchwork-Id: 10625159 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 CB5EB18A7 for ; Wed, 3 Oct 2018 18:16:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BA4C628D55 for ; Wed, 3 Oct 2018 18:16:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AE63028F24; Wed, 3 Oct 2018 18:16:09 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7175028D55 for ; Wed, 3 Oct 2018 18:16:09 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id C3F3A211616A3; Wed, 3 Oct 2018 11:16:08 -0700 (PDT) X-Original-To: linux-nvdimm@lists.01.org Delivered-To: linux-nvdimm@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=vishal.l.verma@intel.com; receiver=linux-nvdimm@lists.01.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 46A5021A07A92 for ; Wed, 3 Oct 2018 11:16:07 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Oct 2018 11:16:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,336,1534834800"; d="scan'208";a="75931301" Received: from vverma7-desk1.lm.intel.com ([10.232.112.170]) by fmsmga008.fm.intel.com with ESMTP; 03 Oct 2018 11:15:13 -0700 From: Vishal Verma To: Subject: [ndctl PATCH v2 4/5] util/json: Add comments around re-checking the UTIL_JSON_MEDIA_ERRORS flag Date: Wed, 3 Oct 2018 12:15:05 -0600 Message-Id: <20181003181506.17682-4-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181003181506.17682-1-vishal.l.verma@intel.com> References: <20181003181506.17682-1-vishal.l.verma@intel.com> X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP Add comments to clarify that in the various ndctl_*_babdlock_foreach loops where we compose the json output, the additional check for UTIL_JSON_MEDIA_ERRORS is valid because even if we're not printing media errors, we still want the badblock_count to be updated, which requires a full badblocks traversal. Cc: Dan Williams Suggested-by: Dan Williams Signed-off-by: Vishal Verma Reviewed-by: Dan Williams --- util/json.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/util/json.c b/util/json.c index 30b56c3..702ccf4 100644 --- a/util/json.c +++ b/util/json.c @@ -465,6 +465,7 @@ struct json_object *util_region_badblocks_to_json(struct ndctl_region *region, bbs += bb->len; + /* recheck so we can still get the badblocks_count from above */ if (!(flags & UTIL_JSON_MEDIA_ERRORS)) continue; @@ -554,6 +555,7 @@ static struct json_object *dev_badblocks_to_json(struct ndctl_region *region, bbs += len; + /* recheck so we can still get the badblocks_count from above */ if (!(flags & UTIL_JSON_MEDIA_ERRORS)) continue; From patchwork Wed Oct 3 18:15:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Verma, Vishal L" X-Patchwork-Id: 10625161 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 2D60C1515 for ; Wed, 3 Oct 2018 18:16:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1C4F228D55 for ; Wed, 3 Oct 2018 18:16:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1074428E1A; Wed, 3 Oct 2018 18:16:10 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A531D28F01 for ; Wed, 3 Oct 2018 18:16:09 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id DE198211616AB; Wed, 3 Oct 2018 11:16:08 -0700 (PDT) X-Original-To: linux-nvdimm@lists.01.org Delivered-To: linux-nvdimm@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=vishal.l.verma@intel.com; receiver=linux-nvdimm@lists.01.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 5915621A00AE6 for ; Wed, 3 Oct 2018 11:16:07 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Oct 2018 11:16:07 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,336,1534834800"; d="scan'208";a="75931303" Received: from vverma7-desk1.lm.intel.com ([10.232.112.170]) by fmsmga008.fm.intel.com with ESMTP; 03 Oct 2018 11:15:13 -0700 From: Vishal Verma To: Subject: [ndctl PATCH v2 5/5] util/json: add a util_namespace_badblocks_to_json() helper Date: Wed, 3 Oct 2018 12:15:06 -0600 Message-Id: <20181003181506.17682-5-vishal.l.verma@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181003181506.17682-1-vishal.l.verma@intel.com> References: <20181003181506.17682-1-vishal.l.verma@intel.com> X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP When ndctl list --media-errors is invoked, we rely upon the 'region' badblocks provided by the kernel, and reference them against the namespace start to report namespace badblocks. This can fail for non-root users, as the region and namespace resource information is root-only. However the kernel also provides block-device badblocks information in sysfs, and that is world readable. Provide a new helper to retrieve this information, and use it as a fallback when the region based badblocks are unavailable. Note that when falling back to the namespace based badblocks, we are unable to retrieve the DIMM on which the badblocks are present, since we still need root privileges for both getting the resource information, and for the address translation command. Cc: Dan Williams Reviewed-by: Dan Williams Signed-off-by: Vishal Verma --- util/json.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/util/json.c b/util/json.c index 702ccf4..5c3424e 100644 --- a/util/json.c +++ b/util/json.c @@ -509,6 +509,56 @@ struct json_object *util_region_badblocks_to_json(struct ndctl_region *region, return NULL; } +static struct json_object *util_namespace_badblocks_to_json( + struct ndctl_namespace *ndns, + unsigned int *bb_count, unsigned long flags) +{ + struct json_object *jbb = NULL, *jbbs = NULL, *jobj; + struct badblock *bb; + int bbs = 0; + + if (flags & UTIL_JSON_MEDIA_ERRORS) { + jbbs = json_object_new_array(); + if (!jbbs) + return NULL; + } else + return NULL; + + ndctl_namespace_badblock_foreach(ndns, bb) { + bbs += bb->len; + + /* recheck so we can still get the badblocks_count from above */ + if (!(flags & UTIL_JSON_MEDIA_ERRORS)) + continue; + + jbb = json_object_new_object(); + if (!jbb) + goto err_array; + + jobj = json_object_new_int64(bb->offset); + if (!jobj) + goto err; + json_object_object_add(jbb, "offset", jobj); + + jobj = json_object_new_int(bb->len); + if (!jobj) + goto err; + json_object_object_add(jbb, "length", jobj); + json_object_array_add(jbbs, jbb); + } + + *bb_count = bbs; + + if (bbs) + return jbbs; + + err: + json_object_put(jbb); + err_array: + json_object_put(jbbs); + return NULL; +} + static struct json_object *dev_badblocks_to_json(struct ndctl_region *region, unsigned long long dev_begin, unsigned long long dev_size, unsigned int *bb_count, unsigned long flags) @@ -599,8 +649,11 @@ static struct json_object *util_pfn_badblocks_to_json(struct ndctl_pfn *pfn, unsigned long long pfn_begin, pfn_size; pfn_begin = ndctl_pfn_get_resource(pfn); - if (pfn_begin == ULLONG_MAX) - return NULL; + if (pfn_begin == ULLONG_MAX) { + struct ndctl_namespace *ndns = ndctl_pfn_get_namespace(pfn); + + return util_namespace_badblocks_to_json(ndns, bb_count, flags); + } pfn_size = ndctl_pfn_get_size(pfn); if (pfn_size == ULLONG_MAX) @@ -879,10 +932,14 @@ struct json_object *util_namespace_to_json(struct ndctl_namespace *ndns, jbbs = util_dax_badblocks_to_json(dax, &bb_count, flags); else if (btt) util_btt_badblocks_to_json(btt, &bb_count); - else + else { jbbs = util_region_badblocks_to_json( ndctl_namespace_get_region(ndns), &bb_count, flags); + if (!jbbs) + jbbs = util_namespace_badblocks_to_json(ndns, &bb_count, + flags); + } if (bb_count) { jobj = json_object_new_int(bb_count);