Message ID | 20210818005547.14497-3-digetx@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support EFI partition on NVIDIA Tegra devices | expand |
On Wed, Aug 18, 2021 at 03:55:44AM +0300, Dmitry Osipenko wrote: > +static int mmc_blk_alternative_gpt_sector(struct block_device *bdev, > + sector_t *sector) > +{ > + struct mmc_card *card = mmc_bdev_to_card(bdev); > + > + if (!card) > + return -ENODEV; > + > + if (!card->host->ops->alternative_gpt_sector) > + return -EOPNOTSUPP; > + > + return card->host->ops->alternative_gpt_sector(card, sector); > +} > + > +static struct mmc_card *mmc_bdev_to_card(struct block_device *bdev) > +{ > + struct mmc_blk_data *md; > + > + if (bdev->bd_disk->fops != &mmc_bdops) > + return NULL; No need for this check bow that it is only called through mmc_bdops. > + > + md = mmc_blk_get(bdev->bd_disk); > + if (!md) > + return NULL; > + > + return md->queue.card; > +} This reference seems to never be dropped anywhere.
18.08.2021 08:28, Christoph Hellwig пишет: > On Wed, Aug 18, 2021 at 03:55:44AM +0300, Dmitry Osipenko wrote: >> +static int mmc_blk_alternative_gpt_sector(struct block_device *bdev, >> + sector_t *sector) >> +{ >> + struct mmc_card *card = mmc_bdev_to_card(bdev); >> + >> + if (!card) >> + return -ENODEV; >> + >> + if (!card->host->ops->alternative_gpt_sector) >> + return -EOPNOTSUPP; >> + >> + return card->host->ops->alternative_gpt_sector(card, sector); >> +} >> + > >> +static struct mmc_card *mmc_bdev_to_card(struct block_device *bdev) >> +{ >> + struct mmc_blk_data *md; >> + >> + if (bdev->bd_disk->fops != &mmc_bdops) >> + return NULL; > > No need for this check bow that it is only called through mmc_bdops. Alright >> + >> + md = mmc_blk_get(bdev->bd_disk); >> + if (!md) >> + return NULL; >> + >> + return md->queue.card; >> +} > > This reference seems to never be dropped anywhere. > Indeed, I missed that it bumps the refcnt.
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 672cc505ce37..8ad1841f0dbd 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -178,6 +178,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, int disable_multi, struct mmc_queue *mq); static void mmc_blk_hsq_req_done(struct mmc_request *mrq); +static struct mmc_card *mmc_bdev_to_card(struct block_device *bdev); static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk) { @@ -801,6 +802,20 @@ static int mmc_blk_compat_ioctl(struct block_device *bdev, fmode_t mode, } #endif +static int mmc_blk_alternative_gpt_sector(struct block_device *bdev, + sector_t *sector) +{ + struct mmc_card *card = mmc_bdev_to_card(bdev); + + if (!card) + return -ENODEV; + + if (!card->host->ops->alternative_gpt_sector) + return -EOPNOTSUPP; + + return card->host->ops->alternative_gpt_sector(card, sector); +} + static const struct block_device_operations mmc_bdops = { .open = mmc_blk_open, .release = mmc_blk_release, @@ -810,8 +825,23 @@ static const struct block_device_operations mmc_bdops = { #ifdef CONFIG_COMPAT .compat_ioctl = mmc_blk_compat_ioctl, #endif + .alternative_gpt_sector = mmc_blk_alternative_gpt_sector, }; +static struct mmc_card *mmc_bdev_to_card(struct block_device *bdev) +{ + struct mmc_blk_data *md; + + if (bdev->bd_disk->fops != &mmc_bdops) + return NULL; + + md = mmc_blk_get(bdev->bd_disk); + if (!md) + return NULL; + + return md->queue.card; +} + static int mmc_blk_part_switch_pre(struct mmc_card *card, unsigned int part_type) { diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 0abd47e9ef9b..18281c444bf6 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -190,6 +190,10 @@ struct mmc_host_ops { /* Initialize an SD express card, mandatory for MMC_CAP2_SD_EXP. */ int (*init_sd_express)(struct mmc_host *host, struct mmc_ios *ios); + + /* Get platform-specific GPT entry location */ + int (*alternative_gpt_sector)(struct mmc_card *card, + sector_t *sector); }; struct mmc_cqe_ops {
Support generic alternative_gpt_sector() block device operation by invoking a new platform-specific MMC host hook that is also named alternative_gpt_sector(). Signed-off-by: Dmitry Osipenko <digetx@gmail.com> --- drivers/mmc/core/block.c | 30 ++++++++++++++++++++++++++++++ include/linux/mmc/host.h | 4 ++++ 2 files changed, 34 insertions(+)