dm log: move region_size validation

Move log size validation from mirror target to log constructor.

Removed PAGE_SIZE restriction we no longer think necessary.

Signed-off-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>

authored by

Milan Broz and committed by
Alasdair G Kergon
2045e88e 6f3af01c

+14 -14
+14 -2
drivers/md/dm-log.c
··· 360 return 0; 361 } 362 363 /*---------------------------------------------------------------- 364 * core log constructor/destructor 365 * ··· 406 } 407 } 408 409 - if (sscanf(argv[0], "%u", &region_size) != 1) { 410 - DMWARN("invalid region size string"); 411 return -EINVAL; 412 } 413
··· 360 return 0; 361 } 362 363 + static int _check_region_size(struct dm_target *ti, uint32_t region_size) 364 + { 365 + if (region_size < 2 || region_size > ti->len) 366 + return 0; 367 + 368 + if (!is_power_of_2(region_size)) 369 + return 0; 370 + 371 + return 1; 372 + } 373 + 374 /*---------------------------------------------------------------- 375 * core log constructor/destructor 376 * ··· 395 } 396 } 397 398 + if (sscanf(argv[0], "%u", &region_size) != 1 || 399 + !_check_region_size(ti, region_size)) { 400 + DMWARN("invalid region size %s", argv[0]); 401 return -EINVAL; 402 } 403
-12
drivers/md/dm-raid1.c
··· 808 kfree(ms); 809 } 810 811 - static inline int _check_region_size(struct dm_target *ti, uint32_t size) 812 - { 813 - return !(size % (PAGE_SIZE >> 9) || !is_power_of_2(size) || 814 - size > ti->len); 815 - } 816 - 817 static int get_mirror(struct mirror_set *ms, struct dm_target *ti, 818 unsigned int mirror, char **argv) 819 { ··· 863 dl = dm_dirty_log_create(argv[0], ti, param_count, argv + 2); 864 if (!dl) { 865 ti->error = "Error creating mirror dirty log"; 866 - return NULL; 867 - } 868 - 869 - if (!_check_region_size(ti, dl->type->get_region_size(dl))) { 870 - ti->error = "Invalid region size"; 871 - dm_dirty_log_destroy(dl); 872 return NULL; 873 } 874
··· 808 kfree(ms); 809 } 810 811 static int get_mirror(struct mirror_set *ms, struct dm_target *ti, 812 unsigned int mirror, char **argv) 813 { ··· 869 dl = dm_dirty_log_create(argv[0], ti, param_count, argv + 2); 870 if (!dl) { 871 ti->error = "Error creating mirror dirty log"; 872 return NULL; 873 } 874