]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
block: sed-opal: fix IOC_OPAL_ENABLE_DISABLE_MBR
authorDavid Kozub <zub@linux.fjfi.cvut.cz>
Thu, 14 Feb 2019 00:15:53 +0000 (01:15 +0100)
committerStefan Bader <stefan.bader@canonical.com>
Tue, 13 Aug 2019 12:11:36 +0000 (14:11 +0200)
BugLink: https://bugs.launchpad.net/bugs/1837517
[ Upstream commit 78bf47353b0041865564deeed257a54f047c2fdc ]

The implementation of IOC_OPAL_ENABLE_DISABLE_MBR handled the value
opal_mbr_data.enable_disable incorrectly: enable_disable is expected
to be one of OPAL_MBR_ENABLE(0) or OPAL_MBR_DISABLE(1). enable_disable
was passed directly to set_mbr_done and set_mbr_enable_disable where
is was interpreted as either OPAL_TRUE(1) or OPAL_FALSE(0). The end
result was that calling IOC_OPAL_ENABLE_DISABLE_MBR with OPAL_MBR_ENABLE
actually disabled the shadow MBR and vice versa.

This patch adds correct conversion from OPAL_MBR_DISABLE/ENABLE to
OPAL_FALSE/TRUE. The change affects existing programs using
IOC_OPAL_ENABLE_DISABLE_MBR but this is typically used only once when
setting up an Opal drive.

Acked-by: Jon Derrick <jonathan.derrick@intel.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Scott Bauer <sbauer@plzdonthack.me>
Signed-off-by: David Kozub <zub@linux.fjfi.cvut.cz>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
block/sed-opal.c

index e0de4dd448b3c7238e8656b572de72206302bf87..1196408972937cf306139faa2ed188fb187e777d 100644 (file)
@@ -2095,13 +2095,16 @@ static int opal_erase_locking_range(struct opal_dev *dev,
 static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
                                          struct opal_mbr_data *opal_mbr)
 {
+       u8 enable_disable = opal_mbr->enable_disable == OPAL_MBR_ENABLE ?
+               OPAL_TRUE : OPAL_FALSE;
+
        const struct opal_step mbr_steps[] = {
                { opal_discovery0, },
                { start_admin1LSP_opal_session, &opal_mbr->key },
-               { set_mbr_done, &opal_mbr->enable_disable },
+               { set_mbr_done, &enable_disable },
                { end_opal_session, },
                { start_admin1LSP_opal_session, &opal_mbr->key },
-               { set_mbr_enable_disable, &opal_mbr->enable_disable },
+               { set_mbr_enable_disable, &enable_disable },
                { end_opal_session, },
                { NULL, }
        };
@@ -2221,7 +2224,7 @@ static int __opal_lock_unlock(struct opal_dev *dev,
 
 static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key)
 {
-       u8 mbr_done_tf = 1;
+       u8 mbr_done_tf = OPAL_TRUE;
        const struct opal_step mbrdone_step [] = {
                { opal_discovery0, },
                { start_admin1LSP_opal_session, key },