Skip to content

Commit

Permalink
block: don't hold part0's refcount in IO path
Browse files Browse the repository at this point in the history
gendisk can't be gone when there is IO activity, so not hold
part0's refcount in IO path.

Signed-off-by: Ming Lei <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Cc: Yufen Yu <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Hou Tao <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Ming Lei authored and axboe committed May 13, 2020
1 parent 520138c commit 27eb3af
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 9 deletions.
13 changes: 6 additions & 7 deletions block/blk.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions block/genhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 27eb3af

Please sign in to comment.