1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/sched.h>
20#include <linux/slab.h>
21#include "ctree.h"
22#include "transaction.h"
23#include "disk-io.h"
24#include "locking.h"
25#include "print-tree.h"
26#include "compat.h"
27#include "tree-log.h"
28
29
30
31
32
33
34
35#define LOG_INODE_ALL 0
36#define LOG_INODE_EXISTS 1
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90#define LOG_WALK_PIN_ONLY 0
91#define LOG_WALK_REPLAY_INODES 1
92#define LOG_WALK_REPLAY_ALL 2
93
94static int btrfs_log_inode(struct btrfs_trans_handle *trans,
95 struct btrfs_root *root, struct inode *inode,
96 int inode_only);
97static int link_to_fixup_dir(struct btrfs_trans_handle *trans,
98 struct btrfs_root *root,
99 struct btrfs_path *path, u64 objectid);
100static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
101 struct btrfs_root *root,
102 struct btrfs_root *log,
103 struct btrfs_path *path,
104 u64 dirid, int del_all);
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134static int start_log_trans(struct btrfs_trans_handle *trans,
135 struct btrfs_root *root)
136{
137 int ret;
138 int err = 0;
139
140 mutex_lock(&root->log_mutex);
141 if (root->log_root) {
142 if (!root->log_start_pid) {
143 root->log_start_pid = current->pid;
144 root->log_multiple_pids = false;
145 } else if (root->log_start_pid != current->pid) {
146 root->log_multiple_pids = true;
147 }
148
149 root->log_batch++;
150 atomic_inc(&root->log_writers);
151 mutex_unlock(&root->log_mutex);
152 return 0;
153 }
154 root->log_multiple_pids = false;
155 root->log_start_pid = current->pid;
156 mutex_lock(&root->fs_info->tree_log_mutex);
157 if (!root->fs_info->log_root_tree) {
158 ret = btrfs_init_log_root_tree(trans, root->fs_info);
159 if (ret)
160 err = ret;
161 }
162 if (err == 0 && !root->log_root) {
163 ret = btrfs_add_log_tree(trans, root);
164 if (ret)
165 err = ret;
166 }
167 mutex_unlock(&root->fs_info->tree_log_mutex);
168 root->log_batch++;
169 atomic_inc(&root->log_writers);
170 mutex_unlock(&root->log_mutex);
171 return err;
172}
173
174
175
176
177
178
179static int join_running_log_trans(struct btrfs_root *root)
180{
181 int ret = -ENOENT;
182
183 smp_mb();
184 if (!root->log_root)
185 return -ENOENT;
186
187 mutex_lock(&root->log_mutex);
188 if (root->log_root) {
189 ret = 0;
190 atomic_inc(&root->log_writers);
191 }
192 mutex_unlock(&root->log_mutex);
193 return ret;
194}
195
196
197
198
199
200
201int btrfs_pin_log_trans(struct btrfs_root *root)
202{
203 int ret = -ENOENT;
204
205 mutex_lock(&root->log_mutex);
206 atomic_inc(&root->log_writers);
207 mutex_unlock(&root->log_mutex);
208 return ret;
209}
210
211
212
213
214
215void btrfs_end_log_trans(struct btrfs_root *root)
216{
217 if (atomic_dec_and_test(&root->log_writers)) {
218 smp_mb();
219 if (waitqueue_active(&root->log_writer_wait))
220 wake_up(&root->log_writer_wait);
221 }
222}
223
224
225
226
227
228
229
230
231struct walk_control {
232
233
234
235 int free;
236
237
238
239
240 int write;
241
242
243
244
245 int wait;
246
247
248
249
250 int pin;
251
252
253 int stage;
254
255
256 struct btrfs_root *replay_dest;
257
258
259 struct btrfs_trans_handle *trans;
260
261
262
263
264
265
266 int (*process_func)(struct btrfs_root *log, struct extent_buffer *eb,
267 struct walk_control *wc, u64 gen);
268};
269
270
271
272
273static int process_one_buffer(struct btrfs_root *log,
274 struct extent_buffer *eb,
275 struct walk_control *wc, u64 gen)
276{
277 if (wc->pin)
278 btrfs_pin_extent_for_log_replay(wc->trans,
279 log->fs_info->extent_root,
280 eb->start, eb->len);
281
282 if (btrfs_buffer_uptodate(eb, gen, 0)) {
283 if (wc->write)
284 btrfs_write_tree_block(eb);
285 if (wc->wait)
286 btrfs_wait_tree_block_writeback(eb);
287 }
288 return 0;
289}
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305static noinline int overwrite_item(struct btrfs_trans_handle *trans,
306 struct btrfs_root *root,
307 struct btrfs_path *path,
308 struct extent_buffer *eb, int slot,
309 struct btrfs_key *key)
310{
311 int ret;
312 u32 item_size;
313 u64 saved_i_size = 0;
314 int save_old_i_size = 0;
315 unsigned long src_ptr;
316 unsigned long dst_ptr;
317 int overwrite_root = 0;
318
319 if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID)
320 overwrite_root = 1;
321
322 item_size = btrfs_item_size_nr(eb, slot);
323 src_ptr = btrfs_item_ptr_offset(eb, slot);
324
325
326 ret = btrfs_search_slot(NULL, root, key, path, 0, 0);
327 if (ret == 0) {
328 char *src_copy;
329 char *dst_copy;
330 u32 dst_size = btrfs_item_size_nr(path->nodes[0],
331 path->slots[0]);
332 if (dst_size != item_size)
333 goto insert;
334
335 if (item_size == 0) {
336 btrfs_release_path(path);
337 return 0;
338 }
339 dst_copy = kmalloc(item_size, GFP_NOFS);
340 src_copy = kmalloc(item_size, GFP_NOFS);
341 if (!dst_copy || !src_copy) {
342 btrfs_release_path(path);
343 kfree(dst_copy);
344 kfree(src_copy);
345 return -ENOMEM;
346 }
347
348 read_extent_buffer(eb, src_copy, src_ptr, item_size);
349
350 dst_ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
351 read_extent_buffer(path->nodes[0], dst_copy, dst_ptr,
352 item_size);
353 ret = memcmp(dst_copy, src_copy, item_size);
354
355 kfree(dst_copy);
356 kfree(src_copy);
357
358
359
360
361
362
363 if (ret == 0) {
364 btrfs_release_path(path);
365 return 0;
366 }
367
368 }
369insert:
370 btrfs_release_path(path);
371
372 ret = btrfs_insert_empty_item(trans, root, path,
373 key, item_size);
374
375
376 if (ret == -EEXIST) {
377 u32 found_size;
378 found_size = btrfs_item_size_nr(path->nodes[0],
379 path->slots[0]);
380 if (found_size > item_size)
381 btrfs_truncate_item(trans, root, path, item_size, 1);
382 else if (found_size < item_size)
383 btrfs_extend_item(trans, root, path,
384 item_size - found_size);
385 } else if (ret) {
386 return ret;
387 }
388 dst_ptr = btrfs_item_ptr_offset(path->nodes[0],
389 path->slots[0]);
390
391
392
393
394
395
396
397
398
399
400 if (key->type == BTRFS_INODE_ITEM_KEY && ret == -EEXIST) {
401 struct btrfs_inode_item *src_item;
402 struct btrfs_inode_item *dst_item;
403
404 src_item = (struct btrfs_inode_item *)src_ptr;
405 dst_item = (struct btrfs_inode_item *)dst_ptr;
406
407 if (btrfs_inode_generation(eb, src_item) == 0)
408 goto no_copy;
409
410 if (overwrite_root &&
411 S_ISDIR(btrfs_inode_mode(eb, src_item)) &&
412 S_ISDIR(btrfs_inode_mode(path->nodes[0], dst_item))) {
413 save_old_i_size = 1;
414 saved_i_size = btrfs_inode_size(path->nodes[0],
415 dst_item);
416 }
417 }
418
419 copy_extent_buffer(path->nodes[0], eb, dst_ptr,
420 src_ptr, item_size);
421
422 if (save_old_i_size) {
423 struct btrfs_inode_item *dst_item;
424 dst_item = (struct btrfs_inode_item *)dst_ptr;
425 btrfs_set_inode_size(path->nodes[0], dst_item, saved_i_size);
426 }
427
428
429 if (key->type == BTRFS_INODE_ITEM_KEY) {
430 struct btrfs_inode_item *dst_item;
431 dst_item = (struct btrfs_inode_item *)dst_ptr;
432 if (btrfs_inode_generation(path->nodes[0], dst_item) == 0) {
433 btrfs_set_inode_generation(path->nodes[0], dst_item,
434 trans->transid);
435 }
436 }
437no_copy:
438 btrfs_mark_buffer_dirty(path->nodes[0]);
439 btrfs_release_path(path);
440 return 0;
441}
442
443
444
445
446
447static noinline struct inode *read_one_inode(struct btrfs_root *root,
448 u64 objectid)
449{
450 struct btrfs_key key;
451 struct inode *inode;
452
453 key.objectid = objectid;
454 key.type = BTRFS_INODE_ITEM_KEY;
455 key.offset = 0;
456 inode = btrfs_iget(root->fs_info->sb, &key, root, NULL);
457 if (IS_ERR(inode)) {
458 inode = NULL;
459 } else if (is_bad_inode(inode)) {
460 iput(inode);
461 inode = NULL;
462 }
463 return inode;
464}
465
466
467
468
469
470
471
472
473
474
475
476
477
478static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
479 struct btrfs_root *root,
480 struct btrfs_path *path,
481 struct extent_buffer *eb, int slot,
482 struct btrfs_key *key)
483{
484 int found_type;
485 u64 mask = root->sectorsize - 1;
486 u64 extent_end;
487 u64 alloc_hint;
488 u64 start = key->offset;
489 u64 saved_nbytes;
490 struct btrfs_file_extent_item *item;
491 struct inode *inode = NULL;
492 unsigned long size;
493 int ret = 0;
494
495 item = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
496 found_type = btrfs_file_extent_type(eb, item);
497
498 if (found_type == BTRFS_FILE_EXTENT_REG ||
499 found_type == BTRFS_FILE_EXTENT_PREALLOC)
500 extent_end = start + btrfs_file_extent_num_bytes(eb, item);
501 else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
502 size = btrfs_file_extent_inline_len(eb, item);
503 extent_end = (start + size + mask) & ~mask;
504 } else {
505 ret = 0;
506 goto out;
507 }
508
509 inode = read_one_inode(root, key->objectid);
510 if (!inode) {
511 ret = -EIO;
512 goto out;
513 }
514
515
516
517
518
519
520 ret = btrfs_lookup_file_extent(trans, root, path, btrfs_ino(inode),
521 start, 0);
522
523 if (ret == 0 &&
524 (found_type == BTRFS_FILE_EXTENT_REG ||
525 found_type == BTRFS_FILE_EXTENT_PREALLOC)) {
526 struct btrfs_file_extent_item cmp1;
527 struct btrfs_file_extent_item cmp2;
528 struct btrfs_file_extent_item *existing;
529 struct extent_buffer *leaf;
530
531 leaf = path->nodes[0];
532 existing = btrfs_item_ptr(leaf, path->slots[0],
533 struct btrfs_file_extent_item);
534
535 read_extent_buffer(eb, &cmp1, (unsigned long)item,
536 sizeof(cmp1));
537 read_extent_buffer(leaf, &cmp2, (unsigned long)existing,
538 sizeof(cmp2));
539
540
541
542
543
544 if (memcmp(&cmp1, &cmp2, sizeof(cmp1)) == 0) {
545 btrfs_release_path(path);
546 goto out;
547 }
548 }
549 btrfs_release_path(path);
550
551 saved_nbytes = inode_get_bytes(inode);
552
553 ret = btrfs_drop_extents(trans, inode, start, extent_end,
554 &alloc_hint, 1);
555 BUG_ON(ret);
556
557 if (found_type == BTRFS_FILE_EXTENT_REG ||
558 found_type == BTRFS_FILE_EXTENT_PREALLOC) {
559 u64 offset;
560 unsigned long dest_offset;
561 struct btrfs_key ins;
562
563 ret = btrfs_insert_empty_item(trans, root, path, key,
564 sizeof(*item));
565 BUG_ON(ret);
566 dest_offset = btrfs_item_ptr_offset(path->nodes[0],
567 path->slots[0]);
568 copy_extent_buffer(path->nodes[0], eb, dest_offset,
569 (unsigned long)item, sizeof(*item));
570
571 ins.objectid = btrfs_file_extent_disk_bytenr(eb, item);
572 ins.offset = btrfs_file_extent_disk_num_bytes(eb, item);
573 ins.type = BTRFS_EXTENT_ITEM_KEY;
574 offset = key->offset - btrfs_file_extent_offset(eb, item);
575
576 if (ins.objectid > 0) {
577 u64 csum_start;
578 u64 csum_end;
579 LIST_HEAD(ordered_sums);
580
581
582
583
584 ret = btrfs_lookup_extent(root, ins.objectid,
585 ins.offset);
586 if (ret == 0) {
587 ret = btrfs_inc_extent_ref(trans, root,
588 ins.objectid, ins.offset,
589 0, root->root_key.objectid,
590 key->objectid, offset, 0);
591 BUG_ON(ret);
592 } else {
593
594
595
596
597 ret = btrfs_alloc_logged_file_extent(trans,
598 root, root->root_key.objectid,
599 key->objectid, offset, &ins);
600 BUG_ON(ret);
601 }
602 btrfs_release_path(path);
603
604 if (btrfs_file_extent_compression(eb, item)) {
605 csum_start = ins.objectid;
606 csum_end = csum_start + ins.offset;
607 } else {
608 csum_start = ins.objectid +
609 btrfs_file_extent_offset(eb, item);
610 csum_end = csum_start +
611 btrfs_file_extent_num_bytes(eb, item);
612 }
613
614 ret = btrfs_lookup_csums_range(root->log_root,
615 csum_start, csum_end - 1,
616 &ordered_sums, 0);
617 BUG_ON(ret);
618 while (!list_empty(&ordered_sums)) {
619 struct btrfs_ordered_sum *sums;
620 sums = list_entry(ordered_sums.next,
621 struct btrfs_ordered_sum,
622 list);
623 ret = btrfs_csum_file_blocks(trans,
624 root->fs_info->csum_root,
625 sums);
626 BUG_ON(ret);
627 list_del(&sums->list);
628 kfree(sums);
629 }
630 } else {
631 btrfs_release_path(path);
632 }
633 } else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
634
635 ret = overwrite_item(trans, root, path, eb, slot, key);
636 BUG_ON(ret);
637 }
638
639 inode_set_bytes(inode, saved_nbytes);
640 ret = btrfs_update_inode(trans, root, inode);
641out:
642 if (inode)
643 iput(inode);
644 return ret;
645}
646
647
648
649
650
651
652
653
654
655static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,
656 struct btrfs_root *root,
657 struct btrfs_path *path,
658 struct inode *dir,
659 struct btrfs_dir_item *di)
660{
661 struct inode *inode;
662 char *name;
663 int name_len;
664 struct extent_buffer *leaf;
665 struct btrfs_key location;
666 int ret;
667
668 leaf = path->nodes[0];
669
670 btrfs_dir_item_key_to_cpu(leaf, di, &location);
671 name_len = btrfs_dir_name_len(leaf, di);
672 name = kmalloc(name_len, GFP_NOFS);
673 if (!name)
674 return -ENOMEM;
675
676 read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len);
677 btrfs_release_path(path);
678
679 inode = read_one_inode(root, location.objectid);
680 if (!inode) {
681 kfree(name);
682 return -EIO;
683 }
684
685 ret = link_to_fixup_dir(trans, root, path, location.objectid);
686 BUG_ON(ret);
687
688 ret = btrfs_unlink_inode(trans, root, dir, inode, name, name_len);
689 BUG_ON(ret);
690 kfree(name);
691
692 iput(inode);
693
694 btrfs_run_delayed_items(trans, root);
695 return ret;
696}
697
698
699
700
701
702
703static noinline int inode_in_dir(struct btrfs_root *root,
704 struct btrfs_path *path,
705 u64 dirid, u64 objectid, u64 index,
706 const char *name, int name_len)
707{
708 struct btrfs_dir_item *di;
709 struct btrfs_key location;
710 int match = 0;
711
712 di = btrfs_lookup_dir_index_item(NULL, root, path, dirid,
713 index, name, name_len, 0);
714 if (di && !IS_ERR(di)) {
715 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
716 if (location.objectid != objectid)
717 goto out;
718 } else
719 goto out;
720 btrfs_release_path(path);
721
722 di = btrfs_lookup_dir_item(NULL, root, path, dirid, name, name_len, 0);
723 if (di && !IS_ERR(di)) {
724 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
725 if (location.objectid != objectid)
726 goto out;
727 } else
728 goto out;
729 match = 1;
730out:
731 btrfs_release_path(path);
732 return match;
733}
734
735
736
737
738
739
740
741
742
743
744
745static noinline int backref_in_log(struct btrfs_root *log,
746 struct btrfs_key *key,
747 char *name, int namelen)
748{
749 struct btrfs_path *path;
750 struct btrfs_inode_ref *ref;
751 unsigned long ptr;
752 unsigned long ptr_end;
753 unsigned long name_ptr;
754 int found_name_len;
755 int item_size;
756 int ret;
757 int match = 0;
758
759 path = btrfs_alloc_path();
760 if (!path)
761 return -ENOMEM;
762
763 ret = btrfs_search_slot(NULL, log, key, path, 0, 0);
764 if (ret != 0)
765 goto out;
766
767 item_size = btrfs_item_size_nr(path->nodes[0], path->slots[0]);
768 ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
769 ptr_end = ptr + item_size;
770 while (ptr < ptr_end) {
771 ref = (struct btrfs_inode_ref *)ptr;
772 found_name_len = btrfs_inode_ref_name_len(path->nodes[0], ref);
773 if (found_name_len == namelen) {
774 name_ptr = (unsigned long)(ref + 1);
775 ret = memcmp_extent_buffer(path->nodes[0], name,
776 name_ptr, namelen);
777 if (ret == 0) {
778 match = 1;
779 goto out;
780 }
781 }
782 ptr = (unsigned long)(ref + 1) + found_name_len;
783 }
784out:
785 btrfs_free_path(path);
786 return match;
787}
788
789
790
791
792
793
794
795
796static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
797 struct btrfs_root *root,
798 struct btrfs_root *log,
799 struct btrfs_path *path,
800 struct extent_buffer *eb, int slot,
801 struct btrfs_key *key)
802{
803 struct btrfs_inode_ref *ref;
804 struct btrfs_dir_item *di;
805 struct inode *dir;
806 struct inode *inode;
807 unsigned long ref_ptr;
808 unsigned long ref_end;
809 char *name;
810 int namelen;
811 int ret;
812 int search_done = 0;
813
814
815
816
817
818
819
820 dir = read_one_inode(root, key->offset);
821 if (!dir)
822 return -ENOENT;
823
824 inode = read_one_inode(root, key->objectid);
825 if (!inode) {
826 iput(dir);
827 return -EIO;
828 }
829
830 ref_ptr = btrfs_item_ptr_offset(eb, slot);
831 ref_end = ref_ptr + btrfs_item_size_nr(eb, slot);
832
833again:
834 ref = (struct btrfs_inode_ref *)ref_ptr;
835
836 namelen = btrfs_inode_ref_name_len(eb, ref);
837 name = kmalloc(namelen, GFP_NOFS);
838 BUG_ON(!name);
839
840 read_extent_buffer(eb, name, (unsigned long)(ref + 1), namelen);
841
842
843 if (inode_in_dir(root, path, btrfs_ino(dir), btrfs_ino(inode),
844 btrfs_inode_ref_index(eb, ref),
845 name, namelen)) {
846 goto out;
847 }
848
849
850
851
852
853
854
855
856
857 if (search_done)
858 goto insert;
859
860 ret = btrfs_search_slot(NULL, root, key, path, 0, 0);
861 if (ret == 0) {
862 char *victim_name;
863 int victim_name_len;
864 struct btrfs_inode_ref *victim_ref;
865 unsigned long ptr;
866 unsigned long ptr_end;
867 struct extent_buffer *leaf = path->nodes[0];
868
869
870
871
872 if (key->objectid == key->offset)
873 goto out_nowrite;
874
875
876
877
878
879 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
880 ptr_end = ptr + btrfs_item_size_nr(leaf, path->slots[0]);
881 while (ptr < ptr_end) {
882 victim_ref = (struct btrfs_inode_ref *)ptr;
883 victim_name_len = btrfs_inode_ref_name_len(leaf,
884 victim_ref);
885 victim_name = kmalloc(victim_name_len, GFP_NOFS);
886 BUG_ON(!victim_name);
887
888 read_extent_buffer(leaf, victim_name,
889 (unsigned long)(victim_ref + 1),
890 victim_name_len);
891
892 if (!backref_in_log(log, key, victim_name,
893 victim_name_len)) {
894 btrfs_inc_nlink(inode);
895 btrfs_release_path(path);
896
897 ret = btrfs_unlink_inode(trans, root, dir,
898 inode, victim_name,
899 victim_name_len);
900 btrfs_run_delayed_items(trans, root);
901 }
902 kfree(victim_name);
903 ptr = (unsigned long)(victim_ref + 1) + victim_name_len;
904 }
905 BUG_ON(ret);
906
907
908
909
910
911 search_done = 1;
912 }
913 btrfs_release_path(path);
914
915
916 di = btrfs_lookup_dir_index_item(trans, root, path, btrfs_ino(dir),
917 btrfs_inode_ref_index(eb, ref),
918 name, namelen, 0);
919 if (di && !IS_ERR(di)) {
920 ret = drop_one_dir_item(trans, root, path, dir, di);
921 BUG_ON(ret);
922 }
923 btrfs_release_path(path);
924
925
926 di = btrfs_lookup_dir_item(trans, root, path, btrfs_ino(dir),
927 name, namelen, 0);
928 if (di && !IS_ERR(di)) {
929 ret = drop_one_dir_item(trans, root, path, dir, di);
930 BUG_ON(ret);
931 }
932 btrfs_release_path(path);
933
934insert:
935
936 ret = btrfs_add_link(trans, dir, inode, name, namelen, 0,
937 btrfs_inode_ref_index(eb, ref));
938 BUG_ON(ret);
939
940 btrfs_update_inode(trans, root, inode);
941
942out:
943 ref_ptr = (unsigned long)(ref + 1) + namelen;
944 kfree(name);
945 if (ref_ptr < ref_end)
946 goto again;
947
948
949 ret = overwrite_item(trans, root, path, eb, slot, key);
950 BUG_ON(ret);
951
952out_nowrite:
953 btrfs_release_path(path);
954 iput(dir);
955 iput(inode);
956 return 0;
957}
958
959static int insert_orphan_item(struct btrfs_trans_handle *trans,
960 struct btrfs_root *root, u64 offset)
961{
962 int ret;
963 ret = btrfs_find_orphan_item(root, offset);
964 if (ret > 0)
965 ret = btrfs_insert_orphan_item(trans, root, offset);
966 return ret;
967}
968
969
970
971
972
973
974
975
976
977
978
979
980static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans,
981 struct btrfs_root *root,
982 struct inode *inode)
983{
984 struct btrfs_path *path;
985 int ret;
986 struct btrfs_key key;
987 u64 nlink = 0;
988 unsigned long ptr;
989 unsigned long ptr_end;
990 int name_len;
991 u64 ino = btrfs_ino(inode);
992
993 key.objectid = ino;
994 key.type = BTRFS_INODE_REF_KEY;
995 key.offset = (u64)-1;
996
997 path = btrfs_alloc_path();
998 if (!path)
999 return -ENOMEM;
1000
1001 while (1) {
1002 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1003 if (ret < 0)
1004 break;
1005 if (ret > 0) {
1006 if (path->slots[0] == 0)
1007 break;
1008 path->slots[0]--;
1009 }
1010 btrfs_item_key_to_cpu(path->nodes[0], &key,
1011 path->slots[0]);
1012 if (key.objectid != ino ||
1013 key.type != BTRFS_INODE_REF_KEY)
1014 break;
1015 ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
1016 ptr_end = ptr + btrfs_item_size_nr(path->nodes[0],
1017 path->slots[0]);
1018 while (ptr < ptr_end) {
1019 struct btrfs_inode_ref *ref;
1020
1021 ref = (struct btrfs_inode_ref *)ptr;
1022 name_len = btrfs_inode_ref_name_len(path->nodes[0],
1023 ref);
1024 ptr = (unsigned long)(ref + 1) + name_len;
1025 nlink++;
1026 }
1027
1028 if (key.offset == 0)
1029 break;
1030 key.offset--;
1031 btrfs_release_path(path);
1032 }
1033 btrfs_release_path(path);
1034 if (nlink != inode->i_nlink) {
1035 set_nlink(inode, nlink);
1036 btrfs_update_inode(trans, root, inode);
1037 }
1038 BTRFS_I(inode)->index_cnt = (u64)-1;
1039
1040 if (inode->i_nlink == 0) {
1041 if (S_ISDIR(inode->i_mode)) {
1042 ret = replay_dir_deletes(trans, root, NULL, path,
1043 ino, 1);
1044 BUG_ON(ret);
1045 }
1046 ret = insert_orphan_item(trans, root, ino);
1047 BUG_ON(ret);
1048 }
1049 btrfs_free_path(path);
1050
1051 return 0;
1052}
1053
1054static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
1055 struct btrfs_root *root,
1056 struct btrfs_path *path)
1057{
1058 int ret;
1059 struct btrfs_key key;
1060 struct inode *inode;
1061
1062 key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
1063 key.type = BTRFS_ORPHAN_ITEM_KEY;
1064 key.offset = (u64)-1;
1065 while (1) {
1066 ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
1067 if (ret < 0)
1068 break;
1069
1070 if (ret == 1) {
1071 if (path->slots[0] == 0)
1072 break;
1073 path->slots[0]--;
1074 }
1075
1076 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1077 if (key.objectid != BTRFS_TREE_LOG_FIXUP_OBJECTID ||
1078 key.type != BTRFS_ORPHAN_ITEM_KEY)
1079 break;
1080
1081 ret = btrfs_del_item(trans, root, path);
1082 if (ret)
1083 goto out;
1084
1085 btrfs_release_path(path);
1086 inode = read_one_inode(root, key.offset);
1087 if (!inode)
1088 return -EIO;
1089
1090 ret = fixup_inode_link_count(trans, root, inode);
1091 BUG_ON(ret);
1092
1093 iput(inode);
1094
1095
1096
1097
1098
1099
1100 key.offset = (u64)-1;
1101 }
1102 ret = 0;
1103out:
1104 btrfs_release_path(path);
1105 return ret;
1106}
1107
1108
1109
1110
1111
1112
1113
1114static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
1115 struct btrfs_root *root,
1116 struct btrfs_path *path,
1117 u64 objectid)
1118{
1119 struct btrfs_key key;
1120 int ret = 0;
1121 struct inode *inode;
1122
1123 inode = read_one_inode(root, objectid);
1124 if (!inode)
1125 return -EIO;
1126
1127 key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
1128 btrfs_set_key_type(&key, BTRFS_ORPHAN_ITEM_KEY);
1129 key.offset = objectid;
1130
1131 ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
1132
1133 btrfs_release_path(path);
1134 if (ret == 0) {
1135 btrfs_inc_nlink(inode);
1136 ret = btrfs_update_inode(trans, root, inode);
1137 } else if (ret == -EEXIST) {
1138 ret = 0;
1139 } else {
1140 BUG();
1141 }
1142 iput(inode);
1143
1144 return ret;
1145}
1146
1147
1148
1149
1150
1151
1152static noinline int insert_one_name(struct btrfs_trans_handle *trans,
1153 struct btrfs_root *root,
1154 struct btrfs_path *path,
1155 u64 dirid, u64 index,
1156 char *name, int name_len, u8 type,
1157 struct btrfs_key *location)
1158{
1159 struct inode *inode;
1160 struct inode *dir;
1161 int ret;
1162
1163 inode = read_one_inode(root, location->objectid);
1164 if (!inode)
1165 return -ENOENT;
1166
1167 dir = read_one_inode(root, dirid);
1168 if (!dir) {
1169 iput(inode);
1170 return -EIO;
1171 }
1172 ret = btrfs_add_link(trans, dir, inode, name, name_len, 1, index);
1173
1174
1175
1176 iput(inode);
1177 iput(dir);
1178 return ret;
1179}
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194static noinline int replay_one_name(struct btrfs_trans_handle *trans,
1195 struct btrfs_root *root,
1196 struct btrfs_path *path,
1197 struct extent_buffer *eb,
1198 struct btrfs_dir_item *di,
1199 struct btrfs_key *key)
1200{
1201 char *name;
1202 int name_len;
1203 struct btrfs_dir_item *dst_di;
1204 struct btrfs_key found_key;
1205 struct btrfs_key log_key;
1206 struct inode *dir;
1207 u8 log_type;
1208 int exists;
1209 int ret;
1210
1211 dir = read_one_inode(root, key->objectid);
1212 if (!dir)
1213 return -EIO;
1214
1215 name_len = btrfs_dir_name_len(eb, di);
1216 name = kmalloc(name_len, GFP_NOFS);
1217 if (!name)
1218 return -ENOMEM;
1219
1220 log_type = btrfs_dir_type(eb, di);
1221 read_extent_buffer(eb, name, (unsigned long)(di + 1),
1222 name_len);
1223
1224 btrfs_dir_item_key_to_cpu(eb, di, &log_key);
1225 exists = btrfs_lookup_inode(trans, root, path, &log_key, 0);
1226 if (exists == 0)
1227 exists = 1;
1228 else
1229 exists = 0;
1230 btrfs_release_path(path);
1231
1232 if (key->type == BTRFS_DIR_ITEM_KEY) {
1233 dst_di = btrfs_lookup_dir_item(trans, root, path, key->objectid,
1234 name, name_len, 1);
1235 } else if (key->type == BTRFS_DIR_INDEX_KEY) {
1236 dst_di = btrfs_lookup_dir_index_item(trans, root, path,
1237 key->objectid,
1238 key->offset, name,
1239 name_len, 1);
1240 } else {
1241 BUG();
1242 }
1243 if (IS_ERR_OR_NULL(dst_di)) {
1244
1245
1246
1247 if (key->type != BTRFS_DIR_INDEX_KEY)
1248 goto out;
1249 goto insert;
1250 }
1251
1252 btrfs_dir_item_key_to_cpu(path->nodes[0], dst_di, &found_key);
1253
1254 if (found_key.objectid == log_key.objectid &&
1255 found_key.type == log_key.type &&
1256 found_key.offset == log_key.offset &&
1257 btrfs_dir_type(path->nodes[0], dst_di) == log_type) {
1258 goto out;
1259 }
1260
1261
1262
1263
1264
1265 if (!exists)
1266 goto out;
1267
1268 ret = drop_one_dir_item(trans, root, path, dir, dst_di);
1269 BUG_ON(ret);
1270
1271 if (key->type == BTRFS_DIR_INDEX_KEY)
1272 goto insert;
1273out:
1274 btrfs_release_path(path);
1275 kfree(name);
1276 iput(dir);
1277 return 0;
1278
1279insert:
1280 btrfs_release_path(path);
1281 ret = insert_one_name(trans, root, path, key->objectid, key->offset,
1282 name, name_len, log_type, &log_key);
1283
1284 BUG_ON(ret && ret != -ENOENT);
1285 goto out;
1286}
1287
1288
1289
1290
1291
1292
1293
1294static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans,
1295 struct btrfs_root *root,
1296 struct btrfs_path *path,
1297 struct extent_buffer *eb, int slot,
1298 struct btrfs_key *key)
1299{
1300 int ret;
1301 u32 item_size = btrfs_item_size_nr(eb, slot);
1302 struct btrfs_dir_item *di;
1303 int name_len;
1304 unsigned long ptr;
1305 unsigned long ptr_end;
1306
1307 ptr = btrfs_item_ptr_offset(eb, slot);
1308 ptr_end = ptr + item_size;
1309 while (ptr < ptr_end) {
1310 di = (struct btrfs_dir_item *)ptr;
1311 if (verify_dir_item(root, eb, di))
1312 return -EIO;
1313 name_len = btrfs_dir_name_len(eb, di);
1314 ret = replay_one_name(trans, root, path, eb, di, key);
1315 BUG_ON(ret);
1316 ptr = (unsigned long)(di + 1);
1317 ptr += name_len;
1318 }
1319 return 0;
1320}
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333static noinline int find_dir_range(struct btrfs_root *root,
1334 struct btrfs_path *path,
1335 u64 dirid, int key_type,
1336 u64 *start_ret, u64 *end_ret)
1337{
1338 struct btrfs_key key;
1339 u64 found_end;
1340 struct btrfs_dir_log_item *item;
1341 int ret;
1342 int nritems;
1343
1344 if (*start_ret == (u64)-1)
1345 return 1;
1346
1347 key.objectid = dirid;
1348 key.type = key_type;
1349 key.offset = *start_ret;
1350
1351 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1352 if (ret < 0)
1353 goto out;
1354 if (ret > 0) {
1355 if (path->slots[0] == 0)
1356 goto out;
1357 path->slots[0]--;
1358 }
1359 if (ret != 0)
1360 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1361
1362 if (key.type != key_type || key.objectid != dirid) {
1363 ret = 1;
1364 goto next;
1365 }
1366 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
1367 struct btrfs_dir_log_item);
1368 found_end = btrfs_dir_log_end(path->nodes[0], item);
1369
1370 if (*start_ret >= key.offset && *start_ret <= found_end) {
1371 ret = 0;
1372 *start_ret = key.offset;
1373 *end_ret = found_end;
1374 goto out;
1375 }
1376 ret = 1;
1377next:
1378
1379 nritems = btrfs_header_nritems(path->nodes[0]);
1380 if (path->slots[0] >= nritems) {
1381 ret = btrfs_next_leaf(root, path);
1382 if (ret)
1383 goto out;
1384 } else {
1385 path->slots[0]++;
1386 }
1387
1388 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1389
1390 if (key.type != key_type || key.objectid != dirid) {
1391 ret = 1;
1392 goto out;
1393 }
1394 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
1395 struct btrfs_dir_log_item);
1396 found_end = btrfs_dir_log_end(path->nodes[0], item);
1397 *start_ret = key.offset;
1398 *end_ret = found_end;
1399 ret = 0;
1400out:
1401 btrfs_release_path(path);
1402 return ret;
1403}
1404
1405
1406
1407
1408
1409
1410static noinline int check_item_in_log(struct btrfs_trans_handle *trans,
1411 struct btrfs_root *root,
1412 struct btrfs_root *log,
1413 struct btrfs_path *path,
1414 struct btrfs_path *log_path,
1415 struct inode *dir,
1416 struct btrfs_key *dir_key)
1417{
1418 int ret;
1419 struct extent_buffer *eb;
1420 int slot;
1421 u32 item_size;
1422 struct btrfs_dir_item *di;
1423 struct btrfs_dir_item *log_di;
1424 int name_len;
1425 unsigned long ptr;
1426 unsigned long ptr_end;
1427 char *name;
1428 struct inode *inode;
1429 struct btrfs_key location;
1430
1431again:
1432 eb = path->nodes[0];
1433 slot = path->slots[0];
1434 item_size = btrfs_item_size_nr(eb, slot);
1435 ptr = btrfs_item_ptr_offset(eb, slot);
1436 ptr_end = ptr + item_size;
1437 while (ptr < ptr_end) {
1438 di = (struct btrfs_dir_item *)ptr;
1439 if (verify_dir_item(root, eb, di)) {
1440 ret = -EIO;
1441 goto out;
1442 }
1443
1444 name_len = btrfs_dir_name_len(eb, di);
1445 name = kmalloc(name_len, GFP_NOFS);
1446 if (!name) {
1447 ret = -ENOMEM;
1448 goto out;
1449 }
1450 read_extent_buffer(eb, name, (unsigned long)(di + 1),
1451 name_len);
1452 log_di = NULL;
1453 if (log && dir_key->type == BTRFS_DIR_ITEM_KEY) {
1454 log_di = btrfs_lookup_dir_item(trans, log, log_path,
1455 dir_key->objectid,
1456 name, name_len, 0);
1457 } else if (log && dir_key->type == BTRFS_DIR_INDEX_KEY) {
1458 log_di = btrfs_lookup_dir_index_item(trans, log,
1459 log_path,
1460 dir_key->objectid,
1461 dir_key->offset,
1462 name, name_len, 0);
1463 }
1464 if (IS_ERR_OR_NULL(log_di)) {
1465 btrfs_dir_item_key_to_cpu(eb, di, &location);
1466 btrfs_release_path(path);
1467 btrfs_release_path(log_path);
1468 inode = read_one_inode(root, location.objectid);
1469 if (!inode) {
1470 kfree(name);
1471 return -EIO;
1472 }
1473
1474 ret = link_to_fixup_dir(trans, root,
1475 path, location.objectid);
1476 BUG_ON(ret);
1477 btrfs_inc_nlink(inode);
1478 ret = btrfs_unlink_inode(trans, root, dir, inode,
1479 name, name_len);
1480 BUG_ON(ret);
1481
1482 btrfs_run_delayed_items(trans, root);
1483
1484 kfree(name);
1485 iput(inode);
1486
1487
1488
1489
1490 ret = btrfs_search_slot(NULL, root, dir_key, path,
1491 0, 0);
1492 if (ret == 0)
1493 goto again;
1494 ret = 0;
1495 goto out;
1496 }
1497 btrfs_release_path(log_path);
1498 kfree(name);
1499
1500 ptr = (unsigned long)(di + 1);
1501 ptr += name_len;
1502 }
1503 ret = 0;
1504out:
1505 btrfs_release_path(path);
1506 btrfs_release_path(log_path);
1507 return ret;
1508}
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
1521 struct btrfs_root *root,
1522 struct btrfs_root *log,
1523 struct btrfs_path *path,
1524 u64 dirid, int del_all)
1525{
1526 u64 range_start;
1527 u64 range_end;
1528 int key_type = BTRFS_DIR_LOG_ITEM_KEY;
1529 int ret = 0;
1530 struct btrfs_key dir_key;
1531 struct btrfs_key found_key;
1532 struct btrfs_path *log_path;
1533 struct inode *dir;
1534
1535 dir_key.objectid = dirid;
1536 dir_key.type = BTRFS_DIR_ITEM_KEY;
1537 log_path = btrfs_alloc_path();
1538 if (!log_path)
1539 return -ENOMEM;
1540
1541 dir = read_one_inode(root, dirid);
1542
1543
1544
1545
1546 if (!dir) {
1547 btrfs_free_path(log_path);
1548 return 0;
1549 }
1550again:
1551 range_start = 0;
1552 range_end = 0;
1553 while (1) {
1554 if (del_all)
1555 range_end = (u64)-1;
1556 else {
1557 ret = find_dir_range(log, path, dirid, key_type,
1558 &range_start, &range_end);
1559 if (ret != 0)
1560 break;
1561 }
1562
1563 dir_key.offset = range_start;
1564 while (1) {
1565 int nritems;
1566 ret = btrfs_search_slot(NULL, root, &dir_key, path,
1567 0, 0);
1568 if (ret < 0)
1569 goto out;
1570
1571 nritems = btrfs_header_nritems(path->nodes[0]);
1572 if (path->slots[0] >= nritems) {
1573 ret = btrfs_next_leaf(root, path);
1574 if (ret)
1575 break;
1576 }
1577 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
1578 path->slots[0]);
1579 if (found_key.objectid != dirid ||
1580 found_key.type != dir_key.type)
1581 goto next_type;
1582
1583 if (found_key.offset > range_end)
1584 break;
1585
1586 ret = check_item_in_log(trans, root, log, path,
1587 log_path, dir,
1588 &found_key);
1589 BUG_ON(ret);
1590 if (found_key.offset == (u64)-1)
1591 break;
1592 dir_key.offset = found_key.offset + 1;
1593 }
1594 btrfs_release_path(path);
1595 if (range_end == (u64)-1)
1596 break;
1597 range_start = range_end + 1;
1598 }
1599
1600next_type:
1601 ret = 0;
1602 if (key_type == BTRFS_DIR_LOG_ITEM_KEY) {
1603 key_type = BTRFS_DIR_LOG_INDEX_KEY;
1604 dir_key.type = BTRFS_DIR_INDEX_KEY;
1605 btrfs_release_path(path);
1606 goto again;
1607 }
1608out:
1609 btrfs_release_path(path);
1610 btrfs_free_path(log_path);
1611 iput(dir);
1612 return ret;
1613}
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb,
1627 struct walk_control *wc, u64 gen)
1628{
1629 int nritems;
1630 struct btrfs_path *path;
1631 struct btrfs_root *root = wc->replay_dest;
1632 struct btrfs_key key;
1633 int level;
1634 int i;
1635 int ret;
1636
1637 ret = btrfs_read_buffer(eb, gen);
1638 if (ret)
1639 return ret;
1640
1641 level = btrfs_header_level(eb);
1642
1643 if (level != 0)
1644 return 0;
1645
1646 path = btrfs_alloc_path();
1647 if (!path)
1648 return -ENOMEM;
1649
1650 nritems = btrfs_header_nritems(eb);
1651 for (i = 0; i < nritems; i++) {
1652 btrfs_item_key_to_cpu(eb, &key, i);
1653
1654
1655 if (key.type == BTRFS_INODE_ITEM_KEY &&
1656 wc->stage == LOG_WALK_REPLAY_INODES) {
1657 struct btrfs_inode_item *inode_item;
1658 u32 mode;
1659
1660 inode_item = btrfs_item_ptr(eb, i,
1661 struct btrfs_inode_item);
1662 mode = btrfs_inode_mode(eb, inode_item);
1663 if (S_ISDIR(mode)) {
1664 ret = replay_dir_deletes(wc->trans,
1665 root, log, path, key.objectid, 0);
1666 BUG_ON(ret);
1667 }
1668 ret = overwrite_item(wc->trans, root, path,
1669 eb, i, &key);
1670 BUG_ON(ret);
1671
1672
1673
1674
1675
1676 if (S_ISREG(mode)) {
1677 ret = insert_orphan_item(wc->trans, root,
1678 key.objectid);
1679 BUG_ON(ret);
1680 }
1681
1682 ret = link_to_fixup_dir(wc->trans, root,
1683 path, key.objectid);
1684 BUG_ON(ret);
1685 }
1686 if (wc->stage < LOG_WALK_REPLAY_ALL)
1687 continue;
1688
1689
1690 if (key.type == BTRFS_XATTR_ITEM_KEY) {
1691 ret = overwrite_item(wc->trans, root, path,
1692 eb, i, &key);
1693 BUG_ON(ret);
1694 } else if (key.type == BTRFS_INODE_REF_KEY) {
1695 ret = add_inode_ref(wc->trans, root, log, path,
1696 eb, i, &key);
1697 BUG_ON(ret && ret != -ENOENT);
1698 } else if (key.type == BTRFS_EXTENT_DATA_KEY) {
1699 ret = replay_one_extent(wc->trans, root, path,
1700 eb, i, &key);
1701 BUG_ON(ret);
1702 } else if (key.type == BTRFS_DIR_ITEM_KEY ||
1703 key.type == BTRFS_DIR_INDEX_KEY) {
1704 ret = replay_one_dir_item(wc->trans, root, path,
1705 eb, i, &key);
1706 BUG_ON(ret);
1707 }
1708 }
1709 btrfs_free_path(path);
1710 return 0;
1711}
1712
1713static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
1714 struct btrfs_root *root,
1715 struct btrfs_path *path, int *level,
1716 struct walk_control *wc)
1717{
1718 u64 root_owner;
1719 u64 bytenr;
1720 u64 ptr_gen;
1721 struct extent_buffer *next;
1722 struct extent_buffer *cur;
1723 struct extent_buffer *parent;
1724 u32 blocksize;
1725 int ret = 0;
1726
1727 WARN_ON(*level < 0);
1728 WARN_ON(*level >= BTRFS_MAX_LEVEL);
1729
1730 while (*level > 0) {
1731 WARN_ON(*level < 0);
1732 WARN_ON(*level >= BTRFS_MAX_LEVEL);
1733 cur = path->nodes[*level];
1734
1735 if (btrfs_header_level(cur) != *level)
1736 WARN_ON(1);
1737
1738 if (path->slots[*level] >=
1739 btrfs_header_nritems(cur))
1740 break;
1741
1742 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
1743 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
1744 blocksize = btrfs_level_size(root, *level - 1);
1745
1746 parent = path->nodes[*level];
1747 root_owner = btrfs_header_owner(parent);
1748
1749 next = btrfs_find_create_tree_block(root, bytenr, blocksize);
1750 if (!next)
1751 return -ENOMEM;
1752
1753 if (*level == 1) {
1754 ret = wc->process_func(root, next, wc, ptr_gen);
1755 if (ret)
1756 return ret;
1757
1758 path->slots[*level]++;
1759 if (wc->free) {
1760 ret = btrfs_read_buffer(next, ptr_gen);
1761 if (ret) {
1762 free_extent_buffer(next);
1763 return ret;
1764 }
1765
1766 btrfs_tree_lock(next);
1767 btrfs_set_lock_blocking(next);
1768 clean_tree_block(trans, root, next);
1769 btrfs_wait_tree_block_writeback(next);
1770 btrfs_tree_unlock(next);
1771
1772 WARN_ON(root_owner !=
1773 BTRFS_TREE_LOG_OBJECTID);
1774 ret = btrfs_free_and_pin_reserved_extent(root,
1775 bytenr, blocksize);
1776 BUG_ON(ret);
1777 }
1778 free_extent_buffer(next);
1779 continue;
1780 }
1781 ret = btrfs_read_buffer(next, ptr_gen);
1782 if (ret) {
1783 free_extent_buffer(next);
1784 return ret;
1785 }
1786
1787 WARN_ON(*level <= 0);
1788 if (path->nodes[*level-1])
1789 free_extent_buffer(path->nodes[*level-1]);
1790 path->nodes[*level-1] = next;
1791 *level = btrfs_header_level(next);
1792 path->slots[*level] = 0;
1793 cond_resched();
1794 }
1795 WARN_ON(*level < 0);
1796 WARN_ON(*level >= BTRFS_MAX_LEVEL);
1797
1798 path->slots[*level] = btrfs_header_nritems(path->nodes[*level]);
1799
1800 cond_resched();
1801 return 0;
1802}
1803
1804static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans,
1805 struct btrfs_root *root,
1806 struct btrfs_path *path, int *level,
1807 struct walk_control *wc)
1808{
1809 u64 root_owner;
1810 int i;
1811 int slot;
1812 int ret;
1813
1814 for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
1815 slot = path->slots[i];
1816 if (slot + 1 < btrfs_header_nritems(path->nodes[i])) {
1817 path->slots[i]++;
1818 *level = i;
1819 WARN_ON(*level == 0);
1820 return 0;
1821 } else {
1822 struct extent_buffer *parent;
1823 if (path->nodes[*level] == root->node)
1824 parent = path->nodes[*level];
1825 else
1826 parent = path->nodes[*level + 1];
1827
1828 root_owner = btrfs_header_owner(parent);
1829 ret = wc->process_func(root, path->nodes[*level], wc,
1830 btrfs_header_generation(path->nodes[*level]));
1831 if (ret)
1832 return ret;
1833
1834 if (wc->free) {
1835 struct extent_buffer *next;
1836
1837 next = path->nodes[*level];
1838
1839 btrfs_tree_lock(next);
1840 btrfs_set_lock_blocking(next);
1841 clean_tree_block(trans, root, next);
1842 btrfs_wait_tree_block_writeback(next);
1843 btrfs_tree_unlock(next);
1844
1845 WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
1846 ret = btrfs_free_and_pin_reserved_extent(root,
1847 path->nodes[*level]->start,
1848 path->nodes[*level]->len);
1849 BUG_ON(ret);
1850 }
1851 free_extent_buffer(path->nodes[*level]);
1852 path->nodes[*level] = NULL;
1853 *level = i + 1;
1854 }
1855 }
1856 return 1;
1857}
1858
1859
1860
1861
1862
1863
1864static int walk_log_tree(struct btrfs_trans_handle *trans,
1865 struct btrfs_root *log, struct walk_control *wc)
1866{
1867 int ret = 0;
1868 int wret;
1869 int level;
1870 struct btrfs_path *path;
1871 int i;
1872 int orig_level;
1873
1874 path = btrfs_alloc_path();
1875 if (!path)
1876 return -ENOMEM;
1877
1878 level = btrfs_header_level(log->node);
1879 orig_level = level;
1880 path->nodes[level] = log->node;
1881 extent_buffer_get(log->node);
1882 path->slots[level] = 0;
1883
1884 while (1) {
1885 wret = walk_down_log_tree(trans, log, path, &level, wc);
1886 if (wret > 0)
1887 break;
1888 if (wret < 0) {
1889 ret = wret;
1890 goto out;
1891 }
1892
1893 wret = walk_up_log_tree(trans, log, path, &level, wc);
1894 if (wret > 0)
1895 break;
1896 if (wret < 0) {
1897 ret = wret;
1898 goto out;
1899 }
1900 }
1901
1902
1903 if (path->nodes[orig_level]) {
1904 ret = wc->process_func(log, path->nodes[orig_level], wc,
1905 btrfs_header_generation(path->nodes[orig_level]));
1906 if (ret)
1907 goto out;
1908 if (wc->free) {
1909 struct extent_buffer *next;
1910
1911 next = path->nodes[orig_level];
1912
1913 btrfs_tree_lock(next);
1914 btrfs_set_lock_blocking(next);
1915 clean_tree_block(trans, log, next);
1916 btrfs_wait_tree_block_writeback(next);
1917 btrfs_tree_unlock(next);
1918
1919 WARN_ON(log->root_key.objectid !=
1920 BTRFS_TREE_LOG_OBJECTID);
1921 ret = btrfs_free_and_pin_reserved_extent(log, next->start,
1922 next->len);
1923 BUG_ON(ret);
1924 }
1925 }
1926
1927out:
1928 for (i = 0; i <= orig_level; i++) {
1929 if (path->nodes[i]) {
1930 free_extent_buffer(path->nodes[i]);
1931 path->nodes[i] = NULL;
1932 }
1933 }
1934 btrfs_free_path(path);
1935 return ret;
1936}
1937
1938
1939
1940
1941
1942static int update_log_root(struct btrfs_trans_handle *trans,
1943 struct btrfs_root *log)
1944{
1945 int ret;
1946
1947 if (log->log_transid == 1) {
1948
1949 ret = btrfs_insert_root(trans, log->fs_info->log_root_tree,
1950 &log->root_key, &log->root_item);
1951 } else {
1952 ret = btrfs_update_root(trans, log->fs_info->log_root_tree,
1953 &log->root_key, &log->root_item);
1954 }
1955 return ret;
1956}
1957
1958static int wait_log_commit(struct btrfs_trans_handle *trans,
1959 struct btrfs_root *root, unsigned long transid)
1960{
1961 DEFINE_WAIT(wait);
1962 int index = transid % 2;
1963
1964
1965
1966
1967
1968
1969 do {
1970 prepare_to_wait(&root->log_commit_wait[index],
1971 &wait, TASK_UNINTERRUPTIBLE);
1972 mutex_unlock(&root->log_mutex);
1973
1974 if (root->fs_info->last_trans_log_full_commit !=
1975 trans->transid && root->log_transid < transid + 2 &&
1976 atomic_read(&root->log_commit[index]))
1977 schedule();
1978
1979 finish_wait(&root->log_commit_wait[index], &wait);
1980 mutex_lock(&root->log_mutex);
1981 } while (root->fs_info->last_trans_log_full_commit !=
1982 trans->transid && root->log_transid < transid + 2 &&
1983 atomic_read(&root->log_commit[index]));
1984 return 0;
1985}
1986
1987static void wait_for_writer(struct btrfs_trans_handle *trans,
1988 struct btrfs_root *root)
1989{
1990 DEFINE_WAIT(wait);
1991 while (root->fs_info->last_trans_log_full_commit !=
1992 trans->transid && atomic_read(&root->log_writers)) {
1993 prepare_to_wait(&root->log_writer_wait,
1994 &wait, TASK_UNINTERRUPTIBLE);
1995 mutex_unlock(&root->log_mutex);
1996 if (root->fs_info->last_trans_log_full_commit !=
1997 trans->transid && atomic_read(&root->log_writers))
1998 schedule();
1999 mutex_lock(&root->log_mutex);
2000 finish_wait(&root->log_writer_wait, &wait);
2001 }
2002}
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016int btrfs_sync_log(struct btrfs_trans_handle *trans,
2017 struct btrfs_root *root)
2018{
2019 int index1;
2020 int index2;
2021 int mark;
2022 int ret;
2023 struct btrfs_root *log = root->log_root;
2024 struct btrfs_root *log_root_tree = root->fs_info->log_root_tree;
2025 unsigned long log_transid = 0;
2026
2027 mutex_lock(&root->log_mutex);
2028 index1 = root->log_transid % 2;
2029 if (atomic_read(&root->log_commit[index1])) {
2030 wait_log_commit(trans, root, root->log_transid);
2031 mutex_unlock(&root->log_mutex);
2032 return 0;
2033 }
2034 atomic_set(&root->log_commit[index1], 1);
2035
2036
2037 if (atomic_read(&root->log_commit[(index1 + 1) % 2]))
2038 wait_log_commit(trans, root, root->log_transid - 1);
2039 while (1) {
2040 unsigned long batch = root->log_batch;
2041
2042 if (!btrfs_test_opt(root, SSD) && root->log_multiple_pids) {
2043 mutex_unlock(&root->log_mutex);
2044 schedule_timeout_uninterruptible(1);
2045 mutex_lock(&root->log_mutex);
2046 }
2047 wait_for_writer(trans, root);
2048 if (batch == root->log_batch)
2049 break;
2050 }
2051
2052
2053 if (root->fs_info->last_trans_log_full_commit == trans->transid) {
2054 ret = -EAGAIN;
2055 mutex_unlock(&root->log_mutex);
2056 goto out;
2057 }
2058
2059 log_transid = root->log_transid;
2060 if (log_transid % 2 == 0)
2061 mark = EXTENT_DIRTY;
2062 else
2063 mark = EXTENT_NEW;
2064
2065
2066
2067
2068 ret = btrfs_write_marked_extents(log, &log->dirty_log_pages, mark);
2069 if (ret) {
2070 btrfs_abort_transaction(trans, root, ret);
2071 mutex_unlock(&root->log_mutex);
2072 goto out;
2073 }
2074
2075 btrfs_set_root_node(&log->root_item, log->node);
2076
2077 root->log_batch = 0;
2078 root->log_transid++;
2079 log->log_transid = root->log_transid;
2080 root->log_start_pid = 0;
2081 smp_mb();
2082
2083
2084
2085
2086
2087 mutex_unlock(&root->log_mutex);
2088
2089 mutex_lock(&log_root_tree->log_mutex);
2090 log_root_tree->log_batch++;
2091 atomic_inc(&log_root_tree->log_writers);
2092 mutex_unlock(&log_root_tree->log_mutex);
2093
2094 ret = update_log_root(trans, log);
2095
2096 mutex_lock(&log_root_tree->log_mutex);
2097 if (atomic_dec_and_test(&log_root_tree->log_writers)) {
2098 smp_mb();
2099 if (waitqueue_active(&log_root_tree->log_writer_wait))
2100 wake_up(&log_root_tree->log_writer_wait);
2101 }
2102
2103 if (ret) {
2104 if (ret != -ENOSPC) {
2105 btrfs_abort_transaction(trans, root, ret);
2106 mutex_unlock(&log_root_tree->log_mutex);
2107 goto out;
2108 }
2109 root->fs_info->last_trans_log_full_commit = trans->transid;
2110 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2111 mutex_unlock(&log_root_tree->log_mutex);
2112 ret = -EAGAIN;
2113 goto out;
2114 }
2115
2116 index2 = log_root_tree->log_transid % 2;
2117 if (atomic_read(&log_root_tree->log_commit[index2])) {
2118 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2119 wait_log_commit(trans, log_root_tree,
2120 log_root_tree->log_transid);
2121 mutex_unlock(&log_root_tree->log_mutex);
2122 ret = 0;
2123 goto out;
2124 }
2125 atomic_set(&log_root_tree->log_commit[index2], 1);
2126
2127 if (atomic_read(&log_root_tree->log_commit[(index2 + 1) % 2])) {
2128 wait_log_commit(trans, log_root_tree,
2129 log_root_tree->log_transid - 1);
2130 }
2131
2132 wait_for_writer(trans, log_root_tree);
2133
2134
2135
2136
2137
2138 if (root->fs_info->last_trans_log_full_commit == trans->transid) {
2139 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2140 mutex_unlock(&log_root_tree->log_mutex);
2141 ret = -EAGAIN;
2142 goto out_wake_log_root;
2143 }
2144
2145 ret = btrfs_write_and_wait_marked_extents(log_root_tree,
2146 &log_root_tree->dirty_log_pages,
2147 EXTENT_DIRTY | EXTENT_NEW);
2148 if (ret) {
2149 btrfs_abort_transaction(trans, root, ret);
2150 mutex_unlock(&log_root_tree->log_mutex);
2151 goto out_wake_log_root;
2152 }
2153 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2154
2155 btrfs_set_super_log_root(root->fs_info->super_for_commit,
2156 log_root_tree->node->start);
2157 btrfs_set_super_log_root_level(root->fs_info->super_for_commit,
2158 btrfs_header_level(log_root_tree->node));
2159
2160 log_root_tree->log_batch = 0;
2161 log_root_tree->log_transid++;
2162 smp_mb();
2163
2164 mutex_unlock(&log_root_tree->log_mutex);
2165
2166
2167
2168
2169
2170
2171
2172
2173 btrfs_scrub_pause_super(root);
2174 write_ctree_super(trans, root->fs_info->tree_root, 1);
2175 btrfs_scrub_continue_super(root);
2176 ret = 0;
2177
2178 mutex_lock(&root->log_mutex);
2179 if (root->last_log_commit < log_transid)
2180 root->last_log_commit = log_transid;
2181 mutex_unlock(&root->log_mutex);
2182
2183out_wake_log_root:
2184 atomic_set(&log_root_tree->log_commit[index2], 0);
2185 smp_mb();
2186 if (waitqueue_active(&log_root_tree->log_commit_wait[index2]))
2187 wake_up(&log_root_tree->log_commit_wait[index2]);
2188out:
2189 atomic_set(&root->log_commit[index1], 0);
2190 smp_mb();
2191 if (waitqueue_active(&root->log_commit_wait[index1]))
2192 wake_up(&root->log_commit_wait[index1]);
2193 return ret;
2194}
2195
2196static void free_log_tree(struct btrfs_trans_handle *trans,
2197 struct btrfs_root *log)
2198{
2199 int ret;
2200 u64 start;
2201 u64 end;
2202 struct walk_control wc = {
2203 .free = 1,
2204 .process_func = process_one_buffer
2205 };
2206
2207 ret = walk_log_tree(trans, log, &wc);
2208 BUG_ON(ret);
2209
2210 while (1) {
2211 ret = find_first_extent_bit(&log->dirty_log_pages,
2212 0, &start, &end, EXTENT_DIRTY | EXTENT_NEW);
2213 if (ret)
2214 break;
2215
2216 clear_extent_bits(&log->dirty_log_pages, start, end,
2217 EXTENT_DIRTY | EXTENT_NEW, GFP_NOFS);
2218 }
2219
2220 free_extent_buffer(log->node);
2221 kfree(log);
2222}
2223
2224
2225
2226
2227
2228int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root)
2229{
2230 if (root->log_root) {
2231 free_log_tree(trans, root->log_root);
2232 root->log_root = NULL;
2233 }
2234 return 0;
2235}
2236
2237int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
2238 struct btrfs_fs_info *fs_info)
2239{
2240 if (fs_info->log_root_tree) {
2241 free_log_tree(trans, fs_info->log_root_tree);
2242 fs_info->log_root_tree = NULL;
2243 }
2244 return 0;
2245}
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,
2269 struct btrfs_root *root,
2270 const char *name, int name_len,
2271 struct inode *dir, u64 index)
2272{
2273 struct btrfs_root *log;
2274 struct btrfs_dir_item *di;
2275 struct btrfs_path *path;
2276 int ret;
2277 int err = 0;
2278 int bytes_del = 0;
2279 u64 dir_ino = btrfs_ino(dir);
2280
2281 if (BTRFS_I(dir)->logged_trans < trans->transid)
2282 return 0;
2283
2284 ret = join_running_log_trans(root);
2285 if (ret)
2286 return 0;
2287
2288 mutex_lock(&BTRFS_I(dir)->log_mutex);
2289
2290 log = root->log_root;
2291 path = btrfs_alloc_path();
2292 if (!path) {
2293 err = -ENOMEM;
2294 goto out_unlock;
2295 }
2296
2297 di = btrfs_lookup_dir_item(trans, log, path, dir_ino,
2298 name, name_len, -1);
2299 if (IS_ERR(di)) {
2300 err = PTR_ERR(di);
2301 goto fail;
2302 }
2303 if (di) {
2304 ret = btrfs_delete_one_dir_name(trans, log, path, di);
2305 bytes_del += name_len;
2306 BUG_ON(ret);
2307 }
2308 btrfs_release_path(path);
2309 di = btrfs_lookup_dir_index_item(trans, log, path, dir_ino,
2310 index, name, name_len, -1);
2311 if (IS_ERR(di)) {
2312 err = PTR_ERR(di);
2313 goto fail;
2314 }
2315 if (di) {
2316 ret = btrfs_delete_one_dir_name(trans, log, path, di);
2317 bytes_del += name_len;
2318 BUG_ON(ret);
2319 }
2320
2321
2322
2323
2324 if (bytes_del) {
2325 struct btrfs_key key;
2326
2327 key.objectid = dir_ino;
2328 key.offset = 0;
2329 key.type = BTRFS_INODE_ITEM_KEY;
2330 btrfs_release_path(path);
2331
2332 ret = btrfs_search_slot(trans, log, &key, path, 0, 1);
2333 if (ret < 0) {
2334 err = ret;
2335 goto fail;
2336 }
2337 if (ret == 0) {
2338 struct btrfs_inode_item *item;
2339 u64 i_size;
2340
2341 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
2342 struct btrfs_inode_item);
2343 i_size = btrfs_inode_size(path->nodes[0], item);
2344 if (i_size > bytes_del)
2345 i_size -= bytes_del;
2346 else
2347 i_size = 0;
2348 btrfs_set_inode_size(path->nodes[0], item, i_size);
2349 btrfs_mark_buffer_dirty(path->nodes[0]);
2350 } else
2351 ret = 0;
2352 btrfs_release_path(path);
2353 }
2354fail:
2355 btrfs_free_path(path);
2356out_unlock:
2357 mutex_unlock(&BTRFS_I(dir)->log_mutex);
2358 if (ret == -ENOSPC) {
2359 root->fs_info->last_trans_log_full_commit = trans->transid;
2360 ret = 0;
2361 } else if (ret < 0)
2362 btrfs_abort_transaction(trans, root, ret);
2363
2364 btrfs_end_log_trans(root);
2365
2366 return err;
2367}
2368
2369
2370int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans,
2371 struct btrfs_root *root,
2372 const char *name, int name_len,
2373 struct inode *inode, u64 dirid)
2374{
2375 struct btrfs_root *log;
2376 u64 index;
2377 int ret;
2378
2379 if (BTRFS_I(inode)->logged_trans < trans->transid)
2380 return 0;
2381
2382 ret = join_running_log_trans(root);
2383 if (ret)
2384 return 0;
2385 log = root->log_root;
2386 mutex_lock(&BTRFS_I(inode)->log_mutex);
2387
2388 ret = btrfs_del_inode_ref(trans, log, name, name_len, btrfs_ino(inode),
2389 dirid, &index);
2390 mutex_unlock(&BTRFS_I(inode)->log_mutex);
2391 if (ret == -ENOSPC) {
2392 root->fs_info->last_trans_log_full_commit = trans->transid;
2393 ret = 0;
2394 } else if (ret < 0 && ret != -ENOENT)
2395 btrfs_abort_transaction(trans, root, ret);
2396 btrfs_end_log_trans(root);
2397
2398 return ret;
2399}
2400
2401
2402
2403
2404
2405
2406static noinline int insert_dir_log_key(struct btrfs_trans_handle *trans,
2407 struct btrfs_root *log,
2408 struct btrfs_path *path,
2409 int key_type, u64 dirid,
2410 u64 first_offset, u64 last_offset)
2411{
2412 int ret;
2413 struct btrfs_key key;
2414 struct btrfs_dir_log_item *item;
2415
2416 key.objectid = dirid;
2417 key.offset = first_offset;
2418 if (key_type == BTRFS_DIR_ITEM_KEY)
2419 key.type = BTRFS_DIR_LOG_ITEM_KEY;
2420 else
2421 key.type = BTRFS_DIR_LOG_INDEX_KEY;
2422 ret = btrfs_insert_empty_item(trans, log, path, &key, sizeof(*item));
2423 if (ret)
2424 return ret;
2425
2426 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
2427 struct btrfs_dir_log_item);
2428 btrfs_set_dir_log_end(path->nodes[0], item, last_offset);
2429 btrfs_mark_buffer_dirty(path->nodes[0]);
2430 btrfs_release_path(path);
2431 return 0;
2432}
2433
2434
2435
2436
2437
2438
2439static noinline int log_dir_items(struct btrfs_trans_handle *trans,
2440 struct btrfs_root *root, struct inode *inode,
2441 struct btrfs_path *path,
2442 struct btrfs_path *dst_path, int key_type,
2443 u64 min_offset, u64 *last_offset_ret)
2444{
2445 struct btrfs_key min_key;
2446 struct btrfs_key max_key;
2447 struct btrfs_root *log = root->log_root;
2448 struct extent_buffer *src;
2449 int err = 0;
2450 int ret;
2451 int i;
2452 int nritems;
2453 u64 first_offset = min_offset;
2454 u64 last_offset = (u64)-1;
2455 u64 ino = btrfs_ino(inode);
2456
2457 log = root->log_root;
2458 max_key.objectid = ino;
2459 max_key.offset = (u64)-1;
2460 max_key.type = key_type;
2461
2462 min_key.objectid = ino;
2463 min_key.type = key_type;
2464 min_key.offset = min_offset;
2465
2466 path->keep_locks = 1;
2467
2468 ret = btrfs_search_forward(root, &min_key, &max_key,
2469 path, 0, trans->transid);
2470
2471
2472
2473
2474
2475 if (ret != 0 || min_key.objectid != ino || min_key.type != key_type) {
2476 min_key.objectid = ino;
2477 min_key.type = key_type;
2478 min_key.offset = (u64)-1;
2479 btrfs_release_path(path);
2480 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
2481 if (ret < 0) {
2482 btrfs_release_path(path);
2483 return ret;
2484 }
2485 ret = btrfs_previous_item(root, path, ino, key_type);
2486
2487
2488
2489
2490
2491
2492 if (ret == 0) {
2493 struct btrfs_key tmp;
2494 btrfs_item_key_to_cpu(path->nodes[0], &tmp,
2495 path->slots[0]);
2496 if (key_type == tmp.type)
2497 first_offset = max(min_offset, tmp.offset) + 1;
2498 }
2499 goto done;
2500 }
2501
2502
2503 ret = btrfs_previous_item(root, path, ino, key_type);
2504 if (ret == 0) {
2505 struct btrfs_key tmp;
2506 btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]);
2507 if (key_type == tmp.type) {
2508 first_offset = tmp.offset;
2509 ret = overwrite_item(trans, log, dst_path,
2510 path->nodes[0], path->slots[0],
2511 &tmp);
2512 if (ret) {
2513 err = ret;
2514 goto done;
2515 }
2516 }
2517 }
2518 btrfs_release_path(path);
2519
2520
2521 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
2522 if (ret != 0) {
2523 WARN_ON(1);
2524 goto done;
2525 }
2526
2527
2528
2529
2530
2531 while (1) {
2532 struct btrfs_key tmp;
2533 src = path->nodes[0];
2534 nritems = btrfs_header_nritems(src);
2535 for (i = path->slots[0]; i < nritems; i++) {
2536 btrfs_item_key_to_cpu(src, &min_key, i);
2537
2538 if (min_key.objectid != ino || min_key.type != key_type)
2539 goto done;
2540 ret = overwrite_item(trans, log, dst_path, src, i,
2541 &min_key);
2542 if (ret) {
2543 err = ret;
2544 goto done;
2545 }
2546 }
2547 path->slots[0] = nritems;
2548
2549
2550
2551
2552
2553 ret = btrfs_next_leaf(root, path);
2554 if (ret == 1) {
2555 last_offset = (u64)-1;
2556 goto done;
2557 }
2558 btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]);
2559 if (tmp.objectid != ino || tmp.type != key_type) {
2560 last_offset = (u64)-1;
2561 goto done;
2562 }
2563 if (btrfs_header_generation(path->nodes[0]) != trans->transid) {
2564 ret = overwrite_item(trans, log, dst_path,
2565 path->nodes[0], path->slots[0],
2566 &tmp);
2567 if (ret)
2568 err = ret;
2569 else
2570 last_offset = tmp.offset;
2571 goto done;
2572 }
2573 }
2574done:
2575 btrfs_release_path(path);
2576 btrfs_release_path(dst_path);
2577
2578 if (err == 0) {
2579 *last_offset_ret = last_offset;
2580
2581
2582
2583
2584 ret = insert_dir_log_key(trans, log, path, key_type,
2585 ino, first_offset, last_offset);
2586 if (ret)
2587 err = ret;
2588 }
2589 return err;
2590}
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604static noinline int log_directory_changes(struct btrfs_trans_handle *trans,
2605 struct btrfs_root *root, struct inode *inode,
2606 struct btrfs_path *path,
2607 struct btrfs_path *dst_path)
2608{
2609 u64 min_key;
2610 u64 max_key;
2611 int ret;
2612 int key_type = BTRFS_DIR_ITEM_KEY;
2613
2614again:
2615 min_key = 0;
2616 max_key = 0;
2617 while (1) {
2618 ret = log_dir_items(trans, root, inode, path,
2619 dst_path, key_type, min_key,
2620 &max_key);
2621 if (ret)
2622 return ret;
2623 if (max_key == (u64)-1)
2624 break;
2625 min_key = max_key + 1;
2626 }
2627
2628 if (key_type == BTRFS_DIR_ITEM_KEY) {
2629 key_type = BTRFS_DIR_INDEX_KEY;
2630 goto again;
2631 }
2632 return 0;
2633}
2634
2635
2636
2637
2638
2639
2640
2641static int drop_objectid_items(struct btrfs_trans_handle *trans,
2642 struct btrfs_root *log,
2643 struct btrfs_path *path,
2644 u64 objectid, int max_key_type)
2645{
2646 int ret;
2647 struct btrfs_key key;
2648 struct btrfs_key found_key;
2649
2650 key.objectid = objectid;
2651 key.type = max_key_type;
2652 key.offset = (u64)-1;
2653
2654 while (1) {
2655 ret = btrfs_search_slot(trans, log, &key, path, -1, 1);
2656 BUG_ON(ret == 0);
2657 if (ret < 0)
2658 break;
2659
2660 if (path->slots[0] == 0)
2661 break;
2662
2663 path->slots[0]--;
2664 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
2665 path->slots[0]);
2666
2667 if (found_key.objectid != objectid)
2668 break;
2669
2670 ret = btrfs_del_item(trans, log, path);
2671 if (ret)
2672 break;
2673 btrfs_release_path(path);
2674 }
2675 btrfs_release_path(path);
2676 if (ret > 0)
2677 ret = 0;
2678 return ret;
2679}
2680
2681static noinline int copy_items(struct btrfs_trans_handle *trans,
2682 struct btrfs_root *log,
2683 struct btrfs_path *dst_path,
2684 struct extent_buffer *src,
2685 int start_slot, int nr, int inode_only)
2686{
2687 unsigned long src_offset;
2688 unsigned long dst_offset;
2689 struct btrfs_file_extent_item *extent;
2690 struct btrfs_inode_item *inode_item;
2691 int ret;
2692 struct btrfs_key *ins_keys;
2693 u32 *ins_sizes;
2694 char *ins_data;
2695 int i;
2696 struct list_head ordered_sums;
2697
2698 INIT_LIST_HEAD(&ordered_sums);
2699
2700 ins_data = kmalloc(nr * sizeof(struct btrfs_key) +
2701 nr * sizeof(u32), GFP_NOFS);
2702 if (!ins_data)
2703 return -ENOMEM;
2704
2705 ins_sizes = (u32 *)ins_data;
2706 ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32));
2707
2708 for (i = 0; i < nr; i++) {
2709 ins_sizes[i] = btrfs_item_size_nr(src, i + start_slot);
2710 btrfs_item_key_to_cpu(src, ins_keys + i, i + start_slot);
2711 }
2712 ret = btrfs_insert_empty_items(trans, log, dst_path,
2713 ins_keys, ins_sizes, nr);
2714 if (ret) {
2715 kfree(ins_data);
2716 return ret;
2717 }
2718
2719 for (i = 0; i < nr; i++, dst_path->slots[0]++) {
2720 dst_offset = btrfs_item_ptr_offset(dst_path->nodes[0],
2721 dst_path->slots[0]);
2722
2723 src_offset = btrfs_item_ptr_offset(src, start_slot + i);
2724
2725 copy_extent_buffer(dst_path->nodes[0], src, dst_offset,
2726 src_offset, ins_sizes[i]);
2727
2728 if (inode_only == LOG_INODE_EXISTS &&
2729 ins_keys[i].type == BTRFS_INODE_ITEM_KEY) {
2730 inode_item = btrfs_item_ptr(dst_path->nodes[0],
2731 dst_path->slots[0],
2732 struct btrfs_inode_item);
2733 btrfs_set_inode_size(dst_path->nodes[0], inode_item, 0);
2734
2735
2736
2737
2738
2739
2740 btrfs_set_inode_generation(dst_path->nodes[0],
2741 inode_item, 0);
2742 }
2743
2744
2745
2746
2747 if (btrfs_key_type(ins_keys + i) == BTRFS_EXTENT_DATA_KEY) {
2748 int found_type;
2749 extent = btrfs_item_ptr(src, start_slot + i,
2750 struct btrfs_file_extent_item);
2751
2752 if (btrfs_file_extent_generation(src, extent) < trans->transid)
2753 continue;
2754
2755 found_type = btrfs_file_extent_type(src, extent);
2756 if (found_type == BTRFS_FILE_EXTENT_REG ||
2757 found_type == BTRFS_FILE_EXTENT_PREALLOC) {
2758 u64 ds, dl, cs, cl;
2759 ds = btrfs_file_extent_disk_bytenr(src,
2760 extent);
2761
2762 if (ds == 0)
2763 continue;
2764
2765 dl = btrfs_file_extent_disk_num_bytes(src,
2766 extent);
2767 cs = btrfs_file_extent_offset(src, extent);
2768 cl = btrfs_file_extent_num_bytes(src,
2769 extent);
2770 if (btrfs_file_extent_compression(src,
2771 extent)) {
2772 cs = 0;
2773 cl = dl;
2774 }
2775
2776 ret = btrfs_lookup_csums_range(
2777 log->fs_info->csum_root,
2778 ds + cs, ds + cs + cl - 1,
2779 &ordered_sums, 0);
2780 BUG_ON(ret);
2781 }
2782 }
2783 }
2784
2785 btrfs_mark_buffer_dirty(dst_path->nodes[0]);
2786 btrfs_release_path(dst_path);
2787 kfree(ins_data);
2788
2789
2790
2791
2792
2793 ret = 0;
2794 while (!list_empty(&ordered_sums)) {
2795 struct btrfs_ordered_sum *sums = list_entry(ordered_sums.next,
2796 struct btrfs_ordered_sum,
2797 list);
2798 if (!ret)
2799 ret = btrfs_csum_file_blocks(trans, log, sums);
2800 list_del(&sums->list);
2801 kfree(sums);
2802 }
2803 return ret;
2804}
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820static int btrfs_log_inode(struct btrfs_trans_handle *trans,
2821 struct btrfs_root *root, struct inode *inode,
2822 int inode_only)
2823{
2824 struct btrfs_path *path;
2825 struct btrfs_path *dst_path;
2826 struct btrfs_key min_key;
2827 struct btrfs_key max_key;
2828 struct btrfs_root *log = root->log_root;
2829 struct extent_buffer *src = NULL;
2830 int err = 0;
2831 int ret;
2832 int nritems;
2833 int ins_start_slot = 0;
2834 int ins_nr;
2835 u64 ino = btrfs_ino(inode);
2836
2837 log = root->log_root;
2838
2839 path = btrfs_alloc_path();
2840 if (!path)
2841 return -ENOMEM;
2842 dst_path = btrfs_alloc_path();
2843 if (!dst_path) {
2844 btrfs_free_path(path);
2845 return -ENOMEM;
2846 }
2847
2848 min_key.objectid = ino;
2849 min_key.type = BTRFS_INODE_ITEM_KEY;
2850 min_key.offset = 0;
2851
2852 max_key.objectid = ino;
2853
2854
2855 if (!S_ISDIR(inode->i_mode))
2856 inode_only = LOG_INODE_ALL;
2857
2858 if (inode_only == LOG_INODE_EXISTS || S_ISDIR(inode->i_mode))
2859 max_key.type = BTRFS_XATTR_ITEM_KEY;
2860 else
2861 max_key.type = (u8)-1;
2862 max_key.offset = (u64)-1;
2863
2864 ret = btrfs_commit_inode_delayed_items(trans, inode);
2865 if (ret) {
2866 btrfs_free_path(path);
2867 btrfs_free_path(dst_path);
2868 return ret;
2869 }
2870
2871 mutex_lock(&BTRFS_I(inode)->log_mutex);
2872
2873
2874
2875
2876
2877 if (S_ISDIR(inode->i_mode)) {
2878 int max_key_type = BTRFS_DIR_LOG_INDEX_KEY;
2879
2880 if (inode_only == LOG_INODE_EXISTS)
2881 max_key_type = BTRFS_XATTR_ITEM_KEY;
2882 ret = drop_objectid_items(trans, log, path, ino, max_key_type);
2883 } else {
2884 ret = btrfs_truncate_inode_items(trans, log, inode, 0, 0);
2885 }
2886 if (ret) {
2887 err = ret;
2888 goto out_unlock;
2889 }
2890 path->keep_locks = 1;
2891
2892 while (1) {
2893 ins_nr = 0;
2894 ret = btrfs_search_forward(root, &min_key, &max_key,
2895 path, 0, trans->transid);
2896 if (ret != 0)
2897 break;
2898again:
2899
2900 if (min_key.objectid != ino)
2901 break;
2902 if (min_key.type > max_key.type)
2903 break;
2904
2905 src = path->nodes[0];
2906 if (ins_nr && ins_start_slot + ins_nr == path->slots[0]) {
2907 ins_nr++;
2908 goto next_slot;
2909 } else if (!ins_nr) {
2910 ins_start_slot = path->slots[0];
2911 ins_nr = 1;
2912 goto next_slot;
2913 }
2914
2915 ret = copy_items(trans, log, dst_path, src, ins_start_slot,
2916 ins_nr, inode_only);
2917 if (ret) {
2918 err = ret;
2919 goto out_unlock;
2920 }
2921 ins_nr = 1;
2922 ins_start_slot = path->slots[0];
2923next_slot:
2924
2925 nritems = btrfs_header_nritems(path->nodes[0]);
2926 path->slots[0]++;
2927 if (path->slots[0] < nritems) {
2928 btrfs_item_key_to_cpu(path->nodes[0], &min_key,
2929 path->slots[0]);
2930 goto again;
2931 }
2932 if (ins_nr) {
2933 ret = copy_items(trans, log, dst_path, src,
2934 ins_start_slot,
2935 ins_nr, inode_only);
2936 if (ret) {
2937 err = ret;
2938 goto out_unlock;
2939 }
2940 ins_nr = 0;
2941 }
2942 btrfs_release_path(path);
2943
2944 if (min_key.offset < (u64)-1)
2945 min_key.offset++;
2946 else if (min_key.type < (u8)-1)
2947 min_key.type++;
2948 else if (min_key.objectid < (u64)-1)
2949 min_key.objectid++;
2950 else
2951 break;
2952 }
2953 if (ins_nr) {
2954 ret = copy_items(trans, log, dst_path, src,
2955 ins_start_slot,
2956 ins_nr, inode_only);
2957 if (ret) {
2958 err = ret;
2959 goto out_unlock;
2960 }
2961 ins_nr = 0;
2962 }
2963 WARN_ON(ins_nr);
2964 if (inode_only == LOG_INODE_ALL && S_ISDIR(inode->i_mode)) {
2965 btrfs_release_path(path);
2966 btrfs_release_path(dst_path);
2967 ret = log_directory_changes(trans, root, inode, path, dst_path);
2968 if (ret) {
2969 err = ret;
2970 goto out_unlock;
2971 }
2972 }
2973 BTRFS_I(inode)->logged_trans = trans->transid;
2974out_unlock:
2975 mutex_unlock(&BTRFS_I(inode)->log_mutex);
2976
2977 btrfs_free_path(path);
2978 btrfs_free_path(dst_path);
2979 return err;
2980}
2981
2982
2983
2984
2985
2986
2987
2988static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans,
2989 struct inode *inode,
2990 struct dentry *parent,
2991 struct super_block *sb,
2992 u64 last_committed)
2993{
2994 int ret = 0;
2995 struct btrfs_root *root;
2996 struct dentry *old_parent = NULL;
2997
2998
2999
3000
3001
3002
3003
3004 if (S_ISREG(inode->i_mode) &&
3005 BTRFS_I(inode)->generation <= last_committed &&
3006 BTRFS_I(inode)->last_unlink_trans <= last_committed)
3007 goto out;
3008
3009 if (!S_ISDIR(inode->i_mode)) {
3010 if (!parent || !parent->d_inode || sb != parent->d_inode->i_sb)
3011 goto out;
3012 inode = parent->d_inode;
3013 }
3014
3015 while (1) {
3016 BTRFS_I(inode)->logged_trans = trans->transid;
3017 smp_mb();
3018
3019 if (BTRFS_I(inode)->last_unlink_trans > last_committed) {
3020 root = BTRFS_I(inode)->root;
3021
3022
3023
3024
3025
3026 root->fs_info->last_trans_log_full_commit =
3027 trans->transid;
3028 ret = 1;
3029 break;
3030 }
3031
3032 if (!parent || !parent->d_inode || sb != parent->d_inode->i_sb)
3033 break;
3034
3035 if (IS_ROOT(parent))
3036 break;
3037
3038 parent = dget_parent(parent);
3039 dput(old_parent);
3040 old_parent = parent;
3041 inode = parent->d_inode;
3042
3043 }
3044 dput(old_parent);
3045out:
3046 return ret;
3047}
3048
3049
3050
3051
3052
3053
3054
3055int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
3056 struct btrfs_root *root, struct inode *inode,
3057 struct dentry *parent, int exists_only)
3058{
3059 int inode_only = exists_only ? LOG_INODE_EXISTS : LOG_INODE_ALL;
3060 struct super_block *sb;
3061 struct dentry *old_parent = NULL;
3062 int ret = 0;
3063 u64 last_committed = root->fs_info->last_trans_committed;
3064
3065 sb = inode->i_sb;
3066
3067 if (btrfs_test_opt(root, NOTREELOG)) {
3068 ret = 1;
3069 goto end_no_trans;
3070 }
3071
3072 if (root->fs_info->last_trans_log_full_commit >
3073 root->fs_info->last_trans_committed) {
3074 ret = 1;
3075 goto end_no_trans;
3076 }
3077
3078 if (root != BTRFS_I(inode)->root ||
3079 btrfs_root_refs(&root->root_item) == 0) {
3080 ret = 1;
3081 goto end_no_trans;
3082 }
3083
3084 ret = check_parent_dirs_for_sync(trans, inode, parent,
3085 sb, last_committed);
3086 if (ret)
3087 goto end_no_trans;
3088
3089 if (btrfs_inode_in_log(inode, trans->transid)) {
3090 ret = BTRFS_NO_LOG_SYNC;
3091 goto end_no_trans;
3092 }
3093
3094 ret = start_log_trans(trans, root);
3095 if (ret)
3096 goto end_trans;
3097
3098 ret = btrfs_log_inode(trans, root, inode, inode_only);
3099 if (ret)
3100 goto end_trans;
3101
3102
3103
3104
3105
3106
3107
3108 if (S_ISREG(inode->i_mode) &&
3109 BTRFS_I(inode)->generation <= last_committed &&
3110 BTRFS_I(inode)->last_unlink_trans <= last_committed) {
3111 ret = 0;
3112 goto end_trans;
3113 }
3114
3115 inode_only = LOG_INODE_EXISTS;
3116 while (1) {
3117 if (!parent || !parent->d_inode || sb != parent->d_inode->i_sb)
3118 break;
3119
3120 inode = parent->d_inode;
3121 if (root != BTRFS_I(inode)->root)
3122 break;
3123
3124 if (BTRFS_I(inode)->generation >
3125 root->fs_info->last_trans_committed) {
3126 ret = btrfs_log_inode(trans, root, inode, inode_only);
3127 if (ret)
3128 goto end_trans;
3129 }
3130 if (IS_ROOT(parent))
3131 break;
3132
3133 parent = dget_parent(parent);
3134 dput(old_parent);
3135 old_parent = parent;
3136 }
3137 ret = 0;
3138end_trans:
3139 dput(old_parent);
3140 if (ret < 0) {
3141 BUG_ON(ret != -ENOSPC);
3142 root->fs_info->last_trans_log_full_commit = trans->transid;
3143 ret = 1;
3144 }
3145 btrfs_end_log_trans(root);
3146end_no_trans:
3147 return ret;
3148}
3149
3150
3151
3152
3153
3154
3155
3156int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans,
3157 struct btrfs_root *root, struct dentry *dentry)
3158{
3159 struct dentry *parent = dget_parent(dentry);
3160 int ret;
3161
3162 ret = btrfs_log_inode_parent(trans, root, dentry->d_inode, parent, 0);
3163 dput(parent);
3164
3165 return ret;
3166}
3167
3168
3169
3170
3171
3172int btrfs_recover_log_trees(struct btrfs_root *log_root_tree)
3173{
3174 int ret;
3175 struct btrfs_path *path;
3176 struct btrfs_trans_handle *trans;
3177 struct btrfs_key key;
3178 struct btrfs_key found_key;
3179 struct btrfs_key tmp_key;
3180 struct btrfs_root *log;
3181 struct btrfs_fs_info *fs_info = log_root_tree->fs_info;
3182 struct walk_control wc = {
3183 .process_func = process_one_buffer,
3184 .stage = 0,
3185 };
3186
3187 path = btrfs_alloc_path();
3188 if (!path)
3189 return -ENOMEM;
3190
3191 fs_info->log_root_recovering = 1;
3192
3193 trans = btrfs_start_transaction(fs_info->tree_root, 0);
3194 if (IS_ERR(trans)) {
3195 ret = PTR_ERR(trans);
3196 goto error;
3197 }
3198
3199 wc.trans = trans;
3200 wc.pin = 1;
3201
3202 ret = walk_log_tree(trans, log_root_tree, &wc);
3203 if (ret) {
3204 btrfs_error(fs_info, ret, "Failed to pin buffers while "
3205 "recovering log root tree.");
3206 goto error;
3207 }
3208
3209again:
3210 key.objectid = BTRFS_TREE_LOG_OBJECTID;
3211 key.offset = (u64)-1;
3212 btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY);
3213
3214 while (1) {
3215 ret = btrfs_search_slot(NULL, log_root_tree, &key, path, 0, 0);
3216
3217 if (ret < 0) {
3218 btrfs_error(fs_info, ret,
3219 "Couldn't find tree log root.");
3220 goto error;
3221 }
3222 if (ret > 0) {
3223 if (path->slots[0] == 0)
3224 break;
3225 path->slots[0]--;
3226 }
3227 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
3228 path->slots[0]);
3229 btrfs_release_path(path);
3230 if (found_key.objectid != BTRFS_TREE_LOG_OBJECTID)
3231 break;
3232
3233 log = btrfs_read_fs_root_no_radix(log_root_tree,
3234 &found_key);
3235 if (IS_ERR(log)) {
3236 ret = PTR_ERR(log);
3237 btrfs_error(fs_info, ret,
3238 "Couldn't read tree log root.");
3239 goto error;
3240 }
3241
3242 tmp_key.objectid = found_key.offset;
3243 tmp_key.type = BTRFS_ROOT_ITEM_KEY;
3244 tmp_key.offset = (u64)-1;
3245
3246 wc.replay_dest = btrfs_read_fs_root_no_name(fs_info, &tmp_key);
3247 if (IS_ERR(wc.replay_dest)) {
3248 ret = PTR_ERR(wc.replay_dest);
3249 btrfs_error(fs_info, ret, "Couldn't read target root "
3250 "for tree log recovery.");
3251 goto error;
3252 }
3253
3254 wc.replay_dest->log_root = log;
3255 btrfs_record_root_in_trans(trans, wc.replay_dest);
3256 ret = walk_log_tree(trans, log, &wc);
3257 BUG_ON(ret);
3258
3259 if (wc.stage == LOG_WALK_REPLAY_ALL) {
3260 ret = fixup_inode_link_counts(trans, wc.replay_dest,
3261 path);
3262 BUG_ON(ret);
3263 }
3264
3265 key.offset = found_key.offset - 1;
3266 wc.replay_dest->log_root = NULL;
3267 free_extent_buffer(log->node);
3268 free_extent_buffer(log->commit_root);
3269 kfree(log);
3270
3271 if (found_key.offset == 0)
3272 break;
3273 }
3274 btrfs_release_path(path);
3275
3276
3277 if (wc.pin) {
3278 wc.pin = 0;
3279 wc.process_func = replay_one_buffer;
3280 wc.stage = LOG_WALK_REPLAY_INODES;
3281 goto again;
3282 }
3283
3284 if (wc.stage < LOG_WALK_REPLAY_ALL) {
3285 wc.stage++;
3286 goto again;
3287 }
3288
3289 btrfs_free_path(path);
3290
3291 free_extent_buffer(log_root_tree->node);
3292 log_root_tree->log_root = NULL;
3293 fs_info->log_root_recovering = 0;
3294
3295
3296 btrfs_commit_transaction(trans, fs_info->tree_root);
3297
3298 kfree(log_root_tree);
3299 return 0;
3300
3301error:
3302 btrfs_free_path(path);
3303 return ret;
3304}
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans,
3315 struct inode *dir, struct inode *inode,
3316 int for_rename)
3317{
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328 if (S_ISREG(inode->i_mode))
3329 BTRFS_I(inode)->last_unlink_trans = trans->transid;
3330
3331
3332
3333
3334
3335 smp_mb();
3336 if (BTRFS_I(dir)->logged_trans == trans->transid)
3337 return;
3338
3339
3340
3341
3342
3343 if (BTRFS_I(inode)->logged_trans == trans->transid)
3344 return;
3345
3346
3347
3348
3349
3350
3351
3352
3353 if (for_rename)
3354 goto record;
3355
3356
3357 return;
3358
3359record:
3360 BTRFS_I(dir)->last_unlink_trans = trans->transid;
3361}
3362
3363
3364
3365
3366
3367
3368
3369
3370int btrfs_log_new_name(struct btrfs_trans_handle *trans,
3371 struct inode *inode, struct inode *old_dir,
3372 struct dentry *parent)
3373{
3374 struct btrfs_root * root = BTRFS_I(inode)->root;
3375
3376
3377
3378
3379
3380 if (S_ISREG(inode->i_mode))
3381 BTRFS_I(inode)->last_unlink_trans = trans->transid;
3382
3383
3384
3385
3386
3387 if (BTRFS_I(inode)->logged_trans <=
3388 root->fs_info->last_trans_committed &&
3389 (!old_dir || BTRFS_I(old_dir)->logged_trans <=
3390 root->fs_info->last_trans_committed))
3391 return 0;
3392
3393 return btrfs_log_inode_parent(trans, root, inode, parent, 1);
3394}
3395
3396