Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753561AbcJKO3c (ORCPT ); Tue, 11 Oct 2016 10:29:32 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:47555 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752559AbcJKO33 (ORCPT ); Tue, 11 Oct 2016 10:29:29 -0400 From: Andy Whitcroft To: Alasdair Kergon , Mike Snitzer Cc: dm-devel@redhat.com, Shaohua Li , Heinz Mauelshagen , linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, Andy Whitcroft Subject: [PATCH 1/1] dm raid: fix compat_features validation Date: Tue, 11 Oct 2016 15:28:35 +0100 Message-Id: <20161011142835.11620-1-apw@canonical.com> X-Mailer: git-send-email 2.9.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1505 Lines: 35 In commit ecbfb9f118bce4 ("dm raid: add raid level takeover support") a new compatible feature flag was added. Validation for these compat_features was added but this only passes for new raid mappings with this feature flag. This causes previously created raid mappings to be failed at import. Check compat_features for any valid combinations. Fixes: ecbfb9f118bce4 ("dm raid: add raid level takeover support") BugLink: http://bugs.launchpad.net/bugs/1631298 Signed-off-by: Andy Whitcroft --- drivers/md/dm-raid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) It very much looks like these are intended to be optional extended feature flags. That we should be accepting any valid flag and rejecting any bit not in that set. We should however not be ensuring that specific bits are actually set. Certainly as things stand raid sets built on previous kernel versions cannot be assembled. diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 8abde6b..6ddea60 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -2258,7 +2258,7 @@ static int super_validate(struct raid_set *rs, struct md_rdev *rdev) if (!mddev->events && super_init_validation(rs, rdev)) return -EINVAL; - if (le32_to_cpu(sb->compat_features) != FEATURE_FLAG_SUPPORTS_V190) { + if (le32_to_cpu(sb->compat_features) & ~(FEATURE_FLAG_SUPPORTS_V190)) { rs->ti->error = "Unable to assemble array: Unknown flag(s) in compatible feature flags"; return -EINVAL; } -- 2.9.3