On Fri, 9 Jul 2021 at 02:32, Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx> wrote: > > Hi all, > > Today's linux-next merge of the block tree got a conflict in: > > drivers/mmc/core/block.c > > between commit: > > 5c0777665b3e ("mmc: core: Use kref in place of struct mmc_blk_data::usage") > > from the mmc-fixes tree and commits: > > 249cda3325e0 ("mmc: remove an extra blk_{get,put}_queue pair") > 607d968a5769 ("mmc: switch to blk_mq_alloc_disk") > > from the block tree. > > I fixed it up (see below) and can carry the fix as necessary. This > is now fixed as far as linux-next is concerned, but any non trivial > conflicts should be mentioned to your upstream maintainer when your tree > is submitted for merging. You may also want to consider cooperating > with the maintainer of the conflicting tree to minimise any particularly > complex conflicts. > > -- > Cheers, > Stephen Rothwell Stephen, thanks for the heads up! Jens, I noticed that you sent the PR with the mmc commits as of yesterday. Assuming Linus will pull it before rc1, I will rebase and fix up the conflict from my fixes branch on top. No action needed from your side. Kind regards Uffe > > diff --cc drivers/mmc/core/block.c > index d7b5c5ab75fa,9890a1532cb0..000000000000 > --- a/drivers/mmc/core/block.c > +++ b/drivers/mmc/core/block.c > @@@ -195,26 -196,18 +195,25 @@@ static inline int mmc_get_devidx(struc > return devidx; > } > > -static void mmc_blk_put(struct mmc_blk_data *md) > +static void mmc_blk_kref_release(struct kref *ref) > { > - mutex_lock(&open_lock); > - md->usage--; > - if (md->usage == 0) { > - int devidx = mmc_get_devidx(md->disk); > + struct mmc_blk_data *md = container_of(ref, struct mmc_blk_data, kref); > + int devidx; > > - ida_simple_remove(&mmc_blk_ida, devidx); > - put_disk(md->disk); > - kfree(md); > - } > + devidx = mmc_get_devidx(md->disk); > - blk_put_queue(md->queue.queue); > + ida_simple_remove(&mmc_blk_ida, devidx); > + > + mutex_lock(&open_lock); > + md->disk->private_data = NULL; > mutex_unlock(&open_lock); > + > + put_disk(md->disk); > + kfree(md); > +} > + > +static void mmc_blk_put(struct mmc_blk_data *md) > +{ > + kref_put(&md->kref, mmc_blk_kref_release); > } > > static ssize_t power_ro_lock_show(struct device *dev, > @@@ -2334,27 -2327,11 +2333,11 @@@ static struct mmc_blk_data *mmc_blk_all > > INIT_LIST_HEAD(&md->part); > INIT_LIST_HEAD(&md->rpmbs); > - md->usage = 1; > + kref_init(&md->kref); > - > - ret = mmc_init_queue(&md->queue, card); > - if (ret) > - goto err_putdisk; > - > md->queue.blkdata = md; > > - /* > - * Keep an extra reference to the queue so that we can shutdown the > - * queue (i.e. call blk_cleanup_queue()) while there are still > - * references to the 'md'. The corresponding blk_put_queue() is in > - * mmc_blk_put(). > - */ > - if (!blk_get_queue(md->queue.queue)) { > - mmc_cleanup_queue(&md->queue); > - ret = -ENODEV; > - goto err_putdisk; > - } > - > md->disk->major = MMC_BLOCK_MAJOR; > + md->disk->minors = perdev_minors; > md->disk->first_minor = devidx * perdev_minors; > md->disk->fops = &mmc_bdops; > md->disk->private_data = md;