dm.c (db8fef4fabe4a546ce74f80bff64fd43776e5912) dm.c (32a926da5a16c01a8213331e5764472ce2f14a8d)
1/*
2 * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
4 *
5 * This file is released under the GPL.
6 */
7
8#include "dm.h"

--- 1166 unchanged lines hidden (view full) ---

1175 sprintf(md->disk->disk_name, "dm-%d", minor);
1176 add_disk(md->disk);
1177 format_dev_t(md->name, MKDEV(_major, minor));
1178
1179 md->wq = create_singlethread_workqueue("kdmflush");
1180 if (!md->wq)
1181 goto bad_thread;
1182
1/*
2 * Copyright (C) 2001, 2002 Sistina Software (UK) Limited.
3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved.
4 *
5 * This file is released under the GPL.
6 */
7
8#include "dm.h"

--- 1166 unchanged lines hidden (view full) ---

1175 sprintf(md->disk->disk_name, "dm-%d", minor);
1176 add_disk(md->disk);
1177 format_dev_t(md->name, MKDEV(_major, minor));
1178
1179 md->wq = create_singlethread_workqueue("kdmflush");
1180 if (!md->wq)
1181 goto bad_thread;
1182
1183 md->bdev = bdget_disk(md->disk, 0);
1184 if (!md->bdev)
1185 goto bad_bdev;
1186
1183 /* Populate the mapping, nobody knows we exist yet */
1184 spin_lock(&_minor_lock);
1185 old_md = idr_replace(&_minor_idr, md, minor);
1186 spin_unlock(&_minor_lock);
1187
1188 BUG_ON(old_md != MINOR_ALLOCED);
1189
1190 return md;
1191
1187 /* Populate the mapping, nobody knows we exist yet */
1188 spin_lock(&_minor_lock);
1189 old_md = idr_replace(&_minor_idr, md, minor);
1190 spin_unlock(&_minor_lock);
1191
1192 BUG_ON(old_md != MINOR_ALLOCED);
1193
1194 return md;
1195
1196bad_bdev:
1197 destroy_workqueue(md->wq);
1192bad_thread:
1193 put_disk(md->disk);
1194bad_disk:
1195 bioset_free(md->bs);
1196bad_no_bioset:
1197 mempool_destroy(md->tio_pool);
1198bad_tio_pool:
1199 mempool_destroy(md->io_pool);

--- 9 unchanged lines hidden (view full) ---

1209}
1210
1211static void unlock_fs(struct mapped_device *md);
1212
1213static void free_dev(struct mapped_device *md)
1214{
1215 int minor = MINOR(disk_devt(md->disk));
1216
1198bad_thread:
1199 put_disk(md->disk);
1200bad_disk:
1201 bioset_free(md->bs);
1202bad_no_bioset:
1203 mempool_destroy(md->tio_pool);
1204bad_tio_pool:
1205 mempool_destroy(md->io_pool);

--- 9 unchanged lines hidden (view full) ---

1215}
1216
1217static void unlock_fs(struct mapped_device *md);
1218
1219static void free_dev(struct mapped_device *md)
1220{
1221 int minor = MINOR(disk_devt(md->disk));
1222
1217 if (md->bdev) {
1218 unlock_fs(md);
1219 bdput(md->bdev);
1220 }
1223 unlock_fs(md);
1224 bdput(md->bdev);
1221 destroy_workqueue(md->wq);
1222 mempool_destroy(md->tio_pool);
1223 mempool_destroy(md->io_pool);
1224 bioset_free(md->bs);
1225 blk_integrity_unregister(md->disk);
1226 del_gendisk(md->disk);
1227 free_minor(minor);
1228

--- 43 unchanged lines hidden (view full) ---

1272 size = dm_table_get_size(t);
1273
1274 /*
1275 * Wipe any geometry if the size of the table changed.
1276 */
1277 if (size != get_capacity(md->disk))
1278 memset(&md->geometry, 0, sizeof(md->geometry));
1279
1225 destroy_workqueue(md->wq);
1226 mempool_destroy(md->tio_pool);
1227 mempool_destroy(md->io_pool);
1228 bioset_free(md->bs);
1229 blk_integrity_unregister(md->disk);
1230 del_gendisk(md->disk);
1231 free_minor(minor);
1232

--- 43 unchanged lines hidden (view full) ---

1276 size = dm_table_get_size(t);
1277
1278 /*
1279 * Wipe any geometry if the size of the table changed.
1280 */
1281 if (size != get_capacity(md->disk))
1282 memset(&md->geometry, 0, sizeof(md->geometry));
1283
1280 if (md->bdev)
1281 __set_size(md, size);
1284 __set_size(md, size);
1282
1283 if (!size) {
1284 dm_table_destroy(t);
1285 return 0;
1286 }
1287
1288 dm_table_event_callback(t, event_callback, md);
1289

--- 225 unchanged lines hidden (view full) ---

1515 int r = -EINVAL;
1516
1517 mutex_lock(&md->suspend_lock);
1518
1519 /* device must be suspended */
1520 if (!dm_suspended(md))
1521 goto out;
1522
1285
1286 if (!size) {
1287 dm_table_destroy(t);
1288 return 0;
1289 }
1290
1291 dm_table_event_callback(t, event_callback, md);
1292

--- 225 unchanged lines hidden (view full) ---

1518 int r = -EINVAL;
1519
1520 mutex_lock(&md->suspend_lock);
1521
1522 /* device must be suspended */
1523 if (!dm_suspended(md))
1524 goto out;
1525
1523 /* without bdev, the device size cannot be changed */
1524 if (!md->bdev)
1525 if (get_capacity(md->disk) != dm_table_get_size(table))
1526 goto out;
1527
1528 __unbind(md);
1529 r = __bind(md, table);
1530
1531out:
1532 mutex_unlock(&md->suspend_lock);
1533 return r;
1534}
1535

