mmc: block: return errorcode from mmc_sd_num_wr_blocks()
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 1 Feb 2017 12:47:57 +0000 (13:47 +0100)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:37:05 +0000 (15:37 -0500)
mmc_sd_num_wr_blocks() has an interesting construction that
saves one return argument by casting (u32)-1 as error code
if something goes wrong.

This is however a bit confusing when the normal kernel
pattern is to return an int error code on success.

So instead pass a variable "blocks" that the function can
fill in with the number of successfully transferred blocks
and return an integer as error code.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
[Ulf: Changed a return code to -EIO, reported by Dan Carpenter and fixed
by Linus Walleij]

(cherry picked from commit 169f03a064c230de6d715bdd62112eb12256fce3)

drivers/mmc/core/block.c

index 3f4b637..a263f57 100644 (file)
@@ -768,7 +768,7 @@ static inline int mmc_blk_part_switch(struct mmc_card *card,
        return 0;
 }
 
-static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
+static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks)
 {
        int err;
        u32 result;
@@ -786,9 +786,9 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
 
        err = mmc_wait_for_cmd(card->host, &cmd, 0);
        if (err)
-               return (u32)-1;
+               return err;
        if (!mmc_host_is_spi(card->host) && !(cmd.resp[0] & R1_APP_CMD))
-               return (u32)-1;
+               return -EIO;
 
        memset(&cmd, 0, sizeof(struct mmc_command));
 
@@ -808,7 +808,7 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
 
        blocks = kmalloc(4, GFP_KERNEL);
        if (!blocks)
-               return (u32)-1;
+               return -ENOMEM;
 
        sg_init_one(&sg, blocks, 4);
 
@@ -818,9 +818,11 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
        kfree(blocks);
 
        if (cmd.error || data.error)
-               result = (u32)-1;
+               return -EIO;
+
+       *written_blocks = result;
 
-       return result;
+       return 0;
 }
 
 static int get_card_status(struct mmc_card *card, u32 *status, int retries)
@@ -1581,9 +1583,10 @@ static int mmc_blk_cmd_err(struct mmc_blk_data *md, struct mmc_card *card,
         */
        if (mmc_card_sd(card)) {
                u32 blocks;
+               int err;
 
-               blocks = mmc_sd_num_wr_blocks(card);
-               if (blocks != (u32)-1) {
+               err = mmc_sd_num_wr_blocks(card, &blocks);
+               if (!err) {
                        ret = blk_end_request(req, 0, blocks << 9);
                }
        } else {