Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'dm-3.3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-dm

Pull device-mapper fixes for 3.3 from Alasdair Kergon

Eight small device-mapper bug fixes.

* tag 'dm-3.3-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-dm:
dm raid: fix flush support
dm raid: set MD_CHANGE_DEVS when rebuilding
dm thin metadata: decrement counter after removing mapped block
dm thin metadata: unlock superblock in init_pmd error path
dm thin metadata: remove incorrect close_device on creation error paths
dm flakey: fix crash on read when corrupt_bio_byte not set
dm io: fix discard support
dm ioctl: do not leak argv if target message only contains whitespace

+49 -20
+1 -1
drivers/md/dm-flakey.c
··· 323 323 * Corrupt successful READs while in down state. 324 324 * If flags were specified, only corrupt those that match. 325 325 */ 326 - if (!error && bio_submitted_while_down && 326 + if (fc->corrupt_bio_byte && !error && bio_submitted_while_down && 327 327 (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) && 328 328 all_corrupt_bio_flags_match(bio, fc)) 329 329 corrupt_bio_data(bio, fc);
+16 -7
drivers/md/dm-io.c
··· 296 296 unsigned offset; 297 297 unsigned num_bvecs; 298 298 sector_t remaining = where->count; 299 + struct request_queue *q = bdev_get_queue(where->bdev); 300 + sector_t discard_sectors; 299 301 300 302 /* 301 303 * where->count may be zero if rw holds a flush and we need to ··· 307 305 /* 308 306 * Allocate a suitably sized-bio. 309 307 */ 310 - num_bvecs = dm_sector_div_up(remaining, 311 - (PAGE_SIZE >> SECTOR_SHIFT)); 312 - num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev), num_bvecs); 308 + if (rw & REQ_DISCARD) 309 + num_bvecs = 1; 310 + else 311 + num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev), 312 + dm_sector_div_up(remaining, (PAGE_SIZE >> SECTOR_SHIFT))); 313 + 313 314 bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); 314 315 bio->bi_sector = where->sector + (where->count - remaining); 315 316 bio->bi_bdev = where->bdev; ··· 320 315 bio->bi_destructor = dm_bio_destructor; 321 316 store_io_and_region_in_bio(bio, io, region); 322 317 323 - /* 324 - * Try and add as many pages as possible. 325 - */ 326 - while (remaining) { 318 + if (rw & REQ_DISCARD) { 319 + discard_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining); 320 + bio->bi_size = discard_sectors << SECTOR_SHIFT; 321 + remaining -= discard_sectors; 322 + } else while (remaining) { 323 + /* 324 + * Try and add as many pages as possible. 325 + */ 327 326 dp->get_page(dp, &page, &len, &offset); 328 327 len = min(len, to_bytes(remaining)); 329 328 if (!bio_add_page(bio, page, len, offset))
+1 -1
drivers/md/dm-ioctl.c
··· 1437 1437 1438 1438 if (!argc) { 1439 1439 DMWARN("Empty message received."); 1440 - goto out; 1440 + goto out_argv; 1441 1441 } 1442 1442 1443 1443 table = dm_get_live_table(md);
+11 -6
drivers/md/dm-raid.c
··· 668 668 return ret; 669 669 670 670 sb = page_address(rdev->sb_page); 671 - if (sb->magic != cpu_to_le32(DM_RAID_MAGIC)) { 671 + 672 + /* 673 + * Two cases that we want to write new superblocks and rebuild: 674 + * 1) New device (no matching magic number) 675 + * 2) Device specified for rebuild (!In_sync w/ offset == 0) 676 + */ 677 + if ((sb->magic != cpu_to_le32(DM_RAID_MAGIC)) || 678 + (!test_bit(In_sync, &rdev->flags) && !rdev->recovery_offset)) { 672 679 super_sync(rdev->mddev, rdev); 673 680 674 681 set_bit(FirstUse, &rdev->flags); ··· 752 745 */ 753 746 rdev_for_each(r, t, mddev) { 754 747 if (!test_bit(In_sync, &r->flags)) { 755 - if (!test_bit(FirstUse, &r->flags)) 756 - DMERR("Superblock area of " 757 - "rebuild device %d should have been " 758 - "cleared.", r->raid_disk); 759 - set_bit(FirstUse, &r->flags); 748 + DMINFO("Device %d specified for rebuild: " 749 + "Clearing superblock", r->raid_disk); 760 750 rebuilds++; 761 751 } else if (test_bit(FirstUse, &r->flags)) 762 752 new_devs++; ··· 975 971 976 972 INIT_WORK(&rs->md.event_work, do_table_event); 977 973 ti->private = rs; 974 + ti->num_flush_requests = 1; 978 975 979 976 mutex_lock(&rs->md.reconfig_mutex); 980 977 ret = md_run(&rs->md);
+20 -5
drivers/md/dm-thin-metadata.c
··· 385 385 data_sm = dm_sm_disk_create(tm, nr_blocks); 386 386 if (IS_ERR(data_sm)) { 387 387 DMERR("sm_disk_create failed"); 388 + dm_tm_unlock(tm, sblock); 388 389 r = PTR_ERR(data_sm); 389 390 goto bad; 390 391 } ··· 790 789 return 0; 791 790 } 792 791 792 + /* 793 + * __open_device: Returns @td corresponding to device with id @dev, 794 + * creating it if @create is set and incrementing @td->open_count. 795 + * On failure, @td is undefined. 796 + */ 793 797 static int __open_device(struct dm_pool_metadata *pmd, 794 798 dm_thin_id dev, int create, 795 799 struct dm_thin_device **td) ··· 805 799 struct disk_device_details details_le; 806 800 807 801 /* 808 - * Check the device isn't already open. 802 + * If the device is already open, return it. 809 803 */ 810 804 list_for_each_entry(td2, &pmd->thin_devices, list) 811 805 if (td2->id == dev) { 806 + /* 807 + * May not create an already-open device. 808 + */ 809 + if (create) 810 + return -EEXIST; 811 + 812 812 td2->open_count++; 813 813 *td = td2; 814 814 return 0; ··· 829 817 if (r != -ENODATA || !create) 830 818 return r; 831 819 820 + /* 821 + * Create new device. 822 + */ 832 823 changed = 1; 833 824 details_le.mapped_blocks = 0; 834 825 details_le.transaction_id = cpu_to_le64(pmd->trans_id); ··· 897 882 898 883 r = __open_device(pmd, dev, 1, &td); 899 884 if (r) { 900 - __close_device(td); 901 885 dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); 902 886 dm_btree_del(&pmd->bl_info, dev_root); 903 887 return r; 904 888 } 905 - td->changed = 1; 906 889 __close_device(td); 907 890 908 891 return r; ··· 980 967 goto bad; 981 968 982 969 r = __set_snapshot_details(pmd, td, origin, pmd->time); 970 + __close_device(td); 971 + 983 972 if (r) 984 973 goto bad; 985 974 986 - __close_device(td); 987 975 return 0; 988 976 989 977 bad: 990 - __close_device(td); 991 978 dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); 992 979 dm_btree_remove(&pmd->details_info, pmd->details_root, 993 980 &key, &pmd->details_root); ··· 1224 1211 if (r) 1225 1212 return r; 1226 1213 1214 + td->mapped_blocks--; 1215 + td->changed = 1; 1227 1216 pmd->need_commit = 1; 1228 1217 1229 1218 return 0;