--- 11 unchanged lines hidden (view full) ---

1547 if (IS_ERR(md->frozen_sb)) {
1548 r = PTR_ERR(md->frozen_sb);
1549 md->frozen_sb = NULL;
1550 return r;
1551 }
1552
1553 set_bit(DMF_FROZEN, &md->flags);
1554
1526 __unbind(md);
1527 r = __bind(md, table);
1528
1529out:
1530 mutex_unlock(&md->suspend_lock);
1531 return r;
1532}
1533

--- 11 unchanged lines hidden (view full) ---

1545 if (IS_ERR(md->frozen_sb)) {
1546 r = PTR_ERR(md->frozen_sb);
1547 md->frozen_sb = NULL;
1548 return r;
1549 }
1550
1551 set_bit(DMF_FROZEN, &md->flags);
1552
1555 /* don't bdput right now, we don't want the bdev
1556 * to go away while it is locked.
1557 */
1558 return 0;
1559}
1560
1561static void unlock_fs(struct mapped_device *md)
1562{
1563 if (!test_bit(DMF_FROZEN, &md->flags))
1564 return;
1565

--- 30 unchanged lines hidden (view full) ---

1596 * This flag is cleared before dm_suspend returns.
1597 */
1598 if (noflush)
1599 set_bit(DMF_NOFLUSH_SUSPENDING, &md->flags);
1600
1601 /* This does not get reverted if there's an error later. */
1602 dm_table_presuspend_targets(map);
1603
1553 return 0;
1554}
1555
1556static void unlock_fs(struct mapped_device *md)
1557{
1558 if (!test_bit(DMF_FROZEN, &md->flags))
1559 return;
1560

--- 30 unchanged lines hidden (view full) ---

1591 * This flag is cleared before dm_suspend returns.
1592 */
1593 if (noflush)
1594 set_bit(DMF_NOFLUSH_SUSPENDING, &md->flags);
1595
1596 /* This does not get reverted if there's an error later. */
1597 dm_table_presuspend_targets(map);
1598
1604 /* bdget() can stall if the pending I/Os are not flushed */
1605 if (!noflush) {
1606 md->bdev = bdget_disk(md->disk, 0);
1607 if (!md->bdev) {
1608 DMWARN("bdget failed in dm_suspend");
1609 r = -ENOMEM;
1599 /*
1600 * Flush I/O to the device. noflush supersedes do_lockfs,
1601 * because lock_fs() needs to flush I/Os.
1602 */
1603 if (!noflush && do_lockfs) {
1604 r = lock_fs(md);
1605 if (r)
1610 goto out;
1606 goto out;
1611 }
1612
1613 /*
1614 * Flush I/O to the device. noflush supersedes do_lockfs,
1615 * because lock_fs() needs to flush I/Os.
1616 */
1617 if (do_lockfs) {
1618 r = lock_fs(md);
1619 if (r)
1620 goto out;
1621 }
1622 }
1623
1624 /*
1625 * Here we must make sure that no processes are submitting requests
1626 * to target drivers i.e. no one may be executing
1627 * __split_and_process_bio. This is called from dm_request and
1628 * dm_wq_work.
1629 *

--- 40 unchanged lines hidden (view full) ---

1670 * requests are being added to md->deferred list.
1671 */
1672
1673 dm_table_postsuspend_targets(map);
1674
1675 set_bit(DMF_SUSPENDED, &md->flags);
1676
1677out:
1607 }
1608
1609 /*
1610 * Here we must make sure that no processes are submitting requests
1611 * to target drivers i.e. no one may be executing
1612 * __split_and_process_bio. This is called from dm_request and
1613 * dm_wq_work.
1614 *

--- 40 unchanged lines hidden (view full) ---

1655 * requests are being added to md->deferred list.
1656 */
1657
1658 dm_table_postsuspend_targets(map);
1659
1660 set_bit(DMF_SUSPENDED, &md->flags);
1661
1662out:
1678 if (r && md->bdev) {
1679 bdput(md->bdev);
1680 md->bdev = NULL;
1681 }
1682
1683 dm_table_put(map);
1684
1685out_unlock:
1686 mutex_unlock(&md->suspend_lock);
1687 return r;
1688}
1689
1690int dm_resume(struct mapped_device *md)

--- 12 unchanged lines hidden (view full) ---

1703 r = dm_table_resume_targets(map);
1704 if (r)
1705 goto out;
1706
1707 dm_queue_flush(md);
1708
1709 unlock_fs(md);
1710
1663 dm_table_put(map);
1664
1665out_unlock:
1666 mutex_unlock(&md->suspend_lock);
1667 return r;
1668}
1669
1670int dm_resume(struct mapped_device *md)

--- 12 unchanged lines hidden (view full) ---

1683 r = dm_table_resume_targets(map);
1684 if (r)
1685 goto out;
1686
1687 dm_queue_flush(md);
1688
1689 unlock_fs(md);
1690
1711 if (md->bdev) {
1712 bdput(md->bdev);
1713 md->bdev = NULL;
1714 }
1715
1716 clear_bit(DMF_SUSPENDED, &md->flags);
1717
1718 dm_table_unplug_all(map);
1719
1720 dm_kobject_uevent(md);
1721
1722 r = 0;
1723

--- 111 unchanged lines hidden ---
1691 clear_bit(DMF_SUSPENDED, &md->flags);
1692
1693 dm_table_unplug_all(map);
1694
1695 dm_kobject_uevent(md);
1696
1697 r = 0;
1698

--- 111 unchanged lines hidden ---