block: add partition resize function to blkpg ioctl
authorVivek Goyal <vgoyal@redhat.com>
Wed, 1 Aug 2012 10:24:18 +0000 (12:24 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 1 Aug 2012 10:24:18 +0000 (12:24 +0200)
commitc83f6bf98dc1f1a194118b3830706cebbebda8c4
treeea8fbd925584f784164617964a9f025bda16ed15
parent4638a83e8615de9c16c39dfed234951d0f468cf1
block: add partition resize function to blkpg ioctl

Add a new operation code (BLKPG_RESIZE_PARTITION) to the BLKPG ioctl that
allows altering the size of an existing partition, even if it is currently
in use.

This patch converts hd_struct->nr_sects into sequence counter because
One might extend a partition while IO is happening to it and update of
nr_sects can be non-atomic on 32bit machines with 64bit sector_t. This
can lead to issues like reading inconsistent size of a partition. Sequence
counter have been used so that readers don't have to take bdev mutex lock
as we call sector_in_part() very frequently.

Now all the access to hd_struct->nr_sects should happen using sequence
counter read/update helper functions part_nr_sects_read/part_nr_sects_write.
There is one exception though, set_capacity()/get_capacity(). I think
theoritically race should exist there too but this patch does not
modify set_capacity()/get_capacity() due to sheer number of call sites
and I am afraid that change might break something. I have left that as a
TODO item. We can handle it later if need be. This patch does not introduce
any new races as such w.r.t set_capacity()/get_capacity().

v2: Add CONFIG_LBDAF test to UP preempt case as suggested by Phillip.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Phillip Susi <psusi@ubuntu.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/genhd.c
block/ioctl.c
block/partition-generic.c
include/linux/blkpg.h
include/linux/genhd.h