c83f6bf98d
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>
59 lines
1.6 KiB
C
59 lines
1.6 KiB
C
#ifndef _LINUX_BLKPG_H
|
|
#define _LINUX_BLKPG_H
|
|
|
|
/*
|
|
* Partition table and disk geometry handling
|
|
*
|
|
* A single ioctl with lots of subfunctions:
|
|
*
|
|
* Device number stuff:
|
|
* get_whole_disk() (given the device number of a partition,
|
|
* find the device number of the encompassing disk)
|
|
* get_all_partitions() (given the device number of a disk, return the
|
|
* device numbers of all its known partitions)
|
|
*
|
|
* Partition stuff:
|
|
* add_partition()
|
|
* delete_partition()
|
|
* test_partition_in_use() (also for test_disk_in_use)
|
|
*
|
|
* Geometry stuff:
|
|
* get_geometry()
|
|
* set_geometry()
|
|
* get_bios_drivedata()
|
|
*
|
|
* For today, only the partition stuff - aeb, 990515
|
|
*/
|
|
#include <linux/compiler.h>
|
|
#include <linux/ioctl.h>
|
|
|
|
#define BLKPG _IO(0x12,105)
|
|
|
|
/* The argument structure */
|
|
struct blkpg_ioctl_arg {
|
|
int op;
|
|
int flags;
|
|
int datalen;
|
|
void __user *data;
|
|
};
|
|
|
|
/* The subfunctions (for the op field) */
|
|
#define BLKPG_ADD_PARTITION 1
|
|
#define BLKPG_DEL_PARTITION 2
|
|
#define BLKPG_RESIZE_PARTITION 3
|
|
|
|
/* Sizes of name fields. Unused at present. */
|
|
#define BLKPG_DEVNAMELTH 64
|
|
#define BLKPG_VOLNAMELTH 64
|
|
|
|
/* The data structure for ADD_PARTITION and DEL_PARTITION */
|
|
struct blkpg_partition {
|
|
long long start; /* starting offset in bytes */
|
|
long long length; /* length in bytes */
|
|
int pno; /* partition number */
|
|
char devname[BLKPG_DEVNAMELTH]; /* partition name, like sda5 or c0d1p2,
|
|
to be used in kernel messages */
|
|
char volname[BLKPG_VOLNAMELTH]; /* volume label */
|
|
};
|
|
|
|
#endif /* _LINUX_BLKPG_H */
|