Commit 27eb3af9 authored by Ming Lei's avatar Ming Lei Committed by Jens Axboe
Browse files

block: don't hold part0's refcount in IO path



gendisk can't be gone when there is IO activity, so not hold
part0's refcount in IO path.

Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@infradead.org>
Cc: Yufen Yu <yuyufen@huawei.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Hou Tao <houtao1@huawei.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 520138c3
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -378,18 +378,17 @@ 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)
{
	if (part->partno)
		return percpu_ref_tryget_live(&part->ref);
	return 1;
}

static inline void hd_struct_put(struct hd_struct *part)
{
	if (part->partno)
		percpu_ref_put(&part->ref);
}

+2 −2
Original line number Diff line number Diff line
@@ -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;
}