Received: by 10.213.65.68 with SMTP id h4csp1993233imn; Thu, 29 Mar 2018 15:16:03 -0700 (PDT) X-Google-Smtp-Source: AIpwx48m898tK7RgwMgqgPRWDe/eStVjKCZi1JGLMqVb5ouUTWMEC/zleqRgZnCUg/eEXtNuKJ+J X-Received: by 10.99.49.74 with SMTP id x71mr6650069pgx.160.1522361763683; Thu, 29 Mar 2018 15:16:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522361763; cv=none; d=google.com; s=arc-20160816; b=GDkGNI7qGf0j4ce3QDjtzOgnGLIkofmhLhAnQPF6U2A5/k229eo68a4Pi5eUJ2eEGv YVOkJErv3Fq+g3X5P58nihyLwW2+OWUpqiOsjZ8SeDqHD1F2OdgfBkJIJ/Aq5PbOtopP V89Cw4LhnClQffNhMIPMwaeKGR3pRaHge/mmmP13aQ1oytwERxizwMYhLe+VKpPkKD4l xRIPawi/f16g3G0FXdoiiAWgpa5b5GFBQLyqTCkedBN8gB+v3BMMtQjya7qsxjVfNABQ Lri23HcWuAk+VNn92KRh7BUlQvQNMJVbKJpXU64G1a8kvflFJvkb0rhpHW1OLB9UNxVT qYDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=PM4Ubrw52+QxO7I8vEn8GFzVch5V5MMU1ndGiD9ehy8=; b=CH6RQawSwrIwoNusDgry8vvdlFTXzETyoXtqN/QXqV3I0VjLhz95ANhnEuJJql/n3/ zl+Jorz0PoIz6clY2w/Cs8hylpqtop6kFUHyN6PI2NrvTwT0AjzM9ucKgc6zTvqI/J6w vnuePkFOydB6fu52ISNay7u+pu7rWXHYhMmI0CfXMINOOIzFLIXmmK59N+NAlVKSvPWQ XgatDZyvr5NUNN1S7yGMPGFUjPdFqY/q+d5yK0mCEgugtfuO68M9T8BDaIuGql9Eshv6 oYbSGQ6+pUy0CHhCh42OMHpt5OJhoTb7FAQIfK955XfFswLZlNDYyp1FCDBUcF5ZU1D4 LkUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=RzBZ7Y77; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l5-v6si7422393pls.144.2018.03.29.15.15.50; Thu, 29 Mar 2018 15:16:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=RzBZ7Y77; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752427AbeC2WHI (ORCPT + 99 others); Thu, 29 Mar 2018 18:07:08 -0400 Received: from mail-lf0-f65.google.com ([209.85.215.65]:42605 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752156AbeC2WHA (ORCPT ); Thu, 29 Mar 2018 18:07:00 -0400 Received: by mail-lf0-f65.google.com with SMTP id a22-v6so10327025lfg.9 for ; Thu, 29 Mar 2018 15:06:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lightnvm-io.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=PM4Ubrw52+QxO7I8vEn8GFzVch5V5MMU1ndGiD9ehy8=; b=RzBZ7Y77So1XnrtIgUskO35xN0sa+TvIipyI8NB80DkPuwJfZEHhxWPXwKe4M/G1PK /ulBpiuuCf/irTFqf+VTPY1iyOhdCW7ZkyU/RcNwwAS2NvYgA8aNOiHd+I1K32jF4R3u 2PuDCB+8Eyfj5xKbNn2JX3PZuPgGPFPXsCcOj3NJznWOAEeGZb0yBYP4V1YPnYUF4ntu UsI38W9/cbT2BFkRFGfu6A1feSqz+7ORBvek9ORsyRzyM+RAUyKm8d2s4onWm/1uggO4 PfVXqPw/yDE9Q99qjwmeTYU+7L5noTqHvG0ABw23rkYHBcWEBH2agH4UX/MsdAXJ7lgx ARkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=PM4Ubrw52+QxO7I8vEn8GFzVch5V5MMU1ndGiD9ehy8=; b=kv5Wyru0HebWmRxS4uEYHtgkycuDsflAZ9Fs5zToOjatAL7pT7fmMkqZpKO+Pxu6NM /BL0aO9VaxOANwytBOFw02hVzORoEc6YKyeoSSC2OL/zuTe8DQSdcndjQprxz2djgy+Q +cd8mx/irEB0nxtzw9i8wRbyYqZ8ucRZcrdHV/g/vbh/82GSztKmCwOx3BOsYgRA5P/5 oj2AGrWnWAdJSkc0aFfkBhWDS4WWTBtf1QOBJh/h7GmHoR9B/3oQXzFUpIefmL0mtF8Q aPCLwPjmCLLr/EGidR+stL1M2cU3Kvrt3RezzUxIg4SLqMZXc+P6T+VFVPvhKpkaJp05 GDGQ== X-Gm-Message-State: AElRT7EunDjT/ejr3iYVoICCxgkEAWzjp4MR8lBprhqseVb9wxhlaGdo D0dCk96CsyLCIqMB/gzr9MboCA== X-Received: by 10.46.136.206 with SMTP id a14mr6825374ljk.96.1522361219112; Thu, 29 Mar 2018 15:06:59 -0700 (PDT) Received: from Macroninja.cnexlabs.com (x1-6-a4-08-f5-18-3c-3a.cpe.webspeed.dk. [188.176.29.198]) by smtp.gmail.com with ESMTPSA id i89-v6sm1365508lfk.12.2018.03.29.15.06.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 29 Mar 2018 15:06:58 -0700 (PDT) From: =?UTF-8?q?Matias=20Bj=C3=B8rling?= To: axboe@fb.com Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, keith.busch@intel.com, javier@cnexlabs.com, Hans Holmberg , =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [GIT PULL 04/37] lightnvm: pblk: check data lines version on recovery Date: Fri, 30 Mar 2018 00:04:51 +0200 Message-Id: <20180329220524.30363-5-mb@lightnvm.io> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180329220524.30363-1-mb@lightnvm.io> References: <20180329220524.30363-1-mb@lightnvm.io> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hans Holmberg As a preparation for future bumps of data line persistent storage versions, we need to start checking the emeta line version during recovery. Also slit up the current emeta/smeta version into two bytes (major,minor). Recovering lines with the same major number as the current pblk data line version must succeed. This means that any changes in the persistent format must be: (1) Backward compatible: if we switch back to and older kernel, recovery of lines stored with major == current_major and minor > current_minor must succeed. (2) Forward compatible: switching to a newer kernel, recovery of lines stored with major=current_major and minor < minor must handle the data format differences gracefully(i.e. initialize new data structures to default values). If we detect lines that have a different major number than the current we must abort recovery. The user must manually migrate the data in this case. Previously the version stored in the emeta header was copied from smeta, which has version 1, so we need to set the minor version to 1. Signed-off-by: Hans Holmberg Signed-off-by: Javier González Signed-off-by: Matias Bjørling --- drivers/lightnvm/pblk-core.c | 9 ++++++++- drivers/lightnvm/pblk-recovery.c | 26 ++++++++++++++++++++++++-- drivers/lightnvm/pblk.h | 16 ++++++++++++++-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index 9027cf2ed1d8..155e42a26293 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c @@ -975,7 +975,8 @@ static int pblk_line_init_metadata(struct pblk *pblk, struct pblk_line *line, memcpy(smeta_buf->header.uuid, pblk->instance_uuid, 16); smeta_buf->header.id = cpu_to_le32(line->id); smeta_buf->header.type = cpu_to_le16(line->type); - smeta_buf->header.version = SMETA_VERSION; + smeta_buf->header.version_major = SMETA_VERSION_MAJOR; + smeta_buf->header.version_minor = SMETA_VERSION_MINOR; /* Start metadata */ smeta_buf->seq_nr = cpu_to_le64(line->seq_nr); @@ -998,6 +999,12 @@ static int pblk_line_init_metadata(struct pblk *pblk, struct pblk_line *line, /* End metadata */ memcpy(&emeta_buf->header, &smeta_buf->header, sizeof(struct line_header)); + + emeta_buf->header.version_major = EMETA_VERSION_MAJOR; + emeta_buf->header.version_minor = EMETA_VERSION_MINOR; + emeta_buf->header.crc = cpu_to_le32( + pblk_calc_meta_header_crc(pblk, &emeta_buf->header)); + emeta_buf->seq_nr = cpu_to_le64(line->seq_nr); emeta_buf->nr_lbas = cpu_to_le64(line->sec_in_line); emeta_buf->nr_valid_lbas = cpu_to_le64(0); diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c index 1d5e961bf5e0..a30fe203d454 100644 --- a/drivers/lightnvm/pblk-recovery.c +++ b/drivers/lightnvm/pblk-recovery.c @@ -826,6 +826,25 @@ static u64 pblk_line_emeta_start(struct pblk *pblk, struct pblk_line *line) return emeta_start; } +static int pblk_recov_check_line_version(struct pblk *pblk, + struct line_emeta *emeta) +{ + struct line_header *header = &emeta->header; + + if (header->version_major != EMETA_VERSION_MAJOR) { + pr_err("pblk: line major version mismatch: %d, expected: %d\n", + header->version_major, EMETA_VERSION_MAJOR); + return 1; + } + +#ifdef NVM_DEBUG + if (header->version_minor > EMETA_VERSION_MINOR) + pr_info("pblk: newer line minor version found: %d\n", line_v); +#endif + + return 0; +} + struct pblk_line *pblk_recov_l2p(struct pblk *pblk) { struct pblk_line_meta *lm = &pblk->lm; @@ -873,9 +892,9 @@ struct pblk_line *pblk_recov_l2p(struct pblk *pblk) if (le32_to_cpu(smeta_buf->header.identifier) != PBLK_MAGIC) continue; - if (smeta_buf->header.version != SMETA_VERSION) { + if (smeta_buf->header.version_major != SMETA_VERSION_MAJOR) { pr_err("pblk: found incompatible line version %u\n", - le16_to_cpu(smeta_buf->header.version)); + smeta_buf->header.version_major); return ERR_PTR(-EINVAL); } @@ -943,6 +962,9 @@ struct pblk_line *pblk_recov_l2p(struct pblk *pblk) goto next; } + if (pblk_recov_check_line_version(pblk, line->emeta->buf)) + return ERR_PTR(-EINVAL); + if (pblk_recov_l2p_from_emeta(pblk, line)) pblk_recov_l2p_from_oob(pblk, line); diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index 8c357fb6538e..fae2526f80b2 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h @@ -320,14 +320,26 @@ enum { }; #define PBLK_MAGIC 0x70626c6b /*pblk*/ -#define SMETA_VERSION cpu_to_le16(1) + +/* emeta/smeta persistent storage format versions: + * Changes in major version requires offline migration. + * Changes in minor version are handled automatically during + * recovery. + */ + +#define SMETA_VERSION_MAJOR (0) +#define SMETA_VERSION_MINOR (1) + +#define EMETA_VERSION_MAJOR (0) +#define EMETA_VERSION_MINOR (1) struct line_header { __le32 crc; __le32 identifier; /* pblk identifier */ __u8 uuid[16]; /* instance uuid */ __le16 type; /* line type */ - __le16 version; /* type version */ + __u8 version_major; /* version major */ + __u8 version_minor; /* version minor */ __le32 id; /* line id for current line */ }; -- 2.11.0