Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 230605
b: refs/heads/master
c: 09e099d
h: refs/heads/master
i:
  230603: c2cd27a
v: v3
  • Loading branch information
Jerome Marchand authored and Jens Axboe committed Jan 5, 2011
1 parent 83ea468 commit c1b13cd
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e4a683c899cd5a49f8d684a054c95bd115a0c005
refs/heads/master: 09e099d4bafea3b15be003d548bdf94b4b6e0e17
26 changes: 21 additions & 5 deletions trunk/block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,27 @@ static void drive_stat_acct(struct request *rq, int new_io)
return;

cpu = part_stat_lock();
part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq));

if (!new_io)
if (!new_io) {
part = rq->part;
part_stat_inc(cpu, part, merges[rw]);
else {
} else {
part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq));
if (!kref_test_and_get(&part->ref)) {
/*
* The partition is already being removed,
* the request will be accounted on the disk only
*
* We take a reference on disk->part0 although that
* partition will never be deleted, so we can treat
* it as any other partition.
*/
part = &rq->rq_disk->part0;
kref_get(&part->ref);
}
part_round_stats(cpu, part);
part_inc_in_flight(part, rw);
rq->part = part;
}

part_stat_unlock();
Expand Down Expand Up @@ -128,6 +142,7 @@ void blk_rq_init(struct request_queue *q, struct request *rq)
rq->ref_count = 1;
rq->start_time = jiffies;
set_start_time_ns(rq);
rq->part = NULL;
}
EXPORT_SYMBOL(blk_rq_init);

Expand Down Expand Up @@ -1776,7 +1791,7 @@ static void blk_account_io_completion(struct request *req, unsigned int bytes)
int cpu;

cpu = part_stat_lock();
part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
part = req->part;
part_stat_add(cpu, part, sectors[rw], bytes >> 9);
part_stat_unlock();
}
Expand All @@ -1796,13 +1811,14 @@ static void blk_account_io_done(struct request *req)
int cpu;

cpu = part_stat_lock();
part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
part = req->part;

part_stat_inc(cpu, part, ios[rw]);
part_stat_add(cpu, part, ticks[rw], duration);
part_round_stats(cpu, part);
part_dec_in_flight(part, rw);

kref_put(&part->ref, __delete_partition);
part_stat_unlock();
}
}
Expand Down
3 changes: 2 additions & 1 deletion trunk/block/blk-merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -351,11 +351,12 @@ static void blk_account_io_merge(struct request *req)
int cpu;

cpu = part_stat_lock();
part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
part = req->part;

part_round_stats(cpu, part);
part_dec_in_flight(part, rq_data_dir(req));

kref_put(&part->ref, __delete_partition);
part_stat_unlock();
}
}
Expand Down
1 change: 1 addition & 0 deletions trunk/block/genhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,7 @@ struct gendisk *alloc_disk_node(int minors, int node_id)
return NULL;
}
disk->part_tbl->part[0] = &disk->part0;
kref_init(&disk->part0.ref);

disk->minors = minors;
rand_initialize_disk(disk);
Expand Down
10 changes: 9 additions & 1 deletion trunk/fs/partitions/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,13 @@ static void delete_partition_rcu_cb(struct rcu_head *head)
put_device(part_to_dev(part));
}

void __delete_partition(struct kref *ref)
{
struct hd_struct *part = container_of(ref, struct hd_struct, ref);

call_rcu(&part->rcu_head, delete_partition_rcu_cb);
}

void delete_partition(struct gendisk *disk, int partno)
{
struct disk_part_tbl *ptbl = disk->part_tbl;
Expand All @@ -399,7 +406,7 @@ void delete_partition(struct gendisk *disk, int partno)
kobject_put(part->holder_dir);
device_del(part_to_dev(part));

call_rcu(&part->rcu_head, delete_partition_rcu_cb);
kref_put(&part->ref, __delete_partition);
}

static ssize_t whole_disk_show(struct device *dev,
Expand Down Expand Up @@ -498,6 +505,7 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno,
if (!dev_get_uevent_suppress(ddev))
kobject_uevent(&pdev->kobj, KOBJ_ADD);

kref_init(&p->ref);
return p;

out_free_info:
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/blkdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ struct request {
void *elevator_private3;

struct gendisk *rq_disk;
struct hd_struct *part;
unsigned long start_time;
#ifdef CONFIG_BLK_CGROUP
unsigned long long start_time_ns;
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/genhd.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ struct hd_struct {
struct disk_stats dkstats;
#endif
struct rcu_head rcu_head;
struct kref ref;
};

#define GENHD_FL_REMOVABLE 1
Expand Down Expand Up @@ -583,6 +584,7 @@ extern struct hd_struct * __must_check add_partition(struct gendisk *disk,
sector_t len, int flags,
struct partition_meta_info
*info);
extern void __delete_partition(struct kref *ref);
extern void delete_partition(struct gendisk *, int);
extern void printk_all_partitions(void);

Expand Down

0 comments on commit c1b13cd

Please sign in to comment.