All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ming Lei <ming.lei@redhat.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: Jens Axboe <axboe@kernel.dk>,
	linux-block@vger.kernel.org, Yufen Yu <yuyufen@huawei.com>,
	Hou Tao <houtao1@huawei.com>
Subject: Re: [PATCH V2 4/4] block: don't hold part0's refcount in IO path
Date: Fri, 8 May 2020 15:41:57 +0800	[thread overview]
Message-ID: <20200508074157.GA1375901@T590> (raw)
In-Reply-To: <20200508064133.GA11136@infradead.org>

On Thu, May 07, 2020 at 11:41:33PM -0700, Christoph Hellwig wrote:
> On Fri, May 08, 2020 at 12:44:07PM +0800, Ming Lei wrote:
> > gendisk can't be gone when there is IO activity, so not hold
> > part0's refcount in IO path.
> > 
> > Cc: Yufen Yu <yuyufen@huawei.com>
> > Cc: Christoph Hellwig <hch@infradead.org>
> > Cc: Hou Tao <houtao1@huawei.com>
> > Signed-off-by: Ming Lei <ming.lei@redhat.com>
> 
> This looks correct, although I'd still prefer to centralize the
> partno checks in the helpers.  Also hd_struct_get is unused with
> this patch isn't it?
 
OK, are you fine with the following patch?

diff --git a/block/blk.h b/block/blk.h
index 133fb0b99759..8efd1ca5c975 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -376,19 +376,18 @@ int bdev_resize_partition(struct block_device *bdev, int partno,
 int disk_expand_part_tbl(struct gendisk *disk, int target);
 int hd_ref_init(struct hd_struct *part);
 
-static inline void hd_struct_get(struct hd_struct *part)
-{
-	percpu_ref_get(&part->ref);
-}
-
+/* no need to get/put refcount of part0 */
 static inline int hd_struct_try_get(struct hd_struct *part)
 {
-	return percpu_ref_tryget_live(&part->ref);
+	if (part->partno)
+		return percpu_ref_tryget_live(&part->ref);
+	return 1;
 }
 
 static inline void hd_struct_put(struct hd_struct *part)
 {
-	percpu_ref_put(&part->ref);
+	if (part->partno)
+		percpu_ref_put(&part->ref);
 }
 
 static inline void hd_free_part(struct hd_struct *part)
diff --git a/block/genhd.c b/block/genhd.c
index bf8cbb033d64..d97b95d1a2fd 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -345,7 +345,8 @@ static inline int sector_in_part(struct hd_struct *part, sector_t sector)
  *
  * CONTEXT:
  * RCU read locked.  The returned partition pointer is always valid
- * because its refcount is grabbed.
+ * because its refcount is grabbed except for part0, which lifetime
+ * is same with the disk.
  *
  * RETURNS:
  * Found partition on success, part0 is returned if no partition matches
@@ -378,7 +379,6 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
 			return part;
 		}
 	}
-	hd_struct_get(&disk->part0);
 	return &disk->part0;
 }
 


Thanks,
Ming


  reply	other threads:[~2020-05-08  7:42 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-08  4:44 [PATCH V2 0/4] block: fix partition use-after-free and optimization Ming Lei
2020-05-08  4:44 ` [PATCH V2 1/4] block: fix use-after-free on cached last_lookup partition Ming Lei
2020-05-08  6:44   ` Christoph Hellwig
2020-05-08  4:44 ` [PATCH V2 2/4] block: only define 'nr_sects_seq' in hd_part for 32bit SMP Ming Lei
2020-05-08  4:44 ` [PATCH V2 3/4] block: re-organize fields of 'struct hd_part' Ming Lei
2020-05-08  4:44 ` [PATCH V2 4/4] block: don't hold part0's refcount in IO path Ming Lei
2020-05-08  6:41   ` Christoph Hellwig
2020-05-08  7:41     ` Ming Lei [this message]
2020-05-08  7:47       ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200508074157.GA1375901@T590 \
    --to=ming.lei@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=hch@infradead.org \
    --cc=houtao1@huawei.com \
    --cc=linux-block@vger.kernel.org \
    --cc=yuyufen@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.