diff options
Diffstat (limited to 'fs/btrfs/tests/qgroup-tests.c')
-rw-r--r-- | fs/btrfs/tests/qgroup-tests.c | 111 |
1 files changed, 64 insertions, 47 deletions
diff --git a/fs/btrfs/tests/qgroup-tests.c b/fs/btrfs/tests/qgroup-tests.c index 8aa4ded31326..57a12c0d680b 100644 --- a/fs/btrfs/tests/qgroup-tests.c +++ b/fs/btrfs/tests/qgroup-tests.c | |||
@@ -16,6 +16,7 @@ | |||
16 | * Boston, MA 021110-1307, USA. | 16 | * Boston, MA 021110-1307, USA. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/types.h> | ||
19 | #include "btrfs-tests.h" | 20 | #include "btrfs-tests.h" |
20 | #include "../ctree.h" | 21 | #include "../ctree.h" |
21 | #include "../transaction.h" | 22 | #include "../transaction.h" |
@@ -216,7 +217,8 @@ static int remove_extent_ref(struct btrfs_root *root, u64 bytenr, | |||
216 | return ret; | 217 | return ret; |
217 | } | 218 | } |
218 | 219 | ||
219 | static int test_no_shared_qgroup(struct btrfs_root *root) | 220 | static int test_no_shared_qgroup(struct btrfs_root *root, |
221 | u32 sectorsize, u32 nodesize) | ||
220 | { | 222 | { |
221 | struct btrfs_trans_handle trans; | 223 | struct btrfs_trans_handle trans; |
222 | struct btrfs_fs_info *fs_info = root->fs_info; | 224 | struct btrfs_fs_info *fs_info = root->fs_info; |
@@ -227,7 +229,7 @@ static int test_no_shared_qgroup(struct btrfs_root *root) | |||
227 | btrfs_init_dummy_trans(&trans); | 229 | btrfs_init_dummy_trans(&trans); |
228 | 230 | ||
229 | test_msg("Qgroup basic add\n"); | 231 | test_msg("Qgroup basic add\n"); |
230 | ret = btrfs_create_qgroup(NULL, fs_info, 5); | 232 | ret = btrfs_create_qgroup(NULL, fs_info, BTRFS_FS_TREE_OBJECTID); |
231 | if (ret) { | 233 | if (ret) { |
232 | test_msg("Couldn't create a qgroup %d\n", ret); | 234 | test_msg("Couldn't create a qgroup %d\n", ret); |
233 | return ret; | 235 | return ret; |
@@ -238,18 +240,19 @@ static int test_no_shared_qgroup(struct btrfs_root *root) | |||
238 | * we can only call btrfs_qgroup_account_extent() directly to test | 240 | * we can only call btrfs_qgroup_account_extent() directly to test |
239 | * quota. | 241 | * quota. |
240 | */ | 242 | */ |
241 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots); | 243 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &old_roots); |
242 | if (ret) { | 244 | if (ret) { |
243 | ulist_free(old_roots); | 245 | ulist_free(old_roots); |
244 | test_msg("Couldn't find old roots: %d\n", ret); | 246 | test_msg("Couldn't find old roots: %d\n", ret); |
245 | return ret; | 247 | return ret; |
246 | } | 248 | } |
247 | 249 | ||
248 | ret = insert_normal_tree_ref(root, 4096, 4096, 0, 5); | 250 | ret = insert_normal_tree_ref(root, nodesize, nodesize, 0, |
251 | BTRFS_FS_TREE_OBJECTID); | ||
249 | if (ret) | 252 | if (ret) |
250 | return ret; | 253 | return ret; |
251 | 254 | ||
252 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots); | 255 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &new_roots); |
253 | if (ret) { | 256 | if (ret) { |
254 | ulist_free(old_roots); | 257 | ulist_free(old_roots); |
255 | ulist_free(new_roots); | 258 | ulist_free(new_roots); |
@@ -257,32 +260,33 @@ static int test_no_shared_qgroup(struct btrfs_root *root) | |||
257 | return ret; | 260 | return ret; |
258 | } | 261 | } |
259 | 262 | ||
260 | ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096, | 263 | ret = btrfs_qgroup_account_extent(&trans, fs_info, nodesize, |
261 | old_roots, new_roots); | 264 | nodesize, old_roots, new_roots); |
262 | if (ret) { | 265 | if (ret) { |
263 | test_msg("Couldn't account space for a qgroup %d\n", ret); | 266 | test_msg("Couldn't account space for a qgroup %d\n", ret); |
264 | return ret; | 267 | return ret; |
265 | } | 268 | } |
266 | 269 | ||
267 | if (btrfs_verify_qgroup_counts(fs_info, 5, 4096, 4096)) { | 270 | if (btrfs_verify_qgroup_counts(fs_info, BTRFS_FS_TREE_OBJECTID, |
271 | nodesize, nodesize)) { | ||
268 | test_msg("Qgroup counts didn't match expected values\n"); | 272 | test_msg("Qgroup counts didn't match expected values\n"); |
269 | return -EINVAL; | 273 | return -EINVAL; |
270 | } | 274 | } |
271 | old_roots = NULL; | 275 | old_roots = NULL; |
272 | new_roots = NULL; | 276 | new_roots = NULL; |
273 | 277 | ||
274 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots); | 278 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &old_roots); |
275 | if (ret) { | 279 | if (ret) { |
276 | ulist_free(old_roots); | 280 | ulist_free(old_roots); |
277 | test_msg("Couldn't find old roots: %d\n", ret); | 281 | test_msg("Couldn't find old roots: %d\n", ret); |
278 | return ret; | 282 | return ret; |
279 | } | 283 | } |
280 | 284 | ||
281 | ret = remove_extent_item(root, 4096, 4096); | 285 | ret = remove_extent_item(root, nodesize, nodesize); |
282 | if (ret) | 286 | if (ret) |
283 | return -EINVAL; | 287 | return -EINVAL; |
284 | 288 | ||
285 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots); | 289 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &new_roots); |
286 | if (ret) { | 290 | if (ret) { |
287 | ulist_free(old_roots); | 291 | ulist_free(old_roots); |
288 | ulist_free(new_roots); | 292 | ulist_free(new_roots); |
@@ -290,14 +294,14 @@ static int test_no_shared_qgroup(struct btrfs_root *root) | |||
290 | return ret; | 294 | return ret; |
291 | } | 295 | } |
292 | 296 | ||
293 | ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096, | 297 | ret = btrfs_qgroup_account_extent(&trans, fs_info, nodesize, |
294 | old_roots, new_roots); | 298 | nodesize, old_roots, new_roots); |
295 | if (ret) { | 299 | if (ret) { |
296 | test_msg("Couldn't account space for a qgroup %d\n", ret); | 300 | test_msg("Couldn't account space for a qgroup %d\n", ret); |
297 | return -EINVAL; | 301 | return -EINVAL; |
298 | } | 302 | } |
299 | 303 | ||
300 | if (btrfs_verify_qgroup_counts(fs_info, 5, 0, 0)) { | 304 | if (btrfs_verify_qgroup_counts(fs_info, BTRFS_FS_TREE_OBJECTID, 0, 0)) { |
301 | test_msg("Qgroup counts didn't match expected values\n"); | 305 | test_msg("Qgroup counts didn't match expected values\n"); |
302 | return -EINVAL; | 306 | return -EINVAL; |
303 | } | 307 | } |
@@ -310,7 +314,8 @@ static int test_no_shared_qgroup(struct btrfs_root *root) | |||
310 | * right, also remove one of the roots and make sure the exclusive count is | 314 | * right, also remove one of the roots and make sure the exclusive count is |
311 | * adjusted properly. | 315 | * adjusted properly. |
312 | */ | 316 | */ |
313 | static int test_multiple_refs(struct btrfs_root *root) | 317 | static int test_multiple_refs(struct btrfs_root *root, |
318 | u32 sectorsize, u32 nodesize) | ||
314 | { | 319 | { |
315 | struct btrfs_trans_handle trans; | 320 | struct btrfs_trans_handle trans; |
316 | struct btrfs_fs_info *fs_info = root->fs_info; | 321 | struct btrfs_fs_info *fs_info = root->fs_info; |
@@ -322,25 +327,29 @@ static int test_multiple_refs(struct btrfs_root *root) | |||
322 | 327 | ||
323 | test_msg("Qgroup multiple refs test\n"); | 328 | test_msg("Qgroup multiple refs test\n"); |
324 | 329 | ||
325 | /* We have 5 created already from the previous test */ | 330 | /* |
326 | ret = btrfs_create_qgroup(NULL, fs_info, 256); | 331 | * We have BTRFS_FS_TREE_OBJECTID created already from the |
332 | * previous test. | ||
333 | */ | ||
334 | ret = btrfs_create_qgroup(NULL, fs_info, BTRFS_FIRST_FREE_OBJECTID); | ||
327 | if (ret) { | 335 | if (ret) { |
328 | test_msg("Couldn't create a qgroup %d\n", ret); | 336 | test_msg("Couldn't create a qgroup %d\n", ret); |
329 | return ret; | 337 | return ret; |
330 | } | 338 | } |
331 | 339 | ||
332 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots); | 340 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &old_roots); |
333 | if (ret) { | 341 | if (ret) { |
334 | ulist_free(old_roots); | 342 | ulist_free(old_roots); |
335 | test_msg("Couldn't find old roots: %d\n", ret); | 343 | test_msg("Couldn't find old roots: %d\n", ret); |
336 | return ret; | 344 | return ret; |
337 | } | 345 | } |
338 | 346 | ||
339 | ret = insert_normal_tree_ref(root, 4096, 4096, 0, 5); | 347 | ret = insert_normal_tree_ref(root, nodesize, nodesize, 0, |
348 | BTRFS_FS_TREE_OBJECTID); | ||
340 | if (ret) | 349 | if (ret) |
341 | return ret; | 350 | return ret; |
342 | 351 | ||
343 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots); | 352 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &new_roots); |
344 | if (ret) { | 353 | if (ret) { |
345 | ulist_free(old_roots); | 354 | ulist_free(old_roots); |
346 | ulist_free(new_roots); | 355 | ulist_free(new_roots); |
@@ -348,30 +357,32 @@ static int test_multiple_refs(struct btrfs_root *root) | |||
348 | return ret; | 357 | return ret; |
349 | } | 358 | } |
350 | 359 | ||
351 | ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096, | 360 | ret = btrfs_qgroup_account_extent(&trans, fs_info, nodesize, |
352 | old_roots, new_roots); | 361 | nodesize, old_roots, new_roots); |
353 | if (ret) { | 362 | if (ret) { |
354 | test_msg("Couldn't account space for a qgroup %d\n", ret); | 363 | test_msg("Couldn't account space for a qgroup %d\n", ret); |
355 | return ret; | 364 | return ret; |
356 | } | 365 | } |
357 | 366 | ||
358 | if (btrfs_verify_qgroup_counts(fs_info, 5, 4096, 4096)) { | 367 | if (btrfs_verify_qgroup_counts(fs_info, BTRFS_FS_TREE_OBJECTID, |
368 | nodesize, nodesize)) { | ||
359 | test_msg("Qgroup counts didn't match expected values\n"); | 369 | test_msg("Qgroup counts didn't match expected values\n"); |
360 | return -EINVAL; | 370 | return -EINVAL; |
361 | } | 371 | } |
362 | 372 | ||
363 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots); | 373 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &old_roots); |
364 | if (ret) { | 374 | if (ret) { |
365 | ulist_free(old_roots); | 375 | ulist_free(old_roots); |
366 | test_msg("Couldn't find old roots: %d\n", ret); | 376 | test_msg("Couldn't find old roots: %d\n", ret); |
367 | return ret; | 377 | return ret; |
368 | } | 378 | } |
369 | 379 | ||
370 | ret = add_tree_ref(root, 4096, 4096, 0, 256); | 380 | ret = add_tree_ref(root, nodesize, nodesize, 0, |
381 | BTRFS_FIRST_FREE_OBJECTID); | ||
371 | if (ret) | 382 | if (ret) |
372 | return ret; | 383 | return ret; |
373 | 384 | ||
374 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots); | 385 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &new_roots); |
375 | if (ret) { | 386 | if (ret) { |
376 | ulist_free(old_roots); | 387 | ulist_free(old_roots); |
377 | ulist_free(new_roots); | 388 | ulist_free(new_roots); |
@@ -379,35 +390,38 @@ static int test_multiple_refs(struct btrfs_root *root) | |||
379 | return ret; | 390 | return ret; |
380 | } | 391 | } |
381 | 392 | ||
382 | ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096, | 393 | ret = btrfs_qgroup_account_extent(&trans, fs_info, nodesize, |
383 | old_roots, new_roots); | 394 | nodesize, old_roots, new_roots); |
384 | if (ret) { | 395 | if (ret) { |
385 | test_msg("Couldn't account space for a qgroup %d\n", ret); | 396 | test_msg("Couldn't account space for a qgroup %d\n", ret); |
386 | return ret; | 397 | return ret; |
387 | } | 398 | } |
388 | 399 | ||
389 | if (btrfs_verify_qgroup_counts(fs_info, 5, 4096, 0)) { | 400 | if (btrfs_verify_qgroup_counts(fs_info, BTRFS_FS_TREE_OBJECTID, |
401 | nodesize, 0)) { | ||
390 | test_msg("Qgroup counts didn't match expected values\n"); | 402 | test_msg("Qgroup counts didn't match expected values\n"); |
391 | return -EINVAL; | 403 | return -EINVAL; |
392 | } | 404 | } |
393 | 405 | ||
394 | if (btrfs_verify_qgroup_counts(fs_info, 256, 4096, 0)) { | 406 | if (btrfs_verify_qgroup_counts(fs_info, BTRFS_FIRST_FREE_OBJECTID, |
407 | nodesize, 0)) { | ||
395 | test_msg("Qgroup counts didn't match expected values\n"); | 408 | test_msg("Qgroup counts didn't match expected values\n"); |
396 | return -EINVAL; | 409 | return -EINVAL; |
397 | } | 410 | } |
398 | 411 | ||
399 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &old_roots); | 412 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &old_roots); |
400 | if (ret) { | 413 | if (ret) { |
401 | ulist_free(old_roots); | 414 | ulist_free(old_roots); |
402 | test_msg("Couldn't find old roots: %d\n", ret); | 415 | test_msg("Couldn't find old roots: %d\n", ret); |
403 | return ret; | 416 | return ret; |
404 | } | 417 | } |
405 | 418 | ||
406 | ret = remove_extent_ref(root, 4096, 4096, 0, 256); | 419 | ret = remove_extent_ref(root, nodesize, nodesize, 0, |
420 | BTRFS_FIRST_FREE_OBJECTID); | ||
407 | if (ret) | 421 | if (ret) |
408 | return ret; | 422 | return ret; |
409 | 423 | ||
410 | ret = btrfs_find_all_roots(&trans, fs_info, 4096, 0, &new_roots); | 424 | ret = btrfs_find_all_roots(&trans, fs_info, nodesize, 0, &new_roots); |
411 | if (ret) { | 425 | if (ret) { |
412 | ulist_free(old_roots); | 426 | ulist_free(old_roots); |
413 | ulist_free(new_roots); | 427 | ulist_free(new_roots); |
@@ -415,19 +429,21 @@ static int test_multiple_refs(struct btrfs_root *root) | |||
415 | return ret; | 429 | return ret; |
416 | } | 430 | } |
417 | 431 | ||
418 | ret = btrfs_qgroup_account_extent(&trans, fs_info, 4096, 4096, | 432 | ret = btrfs_qgroup_account_extent(&trans, fs_info, nodesize, |
419 | old_roots, new_roots); | 433 | nodesize, old_roots, new_roots); |
420 | if (ret) { | 434 | if (ret) { |
421 | test_msg("Couldn't account space for a qgroup %d\n", ret); | 435 | test_msg("Couldn't account space for a qgroup %d\n", ret); |
422 | return ret; | 436 | return ret; |
423 | } | 437 | } |
424 | 438 | ||
425 | if (btrfs_verify_qgroup_counts(fs_info, 256, 0, 0)) { | 439 | if (btrfs_verify_qgroup_counts(fs_info, BTRFS_FIRST_FREE_OBJECTID, |
440 | 0, 0)) { | ||
426 | test_msg("Qgroup counts didn't match expected values\n"); | 441 | test_msg("Qgroup counts didn't match expected values\n"); |
427 | return -EINVAL; | 442 | return -EINVAL; |
428 | } | 443 | } |
429 | 444 | ||
430 | if (btrfs_verify_qgroup_counts(fs_info, 5, 4096, 4096)) { | 445 | if (btrfs_verify_qgroup_counts(fs_info, BTRFS_FS_TREE_OBJECTID, |
446 | nodesize, nodesize)) { | ||
431 | test_msg("Qgroup counts didn't match expected values\n"); | 447 | test_msg("Qgroup counts didn't match expected values\n"); |
432 | return -EINVAL; | 448 | return -EINVAL; |
433 | } | 449 | } |
@@ -435,13 +451,13 @@ static int test_multiple_refs(struct btrfs_root *root) | |||
435 | return 0; | 451 | return 0; |
436 | } | 452 | } |
437 | 453 | ||
438 | int btrfs_test_qgroups(void) | 454 | int btrfs_test_qgroups(u32 sectorsize, u32 nodesize) |
439 | { | 455 | { |
440 | struct btrfs_root *root; | 456 | struct btrfs_root *root; |
441 | struct btrfs_root *tmp_root; | 457 | struct btrfs_root *tmp_root; |
442 | int ret = 0; | 458 | int ret = 0; |
443 | 459 | ||
444 | root = btrfs_alloc_dummy_root(); | 460 | root = btrfs_alloc_dummy_root(sectorsize, nodesize); |
445 | if (IS_ERR(root)) { | 461 | if (IS_ERR(root)) { |
446 | test_msg("Couldn't allocate root\n"); | 462 | test_msg("Couldn't allocate root\n"); |
447 | return PTR_ERR(root); | 463 | return PTR_ERR(root); |
@@ -468,7 +484,8 @@ int btrfs_test_qgroups(void) | |||
468 | * Can't use bytenr 0, some things freak out | 484 | * Can't use bytenr 0, some things freak out |
469 | * *cough*backref walking code*cough* | 485 | * *cough*backref walking code*cough* |
470 | */ | 486 | */ |
471 | root->node = alloc_test_extent_buffer(root->fs_info, 4096); | 487 | root->node = alloc_test_extent_buffer(root->fs_info, nodesize, |
488 | nodesize); | ||
472 | if (!root->node) { | 489 | if (!root->node) { |
473 | test_msg("Couldn't allocate dummy buffer\n"); | 490 | test_msg("Couldn't allocate dummy buffer\n"); |
474 | ret = -ENOMEM; | 491 | ret = -ENOMEM; |
@@ -476,16 +493,16 @@ int btrfs_test_qgroups(void) | |||
476 | } | 493 | } |
477 | btrfs_set_header_level(root->node, 0); | 494 | btrfs_set_header_level(root->node, 0); |
478 | btrfs_set_header_nritems(root->node, 0); | 495 | btrfs_set_header_nritems(root->node, 0); |
479 | root->alloc_bytenr += 8192; | 496 | root->alloc_bytenr += 2 * nodesize; |
480 | 497 | ||
481 | tmp_root = btrfs_alloc_dummy_root(); | 498 | tmp_root = btrfs_alloc_dummy_root(sectorsize, nodesize); |
482 | if (IS_ERR(tmp_root)) { | 499 | if (IS_ERR(tmp_root)) { |
483 | test_msg("Couldn't allocate a fs root\n"); | 500 | test_msg("Couldn't allocate a fs root\n"); |
484 | ret = PTR_ERR(tmp_root); | 501 | ret = PTR_ERR(tmp_root); |
485 | goto out; | 502 | goto out; |
486 | } | 503 | } |
487 | 504 | ||
488 | tmp_root->root_key.objectid = 5; | 505 | tmp_root->root_key.objectid = BTRFS_FS_TREE_OBJECTID; |
489 | root->fs_info->fs_root = tmp_root; | 506 | root->fs_info->fs_root = tmp_root; |
490 | ret = btrfs_insert_fs_root(root->fs_info, tmp_root); | 507 | ret = btrfs_insert_fs_root(root->fs_info, tmp_root); |
491 | if (ret) { | 508 | if (ret) { |
@@ -493,14 +510,14 @@ int btrfs_test_qgroups(void) | |||
493 | goto out; | 510 | goto out; |
494 | } | 511 | } |
495 | 512 | ||
496 | tmp_root = btrfs_alloc_dummy_root(); | 513 | tmp_root = btrfs_alloc_dummy_root(sectorsize, nodesize); |
497 | if (IS_ERR(tmp_root)) { | 514 | if (IS_ERR(tmp_root)) { |
498 | test_msg("Couldn't allocate a fs root\n"); | 515 | test_msg("Couldn't allocate a fs root\n"); |
499 | ret = PTR_ERR(tmp_root); | 516 | ret = PTR_ERR(tmp_root); |
500 | goto out; | 517 | goto out; |
501 | } | 518 | } |
502 | 519 | ||
503 | tmp_root->root_key.objectid = 256; | 520 | tmp_root->root_key.objectid = BTRFS_FIRST_FREE_OBJECTID; |
504 | ret = btrfs_insert_fs_root(root->fs_info, tmp_root); | 521 | ret = btrfs_insert_fs_root(root->fs_info, tmp_root); |
505 | if (ret) { | 522 | if (ret) { |
506 | test_msg("Couldn't insert fs root %d\n", ret); | 523 | test_msg("Couldn't insert fs root %d\n", ret); |
@@ -508,10 +525,10 @@ int btrfs_test_qgroups(void) | |||
508 | } | 525 | } |
509 | 526 | ||
510 | test_msg("Running qgroup tests\n"); | 527 | test_msg("Running qgroup tests\n"); |
511 | ret = test_no_shared_qgroup(root); | 528 | ret = test_no_shared_qgroup(root, sectorsize, nodesize); |
512 | if (ret) | 529 | if (ret) |
513 | goto out; | 530 | goto out; |
514 | ret = test_multiple_refs(root); | 531 | ret = test_multiple_refs(root, sectorsize, nodesize); |
515 | out: | 532 | out: |
516 | btrfs_free_dummy_root(root); | 533 | btrfs_free_dummy_root(root); |
517 | return ret; | 534 | return ret; |