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: Ming Lei <ming.lei@redhat.com> Reviewed-by: Christoph 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: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
520138c3b9
Коммит
27eb3af9a3
13
block/blk.h
13
block/blk.h
|
@ -378,19 +378,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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче