diff options
-rw-r--r-- | fs/nilfs2/bmap.c | 181 | ||||
-rw-r--r-- | fs/nilfs2/bmap.h | 110 | ||||
-rw-r--r-- | fs/nilfs2/btree.c | 100 | ||||
-rw-r--r-- | fs/nilfs2/direct.c | 30 |
4 files changed, 187 insertions, 234 deletions
diff --git a/fs/nilfs2/bmap.c b/fs/nilfs2/bmap.c index de67d2a12515..51824c764294 100644 --- a/fs/nilfs2/bmap.c +++ b/fs/nilfs2/bmap.c | |||
@@ -31,21 +31,26 @@ | |||
31 | #include "dat.h" | 31 | #include "dat.h" |
32 | #include "alloc.h" | 32 | #include "alloc.h" |
33 | 33 | ||
34 | static struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap) | ||
35 | { | ||
36 | return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode)); | ||
37 | } | ||
38 | |||
34 | int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level, | 39 | int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level, |
35 | __u64 *ptrp) | 40 | __u64 *ptrp) |
36 | { | 41 | { |
37 | __u64 ptr; | 42 | sector_t blocknr; |
38 | int ret; | 43 | int ret; |
39 | 44 | ||
40 | down_read(&bmap->b_sem); | 45 | down_read(&bmap->b_sem); |
41 | ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp); | 46 | ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp); |
42 | if (ret < 0) | 47 | if (ret < 0) |
43 | goto out; | 48 | goto out; |
44 | if (bmap->b_pops->bpop_translate != NULL) { | 49 | if (NILFS_BMAP_USE_VBN(bmap)) { |
45 | ret = bmap->b_pops->bpop_translate(bmap, *ptrp, &ptr); | 50 | ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), *ptrp, |
46 | if (ret < 0) | 51 | &blocknr); |
47 | goto out; | 52 | if (!ret) |
48 | *ptrp = ptr; | 53 | *ptrp = blocknr; |
49 | } | 54 | } |
50 | 55 | ||
51 | out: | 56 | out: |
@@ -442,11 +447,6 @@ __u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *bmap, __u64 key) | |||
442 | return NILFS_BMAP_INVALID_PTR; | 447 | return NILFS_BMAP_INVALID_PTR; |
443 | } | 448 | } |
444 | 449 | ||
445 | static struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap) | ||
446 | { | ||
447 | return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode)); | ||
448 | } | ||
449 | |||
450 | #define NILFS_BMAP_GROUP_DIV 8 | 450 | #define NILFS_BMAP_GROUP_DIV 8 |
451 | __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *bmap) | 451 | __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *bmap) |
452 | { | 452 | { |
@@ -459,20 +459,20 @@ __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *bmap) | |||
459 | (entries_per_group / NILFS_BMAP_GROUP_DIV); | 459 | (entries_per_group / NILFS_BMAP_GROUP_DIV); |
460 | } | 460 | } |
461 | 461 | ||
462 | static int nilfs_bmap_prepare_alloc_v(struct nilfs_bmap *bmap, | 462 | int nilfs_bmap_prepare_alloc_v(struct nilfs_bmap *bmap, |
463 | union nilfs_bmap_ptr_req *req) | 463 | union nilfs_bmap_ptr_req *req) |
464 | { | 464 | { |
465 | return nilfs_dat_prepare_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req); | 465 | return nilfs_dat_prepare_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req); |
466 | } | 466 | } |
467 | 467 | ||
468 | static void nilfs_bmap_commit_alloc_v(struct nilfs_bmap *bmap, | 468 | void nilfs_bmap_commit_alloc_v(struct nilfs_bmap *bmap, |
469 | union nilfs_bmap_ptr_req *req) | 469 | union nilfs_bmap_ptr_req *req) |
470 | { | 470 | { |
471 | nilfs_dat_commit_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req); | 471 | nilfs_dat_commit_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req); |
472 | } | 472 | } |
473 | 473 | ||
474 | static void nilfs_bmap_abort_alloc_v(struct nilfs_bmap *bmap, | 474 | void nilfs_bmap_abort_alloc_v(struct nilfs_bmap *bmap, |
475 | union nilfs_bmap_ptr_req *req) | 475 | union nilfs_bmap_ptr_req *req) |
476 | { | 476 | { |
477 | nilfs_dat_abort_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req); | 477 | nilfs_dat_abort_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req); |
478 | } | 478 | } |
@@ -489,26 +489,21 @@ int nilfs_bmap_start_v(struct nilfs_bmap *bmap, union nilfs_bmap_ptr_req *req, | |||
489 | return ret; | 489 | return ret; |
490 | } | 490 | } |
491 | 491 | ||
492 | static int nilfs_bmap_prepare_end_v(struct nilfs_bmap *bmap, | 492 | int nilfs_bmap_prepare_end_v(struct nilfs_bmap *bmap, |
493 | union nilfs_bmap_ptr_req *req) | 493 | union nilfs_bmap_ptr_req *req) |
494 | { | 494 | { |
495 | return nilfs_dat_prepare_end(nilfs_bmap_get_dat(bmap), &req->bpr_req); | 495 | return nilfs_dat_prepare_end(nilfs_bmap_get_dat(bmap), &req->bpr_req); |
496 | } | 496 | } |
497 | 497 | ||
498 | static void nilfs_bmap_commit_end_v(struct nilfs_bmap *bmap, | 498 | void nilfs_bmap_commit_end_v(struct nilfs_bmap *bmap, |
499 | union nilfs_bmap_ptr_req *req) | 499 | union nilfs_bmap_ptr_req *req) |
500 | { | ||
501 | nilfs_dat_commit_end(nilfs_bmap_get_dat(bmap), &req->bpr_req, 0); | ||
502 | } | ||
503 | |||
504 | static void nilfs_bmap_commit_end_vmdt(struct nilfs_bmap *bmap, | ||
505 | union nilfs_bmap_ptr_req *req) | ||
506 | { | 500 | { |
507 | nilfs_dat_commit_end(nilfs_bmap_get_dat(bmap), &req->bpr_req, 1); | 501 | nilfs_dat_commit_end(nilfs_bmap_get_dat(bmap), &req->bpr_req, |
502 | bmap->b_ptr_type == NILFS_BMAP_PTR_VS); | ||
508 | } | 503 | } |
509 | 504 | ||
510 | static void nilfs_bmap_abort_end_v(struct nilfs_bmap *bmap, | 505 | void nilfs_bmap_abort_end_v(struct nilfs_bmap *bmap, |
511 | union nilfs_bmap_ptr_req *req) | 506 | union nilfs_bmap_ptr_req *req) |
512 | { | 507 | { |
513 | nilfs_dat_abort_end(nilfs_bmap_get_dat(bmap), &req->bpr_req); | 508 | nilfs_dat_abort_end(nilfs_bmap_get_dat(bmap), &req->bpr_req); |
514 | } | 509 | } |
@@ -524,116 +519,44 @@ int nilfs_bmap_mark_dirty(const struct nilfs_bmap *bmap, __u64 vblocknr) | |||
524 | return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(bmap), vblocknr); | 519 | return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(bmap), vblocknr); |
525 | } | 520 | } |
526 | 521 | ||
527 | int nilfs_bmap_prepare_update(struct nilfs_bmap *bmap, | 522 | int nilfs_bmap_prepare_update_v(struct nilfs_bmap *bmap, |
528 | union nilfs_bmap_ptr_req *oldreq, | 523 | union nilfs_bmap_ptr_req *oldreq, |
529 | union nilfs_bmap_ptr_req *newreq) | 524 | union nilfs_bmap_ptr_req *newreq) |
530 | { | 525 | { |
526 | struct inode *dat = nilfs_bmap_get_dat(bmap); | ||
531 | int ret; | 527 | int ret; |
532 | 528 | ||
533 | ret = bmap->b_pops->bpop_prepare_end_ptr(bmap, oldreq); | 529 | ret = nilfs_dat_prepare_end(dat, &oldreq->bpr_req); |
534 | if (ret < 0) | 530 | if (ret < 0) |
535 | return ret; | 531 | return ret; |
536 | ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, newreq); | 532 | ret = nilfs_dat_prepare_alloc(dat, &newreq->bpr_req); |
537 | if (ret < 0) | 533 | if (ret < 0) |
538 | bmap->b_pops->bpop_abort_end_ptr(bmap, oldreq); | 534 | nilfs_dat_abort_end(dat, &oldreq->bpr_req); |
539 | 535 | ||
540 | return ret; | 536 | return ret; |
541 | } | 537 | } |
542 | 538 | ||
543 | void nilfs_bmap_commit_update(struct nilfs_bmap *bmap, | 539 | void nilfs_bmap_commit_update_v(struct nilfs_bmap *bmap, |
544 | union nilfs_bmap_ptr_req *oldreq, | 540 | union nilfs_bmap_ptr_req *oldreq, |
545 | union nilfs_bmap_ptr_req *newreq) | 541 | union nilfs_bmap_ptr_req *newreq) |
546 | { | ||
547 | bmap->b_pops->bpop_commit_end_ptr(bmap, oldreq); | ||
548 | bmap->b_pops->bpop_commit_alloc_ptr(bmap, newreq); | ||
549 | } | ||
550 | |||
551 | void nilfs_bmap_abort_update(struct nilfs_bmap *bmap, | ||
552 | union nilfs_bmap_ptr_req *oldreq, | ||
553 | union nilfs_bmap_ptr_req *newreq) | ||
554 | { | ||
555 | bmap->b_pops->bpop_abort_end_ptr(bmap, oldreq); | ||
556 | bmap->b_pops->bpop_abort_alloc_ptr(bmap, newreq); | ||
557 | } | ||
558 | |||
559 | static int nilfs_bmap_translate_v(const struct nilfs_bmap *bmap, __u64 ptr, | ||
560 | __u64 *ptrp) | ||
561 | { | 542 | { |
562 | sector_t blocknr; | 543 | struct inode *dat = nilfs_bmap_get_dat(bmap); |
563 | int ret; | ||
564 | |||
565 | ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), ptr, &blocknr); | ||
566 | if (ret < 0) | ||
567 | return ret; | ||
568 | if (ptrp != NULL) | ||
569 | *ptrp = blocknr; | ||
570 | return 0; | ||
571 | } | ||
572 | 544 | ||
573 | static int nilfs_bmap_prepare_alloc_p(struct nilfs_bmap *bmap, | 545 | nilfs_dat_commit_end(dat, &oldreq->bpr_req, |
574 | union nilfs_bmap_ptr_req *req) | 546 | bmap->b_ptr_type == NILFS_BMAP_PTR_VS); |
575 | { | 547 | nilfs_dat_commit_alloc(dat, &newreq->bpr_req); |
576 | /* ignore target ptr */ | ||
577 | req->bpr_ptr = bmap->b_last_allocated_ptr++; | ||
578 | return 0; | ||
579 | } | 548 | } |
580 | 549 | ||
581 | static void nilfs_bmap_commit_alloc_p(struct nilfs_bmap *bmap, | 550 | void nilfs_bmap_abort_update_v(struct nilfs_bmap *bmap, |
582 | union nilfs_bmap_ptr_req *req) | 551 | union nilfs_bmap_ptr_req *oldreq, |
552 | union nilfs_bmap_ptr_req *newreq) | ||
583 | { | 553 | { |
584 | /* do nothing */ | 554 | struct inode *dat = nilfs_bmap_get_dat(bmap); |
585 | } | ||
586 | 555 | ||
587 | static void nilfs_bmap_abort_alloc_p(struct nilfs_bmap *bmap, | 556 | nilfs_dat_abort_end(dat, &oldreq->bpr_req); |
588 | union nilfs_bmap_ptr_req *req) | 557 | nilfs_dat_abort_alloc(dat, &newreq->bpr_req); |
589 | { | ||
590 | bmap->b_last_allocated_ptr--; | ||
591 | } | 558 | } |
592 | 559 | ||
593 | static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_v = { | ||
594 | .bpop_prepare_alloc_ptr = nilfs_bmap_prepare_alloc_v, | ||
595 | .bpop_commit_alloc_ptr = nilfs_bmap_commit_alloc_v, | ||
596 | .bpop_abort_alloc_ptr = nilfs_bmap_abort_alloc_v, | ||
597 | .bpop_prepare_end_ptr = nilfs_bmap_prepare_end_v, | ||
598 | .bpop_commit_end_ptr = nilfs_bmap_commit_end_v, | ||
599 | .bpop_abort_end_ptr = nilfs_bmap_abort_end_v, | ||
600 | |||
601 | .bpop_translate = nilfs_bmap_translate_v, | ||
602 | }; | ||
603 | |||
604 | static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_vmdt = { | ||
605 | .bpop_prepare_alloc_ptr = nilfs_bmap_prepare_alloc_v, | ||
606 | .bpop_commit_alloc_ptr = nilfs_bmap_commit_alloc_v, | ||
607 | .bpop_abort_alloc_ptr = nilfs_bmap_abort_alloc_v, | ||
608 | .bpop_prepare_end_ptr = nilfs_bmap_prepare_end_v, | ||
609 | .bpop_commit_end_ptr = nilfs_bmap_commit_end_vmdt, | ||
610 | .bpop_abort_end_ptr = nilfs_bmap_abort_end_v, | ||
611 | |||
612 | .bpop_translate = nilfs_bmap_translate_v, | ||
613 | }; | ||
614 | |||
615 | static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_p = { | ||
616 | .bpop_prepare_alloc_ptr = nilfs_bmap_prepare_alloc_p, | ||
617 | .bpop_commit_alloc_ptr = nilfs_bmap_commit_alloc_p, | ||
618 | .bpop_abort_alloc_ptr = nilfs_bmap_abort_alloc_p, | ||
619 | .bpop_prepare_end_ptr = NULL, | ||
620 | .bpop_commit_end_ptr = NULL, | ||
621 | .bpop_abort_end_ptr = NULL, | ||
622 | |||
623 | .bpop_translate = NULL, | ||
624 | }; | ||
625 | |||
626 | static const struct nilfs_bmap_ptr_operations nilfs_bmap_ptr_ops_gc = { | ||
627 | .bpop_prepare_alloc_ptr = NULL, | ||
628 | .bpop_commit_alloc_ptr = NULL, | ||
629 | .bpop_abort_alloc_ptr = NULL, | ||
630 | .bpop_prepare_end_ptr = NULL, | ||
631 | .bpop_commit_end_ptr = NULL, | ||
632 | .bpop_abort_end_ptr = NULL, | ||
633 | |||
634 | .bpop_translate = NULL, | ||
635 | }; | ||
636 | |||
637 | static struct lock_class_key nilfs_bmap_dat_lock_key; | 560 | static struct lock_class_key nilfs_bmap_dat_lock_key; |
638 | 561 | ||
639 | /** | 562 | /** |
@@ -660,20 +583,20 @@ int nilfs_bmap_read(struct nilfs_bmap *bmap, struct nilfs_inode *raw_inode) | |||
660 | bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode; | 583 | bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode; |
661 | switch (bmap->b_inode->i_ino) { | 584 | switch (bmap->b_inode->i_ino) { |
662 | case NILFS_DAT_INO: | 585 | case NILFS_DAT_INO: |
663 | bmap->b_pops = &nilfs_bmap_ptr_ops_p; | 586 | bmap->b_ptr_type = NILFS_BMAP_PTR_P; |
664 | bmap->b_last_allocated_key = 0; /* XXX: use macro */ | 587 | bmap->b_last_allocated_key = 0; |
665 | bmap->b_last_allocated_ptr = NILFS_BMAP_NEW_PTR_INIT; | 588 | bmap->b_last_allocated_ptr = NILFS_BMAP_NEW_PTR_INIT; |
666 | lockdep_set_class(&bmap->b_sem, &nilfs_bmap_dat_lock_key); | 589 | lockdep_set_class(&bmap->b_sem, &nilfs_bmap_dat_lock_key); |
667 | break; | 590 | break; |
668 | case NILFS_CPFILE_INO: | 591 | case NILFS_CPFILE_INO: |
669 | case NILFS_SUFILE_INO: | 592 | case NILFS_SUFILE_INO: |
670 | bmap->b_pops = &nilfs_bmap_ptr_ops_vmdt; | 593 | bmap->b_ptr_type = NILFS_BMAP_PTR_VS; |
671 | bmap->b_last_allocated_key = 0; /* XXX: use macro */ | 594 | bmap->b_last_allocated_key = 0; |
672 | bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR; | 595 | bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR; |
673 | break; | 596 | break; |
674 | default: | 597 | default: |
675 | bmap->b_pops = &nilfs_bmap_ptr_ops_v; | 598 | bmap->b_ptr_type = NILFS_BMAP_PTR_VM; |
676 | bmap->b_last_allocated_key = 0; /* XXX: use macro */ | 599 | bmap->b_last_allocated_key = 0; |
677 | bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR; | 600 | bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR; |
678 | break; | 601 | break; |
679 | } | 602 | } |
@@ -705,7 +628,7 @@ void nilfs_bmap_init_gc(struct nilfs_bmap *bmap) | |||
705 | memset(&bmap->b_u, 0, NILFS_BMAP_SIZE); | 628 | memset(&bmap->b_u, 0, NILFS_BMAP_SIZE); |
706 | init_rwsem(&bmap->b_sem); | 629 | init_rwsem(&bmap->b_sem); |
707 | bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode; | 630 | bmap->b_inode = &NILFS_BMAP_I(bmap)->vfs_inode; |
708 | bmap->b_pops = &nilfs_bmap_ptr_ops_gc; | 631 | bmap->b_ptr_type = NILFS_BMAP_PTR_U; |
709 | bmap->b_last_allocated_key = 0; | 632 | bmap->b_last_allocated_key = 0; |
710 | bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR; | 633 | bmap->b_last_allocated_ptr = NILFS_BMAP_INVALID_PTR; |
711 | bmap->b_state = 0; | 634 | bmap->b_state = 0; |
diff --git a/fs/nilfs2/bmap.h b/fs/nilfs2/bmap.h index 28c77bb71bb7..47f5b74713c0 100644 --- a/fs/nilfs2/bmap.h +++ b/fs/nilfs2/bmap.h | |||
@@ -86,27 +86,6 @@ struct nilfs_bmap_operations { | |||
86 | }; | 86 | }; |
87 | 87 | ||
88 | 88 | ||
89 | /** | ||
90 | * struct nilfs_bmap_ptr_operations - bmap ptr operation table | ||
91 | */ | ||
92 | struct nilfs_bmap_ptr_operations { | ||
93 | int (*bpop_prepare_alloc_ptr)(struct nilfs_bmap *, | ||
94 | union nilfs_bmap_ptr_req *); | ||
95 | void (*bpop_commit_alloc_ptr)(struct nilfs_bmap *, | ||
96 | union nilfs_bmap_ptr_req *); | ||
97 | void (*bpop_abort_alloc_ptr)(struct nilfs_bmap *, | ||
98 | union nilfs_bmap_ptr_req *); | ||
99 | int (*bpop_prepare_end_ptr)(struct nilfs_bmap *, | ||
100 | union nilfs_bmap_ptr_req *); | ||
101 | void (*bpop_commit_end_ptr)(struct nilfs_bmap *, | ||
102 | union nilfs_bmap_ptr_req *); | ||
103 | void (*bpop_abort_end_ptr)(struct nilfs_bmap *, | ||
104 | union nilfs_bmap_ptr_req *); | ||
105 | |||
106 | int (*bpop_translate)(const struct nilfs_bmap *, __u64, __u64 *); | ||
107 | }; | ||
108 | |||
109 | |||
110 | #define NILFS_BMAP_SIZE (NILFS_INODE_BMAP_SIZE * sizeof(__le64)) | 89 | #define NILFS_BMAP_SIZE (NILFS_INODE_BMAP_SIZE * sizeof(__le64)) |
111 | #define NILFS_BMAP_KEY_BIT (sizeof(unsigned long) * 8 /* CHAR_BIT */) | 90 | #define NILFS_BMAP_KEY_BIT (sizeof(unsigned long) * 8 /* CHAR_BIT */) |
112 | #define NILFS_BMAP_NEW_PTR_INIT \ | 91 | #define NILFS_BMAP_NEW_PTR_INIT \ |
@@ -124,9 +103,9 @@ static inline int nilfs_bmap_is_new_ptr(unsigned long ptr) | |||
124 | * @b_sem: semaphore | 103 | * @b_sem: semaphore |
125 | * @b_inode: owner of bmap | 104 | * @b_inode: owner of bmap |
126 | * @b_ops: bmap operation table | 105 | * @b_ops: bmap operation table |
127 | * @b_pops: bmap ptr operation table | ||
128 | * @b_last_allocated_key: last allocated key for data block | 106 | * @b_last_allocated_key: last allocated key for data block |
129 | * @b_last_allocated_ptr: last allocated ptr for data block | 107 | * @b_last_allocated_ptr: last allocated ptr for data block |
108 | * @b_ptr_type: pointer type | ||
130 | * @b_state: state | 109 | * @b_state: state |
131 | */ | 110 | */ |
132 | struct nilfs_bmap { | 111 | struct nilfs_bmap { |
@@ -137,12 +116,22 @@ struct nilfs_bmap { | |||
137 | struct rw_semaphore b_sem; | 116 | struct rw_semaphore b_sem; |
138 | struct inode *b_inode; | 117 | struct inode *b_inode; |
139 | const struct nilfs_bmap_operations *b_ops; | 118 | const struct nilfs_bmap_operations *b_ops; |
140 | const struct nilfs_bmap_ptr_operations *b_pops; | ||
141 | __u64 b_last_allocated_key; | 119 | __u64 b_last_allocated_key; |
142 | __u64 b_last_allocated_ptr; | 120 | __u64 b_last_allocated_ptr; |
121 | int b_ptr_type; | ||
143 | int b_state; | 122 | int b_state; |
144 | }; | 123 | }; |
145 | 124 | ||
125 | /* pointer type */ | ||
126 | #define NILFS_BMAP_PTR_P 0 /* physical block number (i.e. LBN) */ | ||
127 | #define NILFS_BMAP_PTR_VS 1 /* virtual block number (single | ||
128 | version) */ | ||
129 | #define NILFS_BMAP_PTR_VM 2 /* virtual block number (has multiple | ||
130 | versions) */ | ||
131 | #define NILFS_BMAP_PTR_U (-1) /* never perform pointer operations */ | ||
132 | |||
133 | #define NILFS_BMAP_USE_VBN(bmap) ((bmap)->b_ptr_type > 0) | ||
134 | |||
146 | /* state */ | 135 | /* state */ |
147 | #define NILFS_BMAP_DIRTY 0x00000001 | 136 | #define NILFS_BMAP_DIRTY 0x00000001 |
148 | 137 | ||
@@ -171,6 +160,63 @@ void nilfs_bmap_commit_gcdat(struct nilfs_bmap *, struct nilfs_bmap *); | |||
171 | /* | 160 | /* |
172 | * Internal use only | 161 | * Internal use only |
173 | */ | 162 | */ |
163 | int nilfs_bmap_prepare_alloc_v(struct nilfs_bmap *, | ||
164 | union nilfs_bmap_ptr_req *); | ||
165 | void nilfs_bmap_commit_alloc_v(struct nilfs_bmap *, | ||
166 | union nilfs_bmap_ptr_req *); | ||
167 | void nilfs_bmap_abort_alloc_v(struct nilfs_bmap *, | ||
168 | union nilfs_bmap_ptr_req *); | ||
169 | |||
170 | static inline int nilfs_bmap_prepare_alloc_ptr(struct nilfs_bmap *bmap, | ||
171 | union nilfs_bmap_ptr_req *req) | ||
172 | { | ||
173 | if (NILFS_BMAP_USE_VBN(bmap)) | ||
174 | return nilfs_bmap_prepare_alloc_v(bmap, req); | ||
175 | /* ignore target ptr */ | ||
176 | req->bpr_ptr = bmap->b_last_allocated_ptr++; | ||
177 | return 0; | ||
178 | } | ||
179 | |||
180 | static inline void nilfs_bmap_commit_alloc_ptr(struct nilfs_bmap *bmap, | ||
181 | union nilfs_bmap_ptr_req *req) | ||
182 | { | ||
183 | if (NILFS_BMAP_USE_VBN(bmap)) | ||
184 | nilfs_bmap_commit_alloc_v(bmap, req); | ||
185 | } | ||
186 | |||
187 | static inline void nilfs_bmap_abort_alloc_ptr(struct nilfs_bmap *bmap, | ||
188 | union nilfs_bmap_ptr_req *req) | ||
189 | { | ||
190 | if (NILFS_BMAP_USE_VBN(bmap)) | ||
191 | nilfs_bmap_abort_alloc_v(bmap, req); | ||
192 | else | ||
193 | bmap->b_last_allocated_ptr--; | ||
194 | } | ||
195 | |||
196 | int nilfs_bmap_prepare_end_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *); | ||
197 | void nilfs_bmap_commit_end_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *); | ||
198 | void nilfs_bmap_abort_end_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *); | ||
199 | |||
200 | static inline int nilfs_bmap_prepare_end_ptr(struct nilfs_bmap *bmap, | ||
201 | union nilfs_bmap_ptr_req *req) | ||
202 | { | ||
203 | return NILFS_BMAP_USE_VBN(bmap) ? | ||
204 | nilfs_bmap_prepare_end_v(bmap, req) : 0; | ||
205 | } | ||
206 | |||
207 | static inline void nilfs_bmap_commit_end_ptr(struct nilfs_bmap *bmap, | ||
208 | union nilfs_bmap_ptr_req *req) | ||
209 | { | ||
210 | if (NILFS_BMAP_USE_VBN(bmap)) | ||
211 | nilfs_bmap_commit_end_v(bmap, req); | ||
212 | } | ||
213 | |||
214 | static inline void nilfs_bmap_abort_end_ptr(struct nilfs_bmap *bmap, | ||
215 | union nilfs_bmap_ptr_req *req) | ||
216 | { | ||
217 | if (NILFS_BMAP_USE_VBN(bmap)) | ||
218 | nilfs_bmap_abort_end_v(bmap, req); | ||
219 | } | ||
174 | 220 | ||
175 | int nilfs_bmap_start_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *, | 221 | int nilfs_bmap_start_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *, |
176 | sector_t); | 222 | sector_t); |
@@ -184,15 +230,15 @@ __u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *, | |||
184 | __u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *, __u64); | 230 | __u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *, __u64); |
185 | __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *); | 231 | __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *); |
186 | 232 | ||
187 | int nilfs_bmap_prepare_update(struct nilfs_bmap *, | 233 | int nilfs_bmap_prepare_update_v(struct nilfs_bmap *, |
188 | union nilfs_bmap_ptr_req *, | 234 | union nilfs_bmap_ptr_req *, |
189 | union nilfs_bmap_ptr_req *); | 235 | union nilfs_bmap_ptr_req *); |
190 | void nilfs_bmap_commit_update(struct nilfs_bmap *, | 236 | void nilfs_bmap_commit_update_v(struct nilfs_bmap *, |
191 | union nilfs_bmap_ptr_req *, | 237 | union nilfs_bmap_ptr_req *, |
192 | union nilfs_bmap_ptr_req *); | 238 | union nilfs_bmap_ptr_req *); |
193 | void nilfs_bmap_abort_update(struct nilfs_bmap *, | 239 | void nilfs_bmap_abort_update_v(struct nilfs_bmap *, |
194 | union nilfs_bmap_ptr_req *, | 240 | union nilfs_bmap_ptr_req *, |
195 | union nilfs_bmap_ptr_req *); | 241 | union nilfs_bmap_ptr_req *); |
196 | 242 | ||
197 | void nilfs_bmap_add_blocks(const struct nilfs_bmap *, int); | 243 | void nilfs_bmap_add_blocks(const struct nilfs_bmap *, int); |
198 | void nilfs_bmap_sub_blocks(const struct nilfs_bmap *, int); | 244 | void nilfs_bmap_sub_blocks(const struct nilfs_bmap *, int); |
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index f5a0ec64e1aa..20e3fd0f4d4f 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c | |||
@@ -917,8 +917,8 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
917 | path[level].bp_newreq.bpr_ptr = | 917 | path[level].bp_newreq.bpr_ptr = |
918 | btree->bt_ops->btop_find_target(btree, path, key); | 918 | btree->bt_ops->btop_find_target(btree, path, key); |
919 | 919 | ||
920 | ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr( | 920 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, |
921 | &btree->bt_bmap, &path[level].bp_newreq); | 921 | &path[level].bp_newreq); |
922 | if (ret < 0) | 922 | if (ret < 0) |
923 | goto err_out_data; | 923 | goto err_out_data; |
924 | 924 | ||
@@ -976,8 +976,8 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
976 | /* split */ | 976 | /* split */ |
977 | path[level].bp_newreq.bpr_ptr = | 977 | path[level].bp_newreq.bpr_ptr = |
978 | path[level - 1].bp_newreq.bpr_ptr + 1; | 978 | path[level - 1].bp_newreq.bpr_ptr + 1; |
979 | ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr( | 979 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, |
980 | &btree->bt_bmap, &path[level].bp_newreq); | 980 | &path[level].bp_newreq); |
981 | if (ret < 0) | 981 | if (ret < 0) |
982 | goto err_out_child_node; | 982 | goto err_out_child_node; |
983 | ret = nilfs_btree_get_new_block(btree, | 983 | ret = nilfs_btree_get_new_block(btree, |
@@ -1008,8 +1008,8 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1008 | 1008 | ||
1009 | /* grow */ | 1009 | /* grow */ |
1010 | path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1; | 1010 | path[level].bp_newreq.bpr_ptr = path[level - 1].bp_newreq.bpr_ptr + 1; |
1011 | ret = btree->bt_bmap.b_pops->bpop_prepare_alloc_ptr( | 1011 | ret = nilfs_bmap_prepare_alloc_ptr(&btree->bt_bmap, |
1012 | &btree->bt_bmap, &path[level].bp_newreq); | 1012 | &path[level].bp_newreq); |
1013 | if (ret < 0) | 1013 | if (ret < 0) |
1014 | goto err_out_child_node; | 1014 | goto err_out_child_node; |
1015 | ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr, | 1015 | ret = nilfs_btree_get_new_block(btree, path[level].bp_newreq.bpr_ptr, |
@@ -1037,18 +1037,16 @@ static int nilfs_btree_prepare_insert(struct nilfs_btree *btree, | |||
1037 | 1037 | ||
1038 | /* error */ | 1038 | /* error */ |
1039 | err_out_curr_node: | 1039 | err_out_curr_node: |
1040 | btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(&btree->bt_bmap, | 1040 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq); |
1041 | &path[level].bp_newreq); | ||
1042 | err_out_child_node: | 1041 | err_out_child_node: |
1043 | for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) { | 1042 | for (level--; level > NILFS_BTREE_LEVEL_DATA; level--) { |
1044 | nilfs_btnode_delete(path[level].bp_sib_bh); | 1043 | nilfs_btnode_delete(path[level].bp_sib_bh); |
1045 | btree->bt_bmap.b_pops->bpop_abort_alloc_ptr( | 1044 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, |
1046 | &btree->bt_bmap, &path[level].bp_newreq); | 1045 | &path[level].bp_newreq); |
1047 | 1046 | ||
1048 | } | 1047 | } |
1049 | 1048 | ||
1050 | btree->bt_bmap.b_pops->bpop_abort_alloc_ptr(&btree->bt_bmap, | 1049 | nilfs_bmap_abort_alloc_ptr(&btree->bt_bmap, &path[level].bp_newreq); |
1051 | &path[level].bp_newreq); | ||
1052 | err_out_data: | 1050 | err_out_data: |
1053 | *levelp = level; | 1051 | *levelp = level; |
1054 | stats->bs_nblocks = 0; | 1052 | stats->bs_nblocks = 0; |
@@ -1067,8 +1065,8 @@ static void nilfs_btree_commit_insert(struct nilfs_btree *btree, | |||
1067 | btree->bt_ops->btop_set_target(btree, key, ptr); | 1065 | btree->bt_ops->btop_set_target(btree, key, ptr); |
1068 | 1066 | ||
1069 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { | 1067 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { |
1070 | btree->bt_bmap.b_pops->bpop_commit_alloc_ptr( | 1068 | nilfs_bmap_commit_alloc_ptr(&btree->bt_bmap, |
1071 | &btree->bt_bmap, &path[level - 1].bp_newreq); | 1069 | &path[level - 1].bp_newreq); |
1072 | path[level].bp_op(btree, path, level, &key, &ptr); | 1070 | path[level].bp_op(btree, path, level, &key, &ptr); |
1073 | } | 1071 | } |
1074 | 1072 | ||
@@ -1312,12 +1310,10 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1312 | path[level].bp_oldreq.bpr_ptr = | 1310 | path[level].bp_oldreq.bpr_ptr = |
1313 | nilfs_btree_node_get_ptr(btree, node, | 1311 | nilfs_btree_node_get_ptr(btree, node, |
1314 | path[level].bp_index); | 1312 | path[level].bp_index); |
1315 | if (btree->bt_bmap.b_pops->bpop_prepare_end_ptr != NULL) { | 1313 | ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap, |
1316 | ret = btree->bt_bmap.b_pops->bpop_prepare_end_ptr( | 1314 | &path[level].bp_oldreq); |
1317 | &btree->bt_bmap, &path[level].bp_oldreq); | 1315 | if (ret < 0) |
1318 | if (ret < 0) | 1316 | goto err_out_child_node; |
1319 | goto err_out_child_node; | ||
1320 | } | ||
1321 | 1317 | ||
1322 | if (nilfs_btree_node_get_nchildren(btree, node) > | 1318 | if (nilfs_btree_node_get_nchildren(btree, node) > |
1323 | nilfs_btree_node_nchildren_min(btree, node)) { | 1319 | nilfs_btree_node_nchildren_min(btree, node)) { |
@@ -1391,12 +1387,12 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1391 | node = nilfs_btree_get_root(btree); | 1387 | node = nilfs_btree_get_root(btree); |
1392 | path[level].bp_oldreq.bpr_ptr = | 1388 | path[level].bp_oldreq.bpr_ptr = |
1393 | nilfs_btree_node_get_ptr(btree, node, path[level].bp_index); | 1389 | nilfs_btree_node_get_ptr(btree, node, path[level].bp_index); |
1394 | if (btree->bt_bmap.b_pops->bpop_prepare_end_ptr != NULL) { | 1390 | |
1395 | ret = btree->bt_bmap.b_pops->bpop_prepare_end_ptr( | 1391 | ret = nilfs_bmap_prepare_end_ptr(&btree->bt_bmap, |
1396 | &btree->bt_bmap, &path[level].bp_oldreq); | 1392 | &path[level].bp_oldreq); |
1397 | if (ret < 0) | 1393 | if (ret < 0) |
1398 | goto err_out_child_node; | 1394 | goto err_out_child_node; |
1399 | } | 1395 | |
1400 | /* child of the root node is deleted */ | 1396 | /* child of the root node is deleted */ |
1401 | path[level].bp_op = nilfs_btree_do_delete; | 1397 | path[level].bp_op = nilfs_btree_do_delete; |
1402 | stats->bs_nblocks++; | 1398 | stats->bs_nblocks++; |
@@ -1408,15 +1404,12 @@ static int nilfs_btree_prepare_delete(struct nilfs_btree *btree, | |||
1408 | 1404 | ||
1409 | /* error */ | 1405 | /* error */ |
1410 | err_out_curr_node: | 1406 | err_out_curr_node: |
1411 | if (btree->bt_bmap.b_pops->bpop_abort_end_ptr != NULL) | 1407 | nilfs_bmap_abort_end_ptr(&btree->bt_bmap, &path[level].bp_oldreq); |
1412 | btree->bt_bmap.b_pops->bpop_abort_end_ptr( | ||
1413 | &btree->bt_bmap, &path[level].bp_oldreq); | ||
1414 | err_out_child_node: | 1408 | err_out_child_node: |
1415 | for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) { | 1409 | for (level--; level >= NILFS_BTREE_LEVEL_NODE_MIN; level--) { |
1416 | brelse(path[level].bp_sib_bh); | 1410 | brelse(path[level].bp_sib_bh); |
1417 | if (btree->bt_bmap.b_pops->bpop_abort_end_ptr != NULL) | 1411 | nilfs_bmap_abort_end_ptr(&btree->bt_bmap, |
1418 | btree->bt_bmap.b_pops->bpop_abort_end_ptr( | 1412 | &path[level].bp_oldreq); |
1419 | &btree->bt_bmap, &path[level].bp_oldreq); | ||
1420 | } | 1413 | } |
1421 | *levelp = level; | 1414 | *levelp = level; |
1422 | stats->bs_nblocks = 0; | 1415 | stats->bs_nblocks = 0; |
@@ -1430,9 +1423,8 @@ static void nilfs_btree_commit_delete(struct nilfs_btree *btree, | |||
1430 | int level; | 1423 | int level; |
1431 | 1424 | ||
1432 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { | 1425 | for (level = NILFS_BTREE_LEVEL_NODE_MIN; level <= maxlevel; level++) { |
1433 | if (btree->bt_bmap.b_pops->bpop_commit_end_ptr != NULL) | 1426 | nilfs_bmap_commit_end_ptr(&btree->bt_bmap, |
1434 | btree->bt_bmap.b_pops->bpop_commit_end_ptr( | 1427 | &path[level].bp_oldreq); |
1435 | &btree->bt_bmap, &path[level].bp_oldreq); | ||
1436 | path[level].bp_op(btree, path, level, NULL, NULL); | 1428 | path[level].bp_op(btree, path, level, NULL, NULL); |
1437 | } | 1429 | } |
1438 | 1430 | ||
@@ -1597,7 +1589,7 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key, | |||
1597 | if (btree->bt_ops->btop_find_target != NULL) | 1589 | if (btree->bt_ops->btop_find_target != NULL) |
1598 | dreq->bpr_ptr | 1590 | dreq->bpr_ptr |
1599 | = btree->bt_ops->btop_find_target(btree, NULL, key); | 1591 | = btree->bt_ops->btop_find_target(btree, NULL, key); |
1600 | ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, dreq); | 1592 | ret = nilfs_bmap_prepare_alloc_ptr(bmap, dreq); |
1601 | if (ret < 0) | 1593 | if (ret < 0) |
1602 | return ret; | 1594 | return ret; |
1603 | 1595 | ||
@@ -1605,7 +1597,7 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key, | |||
1605 | stats->bs_nblocks++; | 1597 | stats->bs_nblocks++; |
1606 | if (nreq != NULL) { | 1598 | if (nreq != NULL) { |
1607 | nreq->bpr_ptr = dreq->bpr_ptr + 1; | 1599 | nreq->bpr_ptr = dreq->bpr_ptr + 1; |
1608 | ret = bmap->b_pops->bpop_prepare_alloc_ptr(bmap, nreq); | 1600 | ret = nilfs_bmap_prepare_alloc_ptr(bmap, nreq); |
1609 | if (ret < 0) | 1601 | if (ret < 0) |
1610 | goto err_out_dreq; | 1602 | goto err_out_dreq; |
1611 | 1603 | ||
@@ -1622,9 +1614,9 @@ nilfs_btree_prepare_convert_and_insert(struct nilfs_bmap *bmap, __u64 key, | |||
1622 | 1614 | ||
1623 | /* error */ | 1615 | /* error */ |
1624 | err_out_nreq: | 1616 | err_out_nreq: |
1625 | bmap->b_pops->bpop_abort_alloc_ptr(bmap, nreq); | 1617 | nilfs_bmap_abort_alloc_ptr(bmap, nreq); |
1626 | err_out_dreq: | 1618 | err_out_dreq: |
1627 | bmap->b_pops->bpop_abort_alloc_ptr(bmap, dreq); | 1619 | nilfs_bmap_abort_alloc_ptr(bmap, dreq); |
1628 | stats->bs_nblocks = 0; | 1620 | stats->bs_nblocks = 0; |
1629 | return ret; | 1621 | return ret; |
1630 | 1622 | ||
@@ -1654,8 +1646,8 @@ nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap, | |||
1654 | btree = (struct nilfs_btree *)bmap; | 1646 | btree = (struct nilfs_btree *)bmap; |
1655 | nilfs_btree_init(bmap); | 1647 | nilfs_btree_init(bmap); |
1656 | if (nreq != NULL) { | 1648 | if (nreq != NULL) { |
1657 | bmap->b_pops->bpop_commit_alloc_ptr(bmap, dreq); | 1649 | nilfs_bmap_commit_alloc_ptr(bmap, dreq); |
1658 | bmap->b_pops->bpop_commit_alloc_ptr(bmap, nreq); | 1650 | nilfs_bmap_commit_alloc_ptr(bmap, nreq); |
1659 | 1651 | ||
1660 | /* create child node at level 1 */ | 1652 | /* create child node at level 1 */ |
1661 | lock_buffer(bh); | 1653 | lock_buffer(bh); |
@@ -1677,7 +1669,7 @@ nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *bmap, | |||
1677 | nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT, | 1669 | nilfs_btree_node_init(btree, node, NILFS_BTREE_NODE_ROOT, |
1678 | 2, 1, &keys[0], &tmpptr); | 1670 | 2, 1, &keys[0], &tmpptr); |
1679 | } else { | 1671 | } else { |
1680 | bmap->b_pops->bpop_commit_alloc_ptr(bmap, dreq); | 1672 | nilfs_bmap_commit_alloc_ptr(bmap, dreq); |
1681 | 1673 | ||
1682 | /* create root node at level 1 */ | 1674 | /* create root node at level 1 */ |
1683 | node = nilfs_btree_get_root(btree); | 1675 | node = nilfs_btree_get_root(btree); |
@@ -1758,9 +1750,9 @@ static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree, | |||
1758 | nilfs_btree_node_get_ptr(btree, parent, | 1750 | nilfs_btree_node_get_ptr(btree, parent, |
1759 | path[level + 1].bp_index); | 1751 | path[level + 1].bp_index); |
1760 | path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1; | 1752 | path[level].bp_newreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr + 1; |
1761 | ret = nilfs_bmap_prepare_update(&btree->bt_bmap, | 1753 | ret = nilfs_bmap_prepare_update_v(&btree->bt_bmap, |
1762 | &path[level].bp_oldreq, | 1754 | &path[level].bp_oldreq, |
1763 | &path[level].bp_newreq); | 1755 | &path[level].bp_newreq); |
1764 | if (ret < 0) | 1756 | if (ret < 0) |
1765 | return ret; | 1757 | return ret; |
1766 | 1758 | ||
@@ -1772,9 +1764,9 @@ static int nilfs_btree_prepare_update_v(struct nilfs_btree *btree, | |||
1772 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, | 1764 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, |
1773 | &path[level].bp_ctxt); | 1765 | &path[level].bp_ctxt); |
1774 | if (ret < 0) { | 1766 | if (ret < 0) { |
1775 | nilfs_bmap_abort_update(&btree->bt_bmap, | 1767 | nilfs_bmap_abort_update_v(&btree->bt_bmap, |
1776 | &path[level].bp_oldreq, | 1768 | &path[level].bp_oldreq, |
1777 | &path[level].bp_newreq); | 1769 | &path[level].bp_newreq); |
1778 | return ret; | 1770 | return ret; |
1779 | } | 1771 | } |
1780 | } | 1772 | } |
@@ -1788,9 +1780,9 @@ static void nilfs_btree_commit_update_v(struct nilfs_btree *btree, | |||
1788 | { | 1780 | { |
1789 | struct nilfs_btree_node *parent; | 1781 | struct nilfs_btree_node *parent; |
1790 | 1782 | ||
1791 | nilfs_bmap_commit_update(&btree->bt_bmap, | 1783 | nilfs_bmap_commit_update_v(&btree->bt_bmap, |
1792 | &path[level].bp_oldreq, | 1784 | &path[level].bp_oldreq, |
1793 | &path[level].bp_newreq); | 1785 | &path[level].bp_newreq); |
1794 | 1786 | ||
1795 | if (buffer_nilfs_node(path[level].bp_bh)) { | 1787 | if (buffer_nilfs_node(path[level].bp_bh)) { |
1796 | nilfs_btnode_commit_change_key( | 1788 | nilfs_btnode_commit_change_key( |
@@ -1809,9 +1801,9 @@ static void nilfs_btree_abort_update_v(struct nilfs_btree *btree, | |||
1809 | struct nilfs_btree_path *path, | 1801 | struct nilfs_btree_path *path, |
1810 | int level) | 1802 | int level) |
1811 | { | 1803 | { |
1812 | nilfs_bmap_abort_update(&btree->bt_bmap, | 1804 | nilfs_bmap_abort_update_v(&btree->bt_bmap, |
1813 | &path[level].bp_oldreq, | 1805 | &path[level].bp_oldreq, |
1814 | &path[level].bp_newreq); | 1806 | &path[level].bp_newreq); |
1815 | if (buffer_nilfs_node(path[level].bp_bh)) | 1807 | if (buffer_nilfs_node(path[level].bp_bh)) |
1816 | nilfs_btnode_abort_change_key( | 1808 | nilfs_btnode_abort_change_key( |
1817 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, | 1809 | &NILFS_BMAP_I(&btree->bt_bmap)->i_btnode_cache, |
diff --git a/fs/nilfs2/direct.c b/fs/nilfs2/direct.c index 8e8095c2e1bb..2a546c8f784e 100644 --- a/fs/nilfs2/direct.c +++ b/fs/nilfs2/direct.c | |||
@@ -92,8 +92,7 @@ static int nilfs_direct_prepare_insert(struct nilfs_direct *direct, | |||
92 | 92 | ||
93 | if (direct->d_ops->dop_find_target != NULL) | 93 | if (direct->d_ops->dop_find_target != NULL) |
94 | req->bpr_ptr = direct->d_ops->dop_find_target(direct, key); | 94 | req->bpr_ptr = direct->d_ops->dop_find_target(direct, key); |
95 | ret = direct->d_bmap.b_pops->bpop_prepare_alloc_ptr(&direct->d_bmap, | 95 | ret = nilfs_bmap_prepare_alloc_ptr(&direct->d_bmap, req); |
96 | req); | ||
97 | if (ret < 0) | 96 | if (ret < 0) |
98 | return ret; | 97 | return ret; |
99 | 98 | ||
@@ -111,7 +110,7 @@ static void nilfs_direct_commit_insert(struct nilfs_direct *direct, | |||
111 | bh = (struct buffer_head *)((unsigned long)ptr); | 110 | bh = (struct buffer_head *)((unsigned long)ptr); |
112 | set_buffer_nilfs_volatile(bh); | 111 | set_buffer_nilfs_volatile(bh); |
113 | 112 | ||
114 | direct->d_bmap.b_pops->bpop_commit_alloc_ptr(&direct->d_bmap, req); | 113 | nilfs_bmap_commit_alloc_ptr(&direct->d_bmap, req); |
115 | nilfs_direct_set_ptr(direct, key, req->bpr_ptr); | 114 | nilfs_direct_set_ptr(direct, key, req->bpr_ptr); |
116 | 115 | ||
117 | if (!nilfs_bmap_dirty(&direct->d_bmap)) | 116 | if (!nilfs_bmap_dirty(&direct->d_bmap)) |
@@ -150,25 +149,18 @@ static int nilfs_direct_prepare_delete(struct nilfs_direct *direct, | |||
150 | { | 149 | { |
151 | int ret; | 150 | int ret; |
152 | 151 | ||
153 | if (direct->d_bmap.b_pops->bpop_prepare_end_ptr != NULL) { | 152 | req->bpr_ptr = nilfs_direct_get_ptr(direct, key); |
154 | req->bpr_ptr = nilfs_direct_get_ptr(direct, key); | 153 | ret = nilfs_bmap_prepare_end_ptr(&direct->d_bmap, req); |
155 | ret = direct->d_bmap.b_pops->bpop_prepare_end_ptr( | 154 | if (!ret) |
156 | &direct->d_bmap, req); | 155 | stats->bs_nblocks = 1; |
157 | if (ret < 0) | 156 | return ret; |
158 | return ret; | ||
159 | } | ||
160 | |||
161 | stats->bs_nblocks = 1; | ||
162 | return 0; | ||
163 | } | 157 | } |
164 | 158 | ||
165 | static void nilfs_direct_commit_delete(struct nilfs_direct *direct, | 159 | static void nilfs_direct_commit_delete(struct nilfs_direct *direct, |
166 | union nilfs_bmap_ptr_req *req, | 160 | union nilfs_bmap_ptr_req *req, |
167 | __u64 key) | 161 | __u64 key) |
168 | { | 162 | { |
169 | if (direct->d_bmap.b_pops->bpop_commit_end_ptr != NULL) | 163 | nilfs_bmap_commit_end_ptr(&direct->d_bmap, req); |
170 | direct->d_bmap.b_pops->bpop_commit_end_ptr( | ||
171 | &direct->d_bmap, req); | ||
172 | nilfs_direct_set_ptr(direct, key, NILFS_BMAP_INVALID_PTR); | 164 | nilfs_direct_set_ptr(direct, key, NILFS_BMAP_INVALID_PTR); |
173 | } | 165 | } |
174 | 166 | ||
@@ -289,11 +281,11 @@ static int nilfs_direct_propagate_v(struct nilfs_direct *direct, | |||
289 | if (!buffer_nilfs_volatile(bh)) { | 281 | if (!buffer_nilfs_volatile(bh)) { |
290 | oldreq.bpr_ptr = ptr; | 282 | oldreq.bpr_ptr = ptr; |
291 | newreq.bpr_ptr = ptr; | 283 | newreq.bpr_ptr = ptr; |
292 | ret = nilfs_bmap_prepare_update(&direct->d_bmap, &oldreq, | 284 | ret = nilfs_bmap_prepare_update_v(&direct->d_bmap, &oldreq, |
293 | &newreq); | 285 | &newreq); |
294 | if (ret < 0) | 286 | if (ret < 0) |
295 | return ret; | 287 | return ret; |
296 | nilfs_bmap_commit_update(&direct->d_bmap, &oldreq, &newreq); | 288 | nilfs_bmap_commit_update_v(&direct->d_bmap, &oldreq, &newreq); |
297 | set_buffer_nilfs_volatile(bh); | 289 | set_buffer_nilfs_volatile(bh); |
298 | nilfs_direct_set_ptr(direct, key, newreq.bpr_ptr); | 290 | nilfs_direct_set_ptr(direct, key, newreq.bpr_ptr); |
299 | } else | 291 | } else |