loop.c (5c34202b8bf942da411b6599668a76b07449bbfd) | loop.c (07002e995638b83a6987180f43722a0eb39d4932) |
---|---|
1/* 2 * linux/drivers/block/loop.c 3 * 4 * Written by Theodore Ts'o, 3/29/93 5 * 6 * Copyright 1993 by Theodore Ts'o. Redistribution of this file is 7 * permitted under the GNU General Public License. 8 * --- 1303 unchanged lines hidden (view full) --- 1312 err = -ENOIOCTLCMD; 1313 break; 1314 } 1315 unlock_kernel(); 1316 return err; 1317} 1318#endif 1319 | 1/* 2 * linux/drivers/block/loop.c 3 * 4 * Written by Theodore Ts'o, 3/29/93 5 * 6 * Copyright 1993 by Theodore Ts'o. Redistribution of this file is 7 * permitted under the GNU General Public License. 8 * --- 1303 unchanged lines hidden (view full) --- 1312 err = -ENOIOCTLCMD; 1313 break; 1314 } 1315 unlock_kernel(); 1316 return err; 1317} 1318#endif 1319 |
1320static struct loop_device *loop_find_dev(int number) 1321{ 1322 struct loop_device *lo; 1323 1324 list_for_each_entry(lo, &loop_devices, lo_list) { 1325 if (lo->lo_number == number) 1326 return lo; 1327 } 1328 return NULL; 1329} 1330 1331static struct loop_device *loop_init_one(int i); | |
1332static int lo_open(struct inode *inode, struct file *file) 1333{ 1334 struct loop_device *lo = inode->i_bdev->bd_disk->private_data; 1335 1336 mutex_lock(&lo->lo_ctl_mutex); 1337 lo->lo_refcnt++; 1338 mutex_unlock(&lo->lo_ctl_mutex); 1339 | 1320static int lo_open(struct inode *inode, struct file *file) 1321{ 1322 struct loop_device *lo = inode->i_bdev->bd_disk->private_data; 1323 1324 mutex_lock(&lo->lo_ctl_mutex); 1325 lo->lo_refcnt++; 1326 mutex_unlock(&lo->lo_ctl_mutex); 1327 |
1340 mutex_lock(&loop_devices_mutex); 1341 if (!loop_find_dev(lo->lo_number + 1)) 1342 loop_init_one(lo->lo_number + 1); 1343 mutex_unlock(&loop_devices_mutex); 1344 | |
1345 return 0; 1346} 1347 1348static int lo_release(struct inode *inode, struct file *file) 1349{ 1350 struct loop_device *lo = inode->i_bdev->bd_disk->private_data; 1351 1352 mutex_lock(&lo->lo_ctl_mutex); --- 90 unchanged lines hidden (view full) --- 1443 list_add_tail(&lo->lo_list, &loop_devices); 1444 return lo; 1445 1446out_free_queue: 1447 blk_cleanup_queue(lo->lo_queue); 1448out_free_dev: 1449 kfree(lo); 1450out: | 1328 return 0; 1329} 1330 1331static int lo_release(struct inode *inode, struct file *file) 1332{ 1333 struct loop_device *lo = inode->i_bdev->bd_disk->private_data; 1334 1335 mutex_lock(&lo->lo_ctl_mutex); --- 90 unchanged lines hidden (view full) --- 1426 list_add_tail(&lo->lo_list, &loop_devices); 1427 return lo; 1428 1429out_free_queue: 1430 blk_cleanup_queue(lo->lo_queue); 1431out_free_dev: 1432 kfree(lo); 1433out: |
1451 return ERR_PTR(-ENOMEM); | 1434 return NULL; |
1452} 1453 1454static void loop_del_one(struct loop_device *lo) 1455{ 1456 del_gendisk(lo->lo_disk); 1457 blk_cleanup_queue(lo->lo_queue); 1458 put_disk(lo->lo_disk); 1459 list_del(&lo->lo_list); 1460 kfree(lo); 1461} 1462 | 1435} 1436 1437static void loop_del_one(struct loop_device *lo) 1438{ 1439 del_gendisk(lo->lo_disk); 1440 blk_cleanup_queue(lo->lo_queue); 1441 put_disk(lo->lo_disk); 1442 list_del(&lo->lo_list); 1443 kfree(lo); 1444} 1445 |
1446static int loop_lock(dev_t dev, void *data) 1447{ 1448 mutex_lock(&loop_devices_mutex); 1449 return 0; 1450} 1451 |
|
1463static struct kobject *loop_probe(dev_t dev, int *part, void *data) 1464{ | 1452static struct kobject *loop_probe(dev_t dev, int *part, void *data) 1453{ |
1465 unsigned int number = dev & MINORMASK; 1466 struct loop_device *lo; | 1454 struct loop_device *lo = loop_init_one(dev & MINORMASK); 1455 struct kobject *kobj; |
1467 | 1456 |
1468 mutex_lock(&loop_devices_mutex); 1469 lo = loop_find_dev(number); 1470 if (lo == NULL) 1471 lo = loop_init_one(number); | 1457 kobj = lo ? get_disk(lo->lo_disk) : ERR_PTR(-ENOMEM); |
1472 mutex_unlock(&loop_devices_mutex); 1473 1474 *part = 0; | 1458 mutex_unlock(&loop_devices_mutex); 1459 1460 *part = 0; |
1475 if (IS_ERR(lo)) 1476 return (void *)lo; 1477 else 1478 return &lo->lo_disk->kobj; | 1461 return kobj; |
1479} 1480 1481static int __init loop_init(void) 1482{ | 1462} 1463 1464static int __init loop_init(void) 1465{ |
1483 struct loop_device *lo; 1484 | |
1485 if (register_blkdev(LOOP_MAJOR, "loop")) 1486 return -EIO; 1487 blk_register_region(MKDEV(LOOP_MAJOR, 0), 1UL << MINORBITS, | 1466 if (register_blkdev(LOOP_MAJOR, "loop")) 1467 return -EIO; 1468 blk_register_region(MKDEV(LOOP_MAJOR, 0), 1UL << MINORBITS, |
1488 THIS_MODULE, loop_probe, NULL, NULL); | 1469 THIS_MODULE, loop_probe, loop_lock, NULL); |
1489 | 1470 |
1490 lo = loop_init_one(0); 1491 if (IS_ERR(lo)) 1492 goto out; 1493 | |
1494 if (max_loop) { 1495 printk(KERN_INFO "loop: the max_loop option is obsolete " 1496 "and will be removed in March 2008\n"); 1497 1498 } 1499 printk(KERN_INFO "loop: module loaded\n"); 1500 return 0; | 1471 if (max_loop) { 1472 printk(KERN_INFO "loop: the max_loop option is obsolete " 1473 "and will be removed in March 2008\n"); 1474 1475 } 1476 printk(KERN_INFO "loop: module loaded\n"); 1477 return 0; |
1501 1502out: 1503 unregister_blkdev(LOOP_MAJOR, "loop"); 1504 printk(KERN_ERR "loop: ran out of memory\n"); 1505 return -ENOMEM; | |
1506} 1507 1508static void __exit loop_exit(void) 1509{ 1510 struct loop_device *lo, *next; 1511 1512 list_for_each_entry_safe(lo, next, &loop_devices, lo_list) 1513 loop_del_one(lo); --- 18 unchanged lines hidden --- | 1478} 1479 1480static void __exit loop_exit(void) 1481{ 1482 struct loop_device *lo, *next; 1483 1484 list_for_each_entry_safe(lo, next, &loop_devices, lo_list) 1485 loop_del_one(lo); --- 18 unchanged lines hidden --- |