]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mmc: core: Set read only for SD cards with permanent write protect bit
authorSeunghui Lee <sh043.lee@samsung.com>
Mon, 22 Feb 2021 08:31:56 +0000 (17:31 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 May 2021 08:38:17 +0000 (10:38 +0200)
commit 917a5336f2c27928be270226ab374ed0cbf3805d upstream.

Some of SD cards sets permanent write protection bit in their CSD register,
due to lifespan or internal problem. To avoid unnecessary I/O write
operations, let's parse the bits in the CSD during initialization and mark
the card as read only for this case.

Signed-off-by: Seunghui Lee <sh043.lee@samsung.com>
Link: https://lore.kernel.org/r/20210222083156.19158-1-sh043.lee@samsung.com
Cc: stable@vger.kernel.org
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/mmc/core/sd.c

index ed9af65e583eab734b1d51c7b2846b9aba93df55..824a1bdec394a72be78decbfd4dcc4ef8fad799b 100644 (file)
@@ -138,6 +138,9 @@ static int mmc_decode_csd(struct mmc_card *card)
                        csd->erase_size = UNSTUFF_BITS(resp, 39, 7) + 1;
                        csd->erase_size <<= csd->write_blkbits - 9;
                }
+
+               if (UNSTUFF_BITS(resp, 13, 1))
+                       mmc_card_set_readonly(card);
                break;
        case 1:
                /*
@@ -172,6 +175,9 @@ static int mmc_decode_csd(struct mmc_card *card)
                csd->write_blkbits = 9;
                csd->write_partial = 0;
                csd->erase_size = 1;
+
+               if (UNSTUFF_BITS(resp, 13, 1))
+                       mmc_card_set_readonly(card);
                break;
        default:
                pr_err("%s: unrecognised CSD structure version %d\n",