mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-06 14:31:46 +00:00
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:
parent
520138c3b9
commit
27eb3af9a3
2 changed files with 8 additions and 9 deletions
|
@ -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 disk_expand_part_tbl(struct gendisk *disk, int target);
|
||||||
int hd_ref_init(struct hd_struct *part);
|
int hd_ref_init(struct hd_struct *part);
|
||||||
|
|
||||||
static inline void hd_struct_get(struct hd_struct *part)
|
/* no need to get/put refcount of part0 */
|
||||||
{
|
|
||||||
percpu_ref_get(&part->ref);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int hd_struct_try_get(struct hd_struct *part)
|
static inline int hd_struct_try_get(struct hd_struct *part)
|
||||||
{
|
{
|
||||||
|
if (part->partno)
|
||||||
return percpu_ref_tryget_live(&part->ref);
|
return percpu_ref_tryget_live(&part->ref);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void hd_struct_put(struct hd_struct *part)
|
static inline void hd_struct_put(struct hd_struct *part)
|
||||||
{
|
{
|
||||||
|
if (part->partno)
|
||||||
percpu_ref_put(&part->ref);
|
percpu_ref_put(&part->ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -345,7 +345,8 @@ static inline int sector_in_part(struct hd_struct *part, sector_t sector)
|
||||||
*
|
*
|
||||||
* CONTEXT:
|
* CONTEXT:
|
||||||
* RCU read locked. The returned partition pointer is always valid
|
* 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:
|
* RETURNS:
|
||||||
* Found partition on success, part0 is returned if no partition matches
|
* 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;
|
return part;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hd_struct_get(&disk->part0);
|
|
||||||
return &disk->part0;
|
return &disk->part0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue