Re: [PATCH] mmc: block: fix updating ext_csd caches on ioctl call

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 8 March 2018 at 15:08, Bastian Stender <bst@xxxxxxxxxxxxxx> wrote:
> PARTITION_CONFIG is cached in mmc_card->ext_csd.part_config and the
> currently active partition in mmc_blk_data->part_curr. These caches do
> not always reflect changes if the ioctl call modifies the
> PARTITION_CONFIG registers, e.g. by changing BOOT_PARTITION_ENABLE.
>
> Write the PARTITION_CONFIG value extracted from the ioctl call to the
> cache and update the currently active partition accordingly. This
> ensures that the user space cannot change the values behind the
> kernel's back. The next call to mmc_blk_part_switch() will operate on
> the data set by the ioctl and reflect the changes appropriately.
>
> Signed-off-by: Bastian Stender <bst@xxxxxxxxxxxxxx>
> Signed-off-by: Jan Luebbe <jlu@xxxxxxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx

Thanks, applied for fixes!

Kind regards
Uffe

> ---
>  drivers/mmc/core/block.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
>
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index 20135a5de748..2cfb963d9f37 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -72,6 +72,7 @@ MODULE_ALIAS("mmc:block");
>  #define MMC_BLK_TIMEOUT_MS  (10 * 1000)
>  #define MMC_SANITIZE_REQ_TIMEOUT 240000
>  #define MMC_EXTRACT_INDEX_FROM_ARG(x) ((x & 0x00FF0000) >> 16)
> +#define MMC_EXTRACT_VALUE_FROM_ARG(x) ((x & 0x0000FF00) >> 8)
>
>  #define mmc_req_rel_wr(req)    ((req->cmd_flags & REQ_FUA) && \
>                                   (rq_data_dir(req) == WRITE))
> @@ -586,6 +587,24 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
>                 return data.error;
>         }
>
> +       /*
> +        * Make sure the cache of the PARTITION_CONFIG register and
> +        * PARTITION_ACCESS bits is updated in case the ioctl ext_csd write
> +        * changed it successfully.
> +        */
> +       if ((MMC_EXTRACT_INDEX_FROM_ARG(cmd.arg) == EXT_CSD_PART_CONFIG) &&
> +           (cmd.opcode == MMC_SWITCH)) {
> +               struct mmc_blk_data *main_md = dev_get_drvdata(&card->dev);
> +               u8 value = MMC_EXTRACT_VALUE_FROM_ARG(cmd.arg);
> +
> +               /*
> +                * Update cache so the next mmc_blk_part_switch call operates
> +                * on up-to-date data.
> +                */
> +               card->ext_csd.part_config = value;
> +               main_md->part_curr = value & EXT_CSD_PART_CONFIG_ACC_MASK;
> +       }
> +
>         /*
>          * According to the SD specs, some commands require a delay after
>          * issuing the command.
> --
> 2.16.1
>



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]