Beispiel #1
0
static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
{
    mdk_rdev_t *rdev;
    struct list_head *tmp;
    mddev_t *mddev = bitmap->mddev;

    ITERATE_RDEV(mddev, rdev, tmp)
    if (test_bit(In_sync, &rdev->flags)
            && !test_bit(Faulty, &rdev->flags)) {
        int size = PAGE_SIZE;
        if (page->index == bitmap->file_pages-1)
            size = roundup(bitmap->last_page_size,
                           bdev_hardsect_size(rdev->bdev));
        /* Just make sure we aren't corrupting data or
         * metadata
         */
        if (bitmap->offset < 0) {
            /* DATA  BITMAP METADATA  */
            if (bitmap->offset
                    + page->index * (PAGE_SIZE/512)
                    + size/512 > 0)
                /* bitmap runs in to metadata */
                return -EINVAL;
            if (rdev->data_offset + mddev->size*2
                    > rdev->sb_offset*2 + bitmap->offset)
                /* data runs in to bitmap */
                return -EINVAL;
        } else if (rdev->sb_offset*2 < rdev->data_offset) {
            /* METADATA BITMAP DATA */
            if (rdev->sb_offset*2
                    + bitmap->offset
                    + page->index*(PAGE_SIZE/512) + size/512
                    > rdev->data_offset)
                /* bitmap runs in to data */
                return -EINVAL;
        } else {
            /* DATA METADATA BITMAP - no problems */
        }
        md_super_write(mddev, rdev,
                       (rdev->sb_offset<<1) + bitmap->offset
                       + page->index * (PAGE_SIZE/512),
                       size,
                       page);
    }

    if (wait)
        md_super_wait(mddev);
    return 0;
}
Beispiel #2
0
static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait)
{
    mdk_rdev_t *rdev;
    struct list_head *tmp;

    ITERATE_RDEV(mddev, rdev, tmp)
    if (test_bit(In_sync, &rdev->flags)
            && !test_bit(Faulty, &rdev->flags))
        md_super_write(mddev, rdev,
                       (rdev->sb_offset<<1) + offset
                       + page->index * (PAGE_SIZE/512),
                       PAGE_SIZE,
                       page);

    if (wait)
        md_super_wait(mddev);
    return 0;
}
Beispiel #3
0
static int write_sb_page(mddev_t *mddev, long offset, struct page *page, int wait)
{
	mdk_rdev_t *rdev;

	rcu_read_lock();
	rdev_for_each_rcu(rdev, mddev)
		if (test_bit(In_sync, &rdev->flags)
		    && !test_bit(Faulty, &rdev->flags))
			md_super_write(mddev, rdev,
				       (rdev->sb_offset<<1) + offset
				       + page->index * (PAGE_SIZE/512),
				       PAGE_SIZE,
				       page);
	rcu_read_unlock();

	if (wait)
		md_super_wait(mddev);
	return 0;
}
Beispiel #4
0
static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
{
	mdk_rdev_t *rdev;
	struct list_head *tmp;
	mddev_t *mddev = bitmap->mddev;

	ITERATE_RDEV(mddev, rdev, tmp)
		if (test_bit(In_sync, &rdev->flags)
		    && !test_bit(Faulty, &rdev->flags)) {
			int size = PAGE_SIZE;
			if (page->index == bitmap->file_pages-1)
				size = roundup(bitmap->last_page_size,
					       bdev_hardsect_size(rdev->bdev));
			md_super_write(mddev, rdev,
				       (rdev->sb_offset<<1) + bitmap->offset
				       + page->index * (PAGE_SIZE/512),
				       size,
				       page);
		}

	if (wait)
		md_super_wait(mddev);
	return 0;
}