aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bitmap.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-06-01 05:37:35 -0400
committerNeilBrown <neilb@suse.de>2010-07-25 23:21:34 -0400
commit69e51b449d383e97b1b9f890f8378c96e9e17346 (patch)
tree650123fa4f08e8fa7f348a4ca875c59c129e5d84 /drivers/md/bitmap.c
parente384e58549a2e9a83071ad80280c1a9053cfd84c (diff)
md/bitmap: separate out loading a bitmap from initialising the structures.
dm makes this distinction between ->ctr and ->resume, so we need to too. Also get the new bitmap_load to clear out the bitmap first, as this is most consistent with the dm suspend/resume approach Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/bitmap.c')
-rw-r--r--drivers/md/bitmap.c69
1 files changed, 48 insertions, 21 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index 93765261c363..1ba1e122e948 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -1681,7 +1681,6 @@ int bitmap_create(mddev_t *mddev)
1681 unsigned long pages; 1681 unsigned long pages;
1682 struct file *file = mddev->bitmap_info.file; 1682 struct file *file = mddev->bitmap_info.file;
1683 int err; 1683 int err;
1684 sector_t start;
1685 struct sysfs_dirent *bm = NULL; 1684 struct sysfs_dirent *bm = NULL;
1686 1685
1687 BUILD_BUG_ON(sizeof(bitmap_super_t) != 256); 1686 BUILD_BUG_ON(sizeof(bitmap_super_t) != 256);
@@ -1763,13 +1762,40 @@ int bitmap_create(mddev_t *mddev)
1763 if (!bitmap->bp) 1762 if (!bitmap->bp)
1764 goto error; 1763 goto error;
1765 1764
1766 /* now that we have some pages available, initialize the in-memory 1765 printk(KERN_INFO "created bitmap (%lu pages) for device %s\n",
1767 * bitmap from the on-disk bitmap */ 1766 pages, bmname(bitmap));
1768 start = 0; 1767
1769 if (mddev->degraded == 0 1768 mddev->bitmap = bitmap;
1770 || bitmap->events_cleared == mddev->events) 1769
1771 /* no need to keep dirty bits to optimise a re-add of a missing device */ 1770
1772 start = mddev->recovery_cp; 1771 return (bitmap->flags & BITMAP_WRITE_ERROR) ? -EIO : 0;
1772
1773 error:
1774 bitmap_free(bitmap);
1775 return err;
1776}
1777
1778int bitmap_load(mddev_t *mddev)
1779{
1780 int err = 0;
1781 sector_t sector = 0;
1782 struct bitmap *bitmap = mddev->bitmap;
1783
1784 if (!bitmap)
1785 goto out;
1786
1787 /* Clear out old bitmap info first: Either there is none, or we
1788 * are resuming after someone else has possibly changed things,
1789 * so we should forget old cached info.
1790 * All chunks should be clean, but some might need_sync.
1791 */
1792 while (sector < mddev->resync_max_sectors) {
1793 int blocks;
1794 bitmap_start_sync(bitmap, sector, &blocks, 0);
1795 sector += blocks;
1796 }
1797 bitmap_close_sync(bitmap);
1798
1773 if (mddev->bitmap_info.log) { 1799 if (mddev->bitmap_info.log) {
1774 unsigned long i; 1800 unsigned long i;
1775 struct dm_dirty_log *log = mddev->bitmap_info.log; 1801 struct dm_dirty_log *log = mddev->bitmap_info.log;
@@ -1778,29 +1804,30 @@ int bitmap_create(mddev_t *mddev)
1778 bitmap_set_memory_bits(bitmap, 1804 bitmap_set_memory_bits(bitmap,
1779 (sector_t)i << CHUNK_BLOCK_SHIFT(bitmap), 1805 (sector_t)i << CHUNK_BLOCK_SHIFT(bitmap),
1780 1); 1806 1);
1781 err = 0; 1807 } else {
1782 } else 1808 sector_t start = 0;
1783 err = bitmap_init_from_disk(bitmap, start); 1809 if (mddev->degraded == 0
1810 || bitmap->events_cleared == mddev->events)
1811 /* no need to keep dirty bits to optimise a
1812 * re-add of a missing device */
1813 start = mddev->recovery_cp;
1784 1814
1815 err = bitmap_init_from_disk(bitmap, start);
1816 }
1785 if (err) 1817 if (err)
1786 goto error; 1818 goto out;
1787
1788 printk(KERN_INFO "created bitmap (%lu pages) for device %s\n",
1789 pages, bmname(bitmap));
1790
1791 mddev->bitmap = bitmap;
1792 1819
1793 mddev->thread->timeout = mddev->bitmap_info.daemon_sleep; 1820 mddev->thread->timeout = mddev->bitmap_info.daemon_sleep;
1794 md_wakeup_thread(mddev->thread); 1821 md_wakeup_thread(mddev->thread);
1795 1822
1796 bitmap_update_sb(bitmap); 1823 bitmap_update_sb(bitmap);
1797 1824
1798 return (bitmap->flags & BITMAP_WRITE_ERROR) ? -EIO : 0; 1825 if (bitmap->flags & BITMAP_WRITE_ERROR)
1799 1826 err = -EIO;
1800 error: 1827out:
1801 bitmap_free(bitmap);
1802 return err; 1828 return err;
1803} 1829}
1830EXPORT_SYMBOL_GPL(bitmap_load);
1804 1831
1805static ssize_t 1832static ssize_t
1806location_show(mddev_t *mddev, char *page) 1833location_show(mddev_t *mddev, char *page)