projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
block: simplify the block device claiming interface
[linux-2.6-microblaze.git]
/
drivers
/
block
/
loop.c
diff --git
a/drivers/block/loop.c
b/drivers/block/loop.c
index
cb1191d
..
d643c67
100644
(file)
--- a/
drivers/block/loop.c
+++ b/
drivers/block/loop.c
@@
-251,11
+251,8
@@
loop_validate_block_size(unsigned short bsize)
*/
static void loop_set_size(struct loop_device *lo, loff_t size)
{
*/
static void loop_set_size(struct loop_device *lo, loff_t size)
{
- struct block_device *bdev = lo->lo_device;
-
- bd_set_nr_sectors(bdev, size);
-
- set_capacity_revalidate_and_notify(lo->lo_disk, size, false);
+ if (!set_capacity_and_notify(lo->lo_disk, size))
+ kobject_uevent(&disk_to_dev(lo->lo_disk)->kobj, KOBJ_CHANGE);
}
static inline int
}
static inline int
@@
-678,10
+675,10
@@
static int loop_validate_file(struct file *file, struct block_device *bdev)
while (is_loop_device(f)) {
struct loop_device *l;
while (is_loop_device(f)) {
struct loop_device *l;
- if (f->f_mapping->host->i_
bdev == b
dev)
+ if (f->f_mapping->host->i_
rdev == bdev->bd_
dev)
return -EBADF;
return -EBADF;
- l =
f->f_mapping->host->i_bdev
->bd_disk->private_data;
+ l =
I_BDEV(f->f_mapping->host)
->bd_disk->private_data;
if (l->lo_state != Lo_bound) {
return -EINVAL;
}
if (l->lo_state != Lo_bound) {
return -EINVAL;
}
@@
-888,9
+885,7
@@
static void loop_config_discard(struct loop_device *lo)
* file-backed loop devices: discarded regions read back as zero.
*/
if (S_ISBLK(inode->i_mode) && !lo->lo_encrypt_key_size) {
* file-backed loop devices: discarded regions read back as zero.
*/
if (S_ISBLK(inode->i_mode) && !lo->lo_encrypt_key_size) {
- struct request_queue *backingq;
-
- backingq = bdev_get_queue(inode->i_bdev);
+ struct request_queue *backingq = bdev_get_queue(I_BDEV(inode));
max_discard_sectors = backingq->limits.max_write_zeroes_sectors;
granularity = backingq->limits.discard_granularity ?:
max_discard_sectors = backingq->limits.max_write_zeroes_sectors;
granularity = backingq->limits.discard_granularity ?:
@@
-1074,7
+1069,6
@@
static int loop_configure(struct loop_device *lo, fmode_t mode,
struct file *file;
struct inode *inode;
struct address_space *mapping;
struct file *file;
struct inode *inode;
struct address_space *mapping;
- struct block_device *claimed_bdev = NULL;
int error;
loff_t size;
bool partscan;
int error;
loff_t size;
bool partscan;
@@
-1093,8
+1087,7
@@
static int loop_configure(struct loop_device *lo, fmode_t mode,
* here to avoid changing device under exclusive owner.
*/
if (!(mode & FMODE_EXCL)) {
* here to avoid changing device under exclusive owner.
*/
if (!(mode & FMODE_EXCL)) {
- claimed_bdev = bdev->bd_contains;
- error = bd_prepare_to_claim(bdev, claimed_bdev, loop_configure);
+ error = bd_prepare_to_claim(bdev, loop_configure);
if (error)
goto out_putf;
}
if (error)
goto out_putf;
}
@@
-1137,7
+1130,7
@@
static int loop_configure(struct loop_device *lo, fmode_t mode,
if (error)
goto out_unlock;
if (error)
goto out_unlock;
- set_d
evice_ro(bdev
, (lo->lo_flags & LO_FLAGS_READ_ONLY) != 0);
+ set_d
isk_ro(lo->lo_disk
, (lo->lo_flags & LO_FLAGS_READ_ONLY) != 0);
lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
lo->lo_device = bdev;
lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
lo->lo_device = bdev;
@@
-1167,9
+1160,6
@@
static int loop_configure(struct loop_device *lo, fmode_t mode,
size = get_loop_size(lo, file);
loop_set_size(lo, size);
size = get_loop_size(lo, file);
loop_set_size(lo, size);
- set_blocksize(bdev, S_ISBLK(inode->i_mode) ?
- block_size(inode->i_bdev) : PAGE_SIZE);
-
lo->lo_state = Lo_bound;
if (part_shift)
lo->lo_flags |= LO_FLAGS_PARTSCAN;
lo->lo_state = Lo_bound;
if (part_shift)
lo->lo_flags |= LO_FLAGS_PARTSCAN;
@@
-1184,15
+1174,15
@@
static int loop_configure(struct loop_device *lo, fmode_t mode,
mutex_unlock(&loop_ctl_mutex);
if (partscan)
loop_reread_partitions(lo, bdev);
mutex_unlock(&loop_ctl_mutex);
if (partscan)
loop_reread_partitions(lo, bdev);
- if (
claimed_bdev
)
- bd_abort_claiming(bdev,
claimed_bdev,
loop_configure);
+ if (
!(mode & FMODE_EXCL)
)
+ bd_abort_claiming(bdev, loop_configure);
return 0;
out_unlock:
mutex_unlock(&loop_ctl_mutex);
out_bdev:
return 0;
out_unlock:
mutex_unlock(&loop_ctl_mutex);
out_bdev:
- if (
claimed_bdev
)
- bd_abort_claiming(bdev,
claimed_bdev,
loop_configure);
+ if (
!(mode & FMODE_EXCL)
)
+ bd_abort_claiming(bdev, loop_configure);
out_putf:
fput(file);
out:
out_putf:
fput(file);
out:
@@
-2234,24
+2224,18
@@
out:
return ret;
}
return ret;
}
-static
struct kobject *loop_probe(dev_t dev, int *part, void *data
)
+static
void loop_probe(dev_t dev
)
{
{
+ int idx = MINOR(dev) >> part_shift;
struct loop_device *lo;
struct loop_device *lo;
- struct kobject *kobj;
- int err;
+
+ if (max_loop && idx >= max_loop)
+ return;
mutex_lock(&loop_ctl_mutex);
mutex_lock(&loop_ctl_mutex);
- err = loop_lookup(&lo, MINOR(dev) >> part_shift);
- if (err < 0)
- err = loop_add(&lo, MINOR(dev) >> part_shift);
- if (err < 0)
- kobj = NULL;
- else
- kobj = get_disk_and_module(lo->lo_disk);
+ if (loop_lookup(&lo, idx) < 0)
+ loop_add(&lo, idx);
mutex_unlock(&loop_ctl_mutex);
mutex_unlock(&loop_ctl_mutex);
-
- *part = 0;
- return kobj;
}
static long loop_control_ioctl(struct file *file, unsigned int cmd,
}
static long loop_control_ioctl(struct file *file, unsigned int cmd,
@@
-2371,14
+2355,11
@@
static int __init loop_init(void)
goto err_out;
goto err_out;
- if (
register_blkdev(LOOP_MAJOR, "loop"
)) {
+ if (
__register_blkdev(LOOP_MAJOR, "loop", loop_probe
)) {
err = -EIO;
goto misc_out;
}
err = -EIO;
goto misc_out;
}
- blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
- THIS_MODULE, loop_probe, NULL, NULL);
-
/* pre-create number of devices given by config or max_loop */
mutex_lock(&loop_ctl_mutex);
for (i = 0; i < nr; i++)
/* pre-create number of devices given by config or max_loop */
mutex_lock(&loop_ctl_mutex);
for (i = 0; i < nr; i++)
@@
-2404,16
+2385,11
@@
static int loop_exit_cb(int id, void *ptr, void *data)
static void __exit loop_exit(void)
{
static void __exit loop_exit(void)
{
- unsigned long range;
-
- range = max_loop ? max_loop << part_shift : 1UL << MINORBITS;
-
mutex_lock(&loop_ctl_mutex);
idr_for_each(&loop_index_idr, &loop_exit_cb, NULL);
idr_destroy(&loop_index_idr);
mutex_lock(&loop_ctl_mutex);
idr_for_each(&loop_index_idr, &loop_exit_cb, NULL);
idr_destroy(&loop_index_idr);
- blk_unregister_region(MKDEV(LOOP_MAJOR, 0), range);
unregister_blkdev(LOOP_MAJOR, "loop");
misc_deregister(&loop_misc);
unregister_blkdev(LOOP_MAJOR, "loop");
misc_deregister(&loop_misc);