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 <linux/blkdev.h>
22#include <linux/list_sort.h>
23#include "tree-log.h"
24#include "disk-io.h"
25#include "locking.h"
26#include "print-tree.h"
27#include "backref.h"
28#include "hash.h"
29#include "compression.h"
30#include "qgroup.h"
31
32
33
34
35
36
37
38#define LOG_INODE_ALL 0
39#define LOG_INODE_EXISTS 1
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
91
92
93#define LOG_WALK_PIN_ONLY 0
94#define LOG_WALK_REPLAY_INODES 1
95#define LOG_WALK_REPLAY_DIR_INDEX 2
96#define LOG_WALK_REPLAY_ALL 3
97
98static int btrfs_log_inode(struct btrfs_trans_handle *trans,
99 struct btrfs_root *root, struct inode *inode,
100 int inode_only,
101 const loff_t start,
102 const loff_t end,
103 struct btrfs_log_ctx *ctx);
104static int link_to_fixup_dir(struct btrfs_trans_handle *trans,
105 struct btrfs_root *root,
106 struct btrfs_path *path, u64 objectid);
107static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
108 struct btrfs_root *root,
109 struct btrfs_root *log,
110 struct btrfs_path *path,
111 u64 dirid, int del_all);
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141static int start_log_trans(struct btrfs_trans_handle *trans,
142 struct btrfs_root *root,
143 struct btrfs_log_ctx *ctx)
144{
145 int ret = 0;
146
147 mutex_lock(&root->log_mutex);
148
149 if (root->log_root) {
150 if (btrfs_need_log_full_commit(root->fs_info, trans)) {
151 ret = -EAGAIN;
152 goto out;
153 }
154
155 if (!root->log_start_pid) {
156 clear_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state);
157 root->log_start_pid = current->pid;
158 } else if (root->log_start_pid != current->pid) {
159 set_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state);
160 }
161 } else {
162 mutex_lock(&root->fs_info->tree_log_mutex);
163 if (!root->fs_info->log_root_tree)
164 ret = btrfs_init_log_root_tree(trans, root->fs_info);
165 mutex_unlock(&root->fs_info->tree_log_mutex);
166 if (ret)
167 goto out;
168
169 ret = btrfs_add_log_tree(trans, root);
170 if (ret)
171 goto out;
172
173 clear_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state);
174 root->log_start_pid = current->pid;
175 }
176
177 atomic_inc(&root->log_batch);
178 atomic_inc(&root->log_writers);
179 if (ctx) {
180 int index = root->log_transid % 2;
181 list_add_tail(&ctx->list, &root->log_ctxs[index]);
182 ctx->log_transid = root->log_transid;
183 }
184
185out:
186 mutex_unlock(&root->log_mutex);
187 return ret;
188}
189
190
191
192
193
194
195static int join_running_log_trans(struct btrfs_root *root)
196{
197 int ret = -ENOENT;
198
199 smp_mb();
200 if (!root->log_root)
201 return -ENOENT;
202
203 mutex_lock(&root->log_mutex);
204 if (root->log_root) {
205 ret = 0;
206 atomic_inc(&root->log_writers);
207 }
208 mutex_unlock(&root->log_mutex);
209 return ret;
210}
211
212
213
214
215
216
217int btrfs_pin_log_trans(struct btrfs_root *root)
218{
219 int ret = -ENOENT;
220
221 mutex_lock(&root->log_mutex);
222 atomic_inc(&root->log_writers);
223 mutex_unlock(&root->log_mutex);
224 return ret;
225}
226
227
228
229
230
231void btrfs_end_log_trans(struct btrfs_root *root)
232{
233 if (atomic_dec_and_test(&root->log_writers)) {
234
235
236
237 if (waitqueue_active(&root->log_writer_wait))
238 wake_up(&root->log_writer_wait);
239 }
240}
241
242
243
244
245
246
247
248
249struct walk_control {
250
251
252
253 int free;
254
255
256
257
258 int write;
259
260
261
262
263 int wait;
264
265
266
267
268 int pin;
269
270
271 int stage;
272
273
274 struct btrfs_root *replay_dest;
275
276
277 struct btrfs_trans_handle *trans;
278
279
280
281
282
283
284 int (*process_func)(struct btrfs_root *log, struct extent_buffer *eb,
285 struct walk_control *wc, u64 gen);
286};
287
288
289
290
291static int process_one_buffer(struct btrfs_root *log,
292 struct extent_buffer *eb,
293 struct walk_control *wc, u64 gen)
294{
295 int ret = 0;
296
297
298
299
300
301 if (btrfs_fs_incompat(log->fs_info, MIXED_GROUPS)) {
302 ret = btrfs_read_buffer(eb, gen);
303 if (ret)
304 return ret;
305 }
306
307 if (wc->pin)
308 ret = btrfs_pin_extent_for_log_replay(log->fs_info->extent_root,
309 eb->start, eb->len);
310
311 if (!ret && btrfs_buffer_uptodate(eb, gen, 0)) {
312 if (wc->pin && btrfs_header_level(eb) == 0)
313 ret = btrfs_exclude_logged_extents(log, eb);
314 if (wc->write)
315 btrfs_write_tree_block(eb);
316 if (wc->wait)
317 btrfs_wait_tree_block_writeback(eb);
318 }
319 return ret;
320}
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336static noinline int overwrite_item(struct btrfs_trans_handle *trans,
337 struct btrfs_root *root,
338 struct btrfs_path *path,
339 struct extent_buffer *eb, int slot,
340 struct btrfs_key *key)
341{
342 int ret;
343 u32 item_size;
344 u64 saved_i_size = 0;
345 int save_old_i_size = 0;
346 unsigned long src_ptr;
347 unsigned long dst_ptr;
348 int overwrite_root = 0;
349 bool inode_item = key->type == BTRFS_INODE_ITEM_KEY;
350
351 if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID)
352 overwrite_root = 1;
353
354 item_size = btrfs_item_size_nr(eb, slot);
355 src_ptr = btrfs_item_ptr_offset(eb, slot);
356
357
358 ret = btrfs_search_slot(NULL, root, key, path, 0, 0);
359 if (ret < 0)
360 return ret;
361
362 if (ret == 0) {
363 char *src_copy;
364 char *dst_copy;
365 u32 dst_size = btrfs_item_size_nr(path->nodes[0],
366 path->slots[0]);
367 if (dst_size != item_size)
368 goto insert;
369
370 if (item_size == 0) {
371 btrfs_release_path(path);
372 return 0;
373 }
374 dst_copy = kmalloc(item_size, GFP_NOFS);
375 src_copy = kmalloc(item_size, GFP_NOFS);
376 if (!dst_copy || !src_copy) {
377 btrfs_release_path(path);
378 kfree(dst_copy);
379 kfree(src_copy);
380 return -ENOMEM;
381 }
382
383 read_extent_buffer(eb, src_copy, src_ptr, item_size);
384
385 dst_ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
386 read_extent_buffer(path->nodes[0], dst_copy, dst_ptr,
387 item_size);
388 ret = memcmp(dst_copy, src_copy, item_size);
389
390 kfree(dst_copy);
391 kfree(src_copy);
392
393
394
395
396
397
398 if (ret == 0) {
399 btrfs_release_path(path);
400 return 0;
401 }
402
403
404
405
406
407 if (inode_item) {
408 struct btrfs_inode_item *item;
409 u64 nbytes;
410 u32 mode;
411
412 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
413 struct btrfs_inode_item);
414 nbytes = btrfs_inode_nbytes(path->nodes[0], item);
415 item = btrfs_item_ptr(eb, slot,
416 struct btrfs_inode_item);
417 btrfs_set_inode_nbytes(eb, item, nbytes);
418
419
420
421
422
423
424 mode = btrfs_inode_mode(eb, item);
425 if (S_ISDIR(mode))
426 btrfs_set_inode_size(eb, item, 0);
427 }
428 } else if (inode_item) {
429 struct btrfs_inode_item *item;
430 u32 mode;
431
432
433
434
435
436 item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item);
437 btrfs_set_inode_nbytes(eb, item, 0);
438
439
440
441
442
443
444 mode = btrfs_inode_mode(eb, item);
445 if (S_ISDIR(mode))
446 btrfs_set_inode_size(eb, item, 0);
447 }
448insert:
449 btrfs_release_path(path);
450
451 path->skip_release_on_error = 1;
452 ret = btrfs_insert_empty_item(trans, root, path,
453 key, item_size);
454 path->skip_release_on_error = 0;
455
456
457 if (ret == -EEXIST || ret == -EOVERFLOW) {
458 u32 found_size;
459 found_size = btrfs_item_size_nr(path->nodes[0],
460 path->slots[0]);
461 if (found_size > item_size)
462 btrfs_truncate_item(root, path, item_size, 1);
463 else if (found_size < item_size)
464 btrfs_extend_item(root, path,
465 item_size - found_size);
466 } else if (ret) {
467 return ret;
468 }
469 dst_ptr = btrfs_item_ptr_offset(path->nodes[0],
470 path->slots[0]);
471
472
473
474
475
476
477
478
479
480
481 if (key->type == BTRFS_INODE_ITEM_KEY && ret == -EEXIST) {
482 struct btrfs_inode_item *src_item;
483 struct btrfs_inode_item *dst_item;
484
485 src_item = (struct btrfs_inode_item *)src_ptr;
486 dst_item = (struct btrfs_inode_item *)dst_ptr;
487
488 if (btrfs_inode_generation(eb, src_item) == 0) {
489 struct extent_buffer *dst_eb = path->nodes[0];
490 const u64 ino_size = btrfs_inode_size(eb, src_item);
491
492
493
494
495
496
497
498
499 if (S_ISREG(btrfs_inode_mode(eb, src_item)) &&
500 S_ISREG(btrfs_inode_mode(dst_eb, dst_item)) &&
501 ino_size != 0) {
502 struct btrfs_map_token token;
503
504 btrfs_init_map_token(&token);
505 btrfs_set_token_inode_size(dst_eb, dst_item,
506 ino_size, &token);
507 }
508 goto no_copy;
509 }
510
511 if (overwrite_root &&
512 S_ISDIR(btrfs_inode_mode(eb, src_item)) &&
513 S_ISDIR(btrfs_inode_mode(path->nodes[0], dst_item))) {
514 save_old_i_size = 1;
515 saved_i_size = btrfs_inode_size(path->nodes[0],
516 dst_item);
517 }
518 }
519
520 copy_extent_buffer(path->nodes[0], eb, dst_ptr,
521 src_ptr, item_size);
522
523 if (save_old_i_size) {
524 struct btrfs_inode_item *dst_item;
525 dst_item = (struct btrfs_inode_item *)dst_ptr;
526 btrfs_set_inode_size(path->nodes[0], dst_item, saved_i_size);
527 }
528
529
530 if (key->type == BTRFS_INODE_ITEM_KEY) {
531 struct btrfs_inode_item *dst_item;
532 dst_item = (struct btrfs_inode_item *)dst_ptr;
533 if (btrfs_inode_generation(path->nodes[0], dst_item) == 0) {
534 btrfs_set_inode_generation(path->nodes[0], dst_item,
535 trans->transid);
536 }
537 }
538no_copy:
539 btrfs_mark_buffer_dirty(path->nodes[0]);
540 btrfs_release_path(path);
541 return 0;
542}
543
544
545
546
547
548static noinline struct inode *read_one_inode(struct btrfs_root *root,
549 u64 objectid)
550{
551 struct btrfs_key key;
552 struct inode *inode;
553
554 key.objectid = objectid;
555 key.type = BTRFS_INODE_ITEM_KEY;
556 key.offset = 0;
557 inode = btrfs_iget(root->fs_info->sb, &key, root, NULL);
558 if (IS_ERR(inode)) {
559 inode = NULL;
560 } else if (is_bad_inode(inode)) {
561 iput(inode);
562 inode = NULL;
563 }
564 return inode;
565}
566
567
568
569
570
571
572
573
574
575
576
577
578
579static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
580 struct btrfs_root *root,
581 struct btrfs_path *path,
582 struct extent_buffer *eb, int slot,
583 struct btrfs_key *key)
584{
585 int found_type;
586 u64 extent_end;
587 u64 start = key->offset;
588 u64 nbytes = 0;
589 struct btrfs_file_extent_item *item;
590 struct inode *inode = NULL;
591 unsigned long size;
592 int ret = 0;
593
594 item = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
595 found_type = btrfs_file_extent_type(eb, item);
596
597 if (found_type == BTRFS_FILE_EXTENT_REG ||
598 found_type == BTRFS_FILE_EXTENT_PREALLOC) {
599 nbytes = btrfs_file_extent_num_bytes(eb, item);
600 extent_end = start + nbytes;
601
602
603
604
605
606 if (btrfs_file_extent_disk_bytenr(eb, item) == 0)
607 nbytes = 0;
608 } else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
609 size = btrfs_file_extent_inline_len(eb, slot, item);
610 nbytes = btrfs_file_extent_ram_bytes(eb, item);
611 extent_end = ALIGN(start + size, root->sectorsize);
612 } else {
613 ret = 0;
614 goto out;
615 }
616
617 inode = read_one_inode(root, key->objectid);
618 if (!inode) {
619 ret = -EIO;
620 goto out;
621 }
622
623
624
625
626
627
628 ret = btrfs_lookup_file_extent(trans, root, path, btrfs_ino(inode),
629 start, 0);
630
631 if (ret == 0 &&
632 (found_type == BTRFS_FILE_EXTENT_REG ||
633 found_type == BTRFS_FILE_EXTENT_PREALLOC)) {
634 struct btrfs_file_extent_item cmp1;
635 struct btrfs_file_extent_item cmp2;
636 struct btrfs_file_extent_item *existing;
637 struct extent_buffer *leaf;
638
639 leaf = path->nodes[0];
640 existing = btrfs_item_ptr(leaf, path->slots[0],
641 struct btrfs_file_extent_item);
642
643 read_extent_buffer(eb, &cmp1, (unsigned long)item,
644 sizeof(cmp1));
645 read_extent_buffer(leaf, &cmp2, (unsigned long)existing,
646 sizeof(cmp2));
647
648
649
650
651
652 if (memcmp(&cmp1, &cmp2, sizeof(cmp1)) == 0) {
653 btrfs_release_path(path);
654 goto out;
655 }
656 }
657 btrfs_release_path(path);
658
659
660 ret = btrfs_drop_extents(trans, root, inode, start, extent_end, 1);
661 if (ret)
662 goto out;
663
664 if (found_type == BTRFS_FILE_EXTENT_REG ||
665 found_type == BTRFS_FILE_EXTENT_PREALLOC) {
666 u64 offset;
667 unsigned long dest_offset;
668 struct btrfs_key ins;
669
670 ret = btrfs_insert_empty_item(trans, root, path, key,
671 sizeof(*item));
672 if (ret)
673 goto out;
674 dest_offset = btrfs_item_ptr_offset(path->nodes[0],
675 path->slots[0]);
676 copy_extent_buffer(path->nodes[0], eb, dest_offset,
677 (unsigned long)item, sizeof(*item));
678
679 ins.objectid = btrfs_file_extent_disk_bytenr(eb, item);
680 ins.offset = btrfs_file_extent_disk_num_bytes(eb, item);
681 ins.type = BTRFS_EXTENT_ITEM_KEY;
682 offset = key->offset - btrfs_file_extent_offset(eb, item);
683
684
685
686
687
688
689
690
691
692 ret = btrfs_qgroup_insert_dirty_extent(trans, root->fs_info,
693 btrfs_file_extent_disk_bytenr(eb, item),
694 btrfs_file_extent_disk_num_bytes(eb, item),
695 GFP_NOFS);
696 if (ret < 0)
697 goto out;
698
699 if (ins.objectid > 0) {
700 u64 csum_start;
701 u64 csum_end;
702 LIST_HEAD(ordered_sums);
703
704
705
706
707 ret = btrfs_lookup_data_extent(root, ins.objectid,
708 ins.offset);
709 if (ret == 0) {
710 ret = btrfs_inc_extent_ref(trans, root,
711 ins.objectid, ins.offset,
712 0, root->root_key.objectid,
713 key->objectid, offset);
714 if (ret)
715 goto out;
716 } else {
717
718
719
720
721 ret = btrfs_alloc_logged_file_extent(trans,
722 root, root->root_key.objectid,
723 key->objectid, offset, &ins);
724 if (ret)
725 goto out;
726 }
727 btrfs_release_path(path);
728
729 if (btrfs_file_extent_compression(eb, item)) {
730 csum_start = ins.objectid;
731 csum_end = csum_start + ins.offset;
732 } else {
733 csum_start = ins.objectid +
734 btrfs_file_extent_offset(eb, item);
735 csum_end = csum_start +
736 btrfs_file_extent_num_bytes(eb, item);
737 }
738
739 ret = btrfs_lookup_csums_range(root->log_root,
740 csum_start, csum_end - 1,
741 &ordered_sums, 0);
742 if (ret)
743 goto out;
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793 while (!list_empty(&ordered_sums)) {
794 struct btrfs_ordered_sum *sums;
795 sums = list_entry(ordered_sums.next,
796 struct btrfs_ordered_sum,
797 list);
798 if (!ret)
799 ret = btrfs_del_csums(trans,
800 root->fs_info->csum_root,
801 sums->bytenr,
802 sums->len);
803 if (!ret)
804 ret = btrfs_csum_file_blocks(trans,
805 root->fs_info->csum_root,
806 sums);
807 list_del(&sums->list);
808 kfree(sums);
809 }
810 if (ret)
811 goto out;
812 } else {
813 btrfs_release_path(path);
814 }
815 } else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
816
817 ret = overwrite_item(trans, root, path, eb, slot, key);
818 if (ret)
819 goto out;
820 }
821
822 inode_add_bytes(inode, nbytes);
823 ret = btrfs_update_inode(trans, root, inode);
824out:
825 if (inode)
826 iput(inode);
827 return ret;
828}
829
830
831
832
833
834
835
836
837
838static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,
839 struct btrfs_root *root,
840 struct btrfs_path *path,
841 struct inode *dir,
842 struct btrfs_dir_item *di)
843{
844 struct inode *inode;
845 char *name;
846 int name_len;
847 struct extent_buffer *leaf;
848 struct btrfs_key location;
849 int ret;
850
851 leaf = path->nodes[0];
852
853 btrfs_dir_item_key_to_cpu(leaf, di, &location);
854 name_len = btrfs_dir_name_len(leaf, di);
855 name = kmalloc(name_len, GFP_NOFS);
856 if (!name)
857 return -ENOMEM;
858
859 read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len);
860 btrfs_release_path(path);
861
862 inode = read_one_inode(root, location.objectid);
863 if (!inode) {
864 ret = -EIO;
865 goto out;
866 }
867
868 ret = link_to_fixup_dir(trans, root, path, location.objectid);
869 if (ret)
870 goto out;
871
872 ret = btrfs_unlink_inode(trans, root, dir, inode, name, name_len);
873 if (ret)
874 goto out;
875 else
876 ret = btrfs_run_delayed_items(trans, root);
877out:
878 kfree(name);
879 iput(inode);
880 return ret;
881}
882
883
884
885
886
887
888static noinline int inode_in_dir(struct btrfs_root *root,
889 struct btrfs_path *path,
890 u64 dirid, u64 objectid, u64 index,
891 const char *name, int name_len)
892{
893 struct btrfs_dir_item *di;
894 struct btrfs_key location;
895 int match = 0;
896
897 di = btrfs_lookup_dir_index_item(NULL, root, path, dirid,
898 index, name, name_len, 0);
899 if (di && !IS_ERR(di)) {
900 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
901 if (location.objectid != objectid)
902 goto out;
903 } else
904 goto out;
905 btrfs_release_path(path);
906
907 di = btrfs_lookup_dir_item(NULL, root, path, dirid, name, name_len, 0);
908 if (di && !IS_ERR(di)) {
909 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
910 if (location.objectid != objectid)
911 goto out;
912 } else
913 goto out;
914 match = 1;
915out:
916 btrfs_release_path(path);
917 return match;
918}
919
920
921
922
923
924
925
926
927
928
929
930static noinline int backref_in_log(struct btrfs_root *log,
931 struct btrfs_key *key,
932 u64 ref_objectid,
933 const char *name, int namelen)
934{
935 struct btrfs_path *path;
936 struct btrfs_inode_ref *ref;
937 unsigned long ptr;
938 unsigned long ptr_end;
939 unsigned long name_ptr;
940 int found_name_len;
941 int item_size;
942 int ret;
943 int match = 0;
944
945 path = btrfs_alloc_path();
946 if (!path)
947 return -ENOMEM;
948
949 ret = btrfs_search_slot(NULL, log, key, path, 0, 0);
950 if (ret != 0)
951 goto out;
952
953 ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
954
955 if (key->type == BTRFS_INODE_EXTREF_KEY) {
956 if (btrfs_find_name_in_ext_backref(path, ref_objectid,
957 name, namelen, NULL))
958 match = 1;
959
960 goto out;
961 }
962
963 item_size = btrfs_item_size_nr(path->nodes[0], path->slots[0]);
964 ptr_end = ptr + item_size;
965 while (ptr < ptr_end) {
966 ref = (struct btrfs_inode_ref *)ptr;
967 found_name_len = btrfs_inode_ref_name_len(path->nodes[0], ref);
968 if (found_name_len == namelen) {
969 name_ptr = (unsigned long)(ref + 1);
970 ret = memcmp_extent_buffer(path->nodes[0], name,
971 name_ptr, namelen);
972 if (ret == 0) {
973 match = 1;
974 goto out;
975 }
976 }
977 ptr = (unsigned long)(ref + 1) + found_name_len;
978 }
979out:
980 btrfs_free_path(path);
981 return match;
982}
983
984static inline int __add_inode_ref(struct btrfs_trans_handle *trans,
985 struct btrfs_root *root,
986 struct btrfs_path *path,
987 struct btrfs_root *log_root,
988 struct inode *dir, struct inode *inode,
989 struct extent_buffer *eb,
990 u64 inode_objectid, u64 parent_objectid,
991 u64 ref_index, char *name, int namelen,
992 int *search_done)
993{
994 int ret;
995 char *victim_name;
996 int victim_name_len;
997 struct extent_buffer *leaf;
998 struct btrfs_dir_item *di;
999 struct btrfs_key search_key;
1000 struct btrfs_inode_extref *extref;
1001
1002again:
1003
1004 search_key.objectid = inode_objectid;
1005 search_key.type = BTRFS_INODE_REF_KEY;
1006 search_key.offset = parent_objectid;
1007 ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
1008 if (ret == 0) {
1009 struct btrfs_inode_ref *victim_ref;
1010 unsigned long ptr;
1011 unsigned long ptr_end;
1012
1013 leaf = path->nodes[0];
1014
1015
1016
1017
1018 if (search_key.objectid == search_key.offset)
1019 return 1;
1020
1021
1022
1023
1024
1025 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1026 ptr_end = ptr + btrfs_item_size_nr(leaf, path->slots[0]);
1027 while (ptr < ptr_end) {
1028 victim_ref = (struct btrfs_inode_ref *)ptr;
1029 victim_name_len = btrfs_inode_ref_name_len(leaf,
1030 victim_ref);
1031 victim_name = kmalloc(victim_name_len, GFP_NOFS);
1032 if (!victim_name)
1033 return -ENOMEM;
1034
1035 read_extent_buffer(leaf, victim_name,
1036 (unsigned long)(victim_ref + 1),
1037 victim_name_len);
1038
1039 if (!backref_in_log(log_root, &search_key,
1040 parent_objectid,
1041 victim_name,
1042 victim_name_len)) {
1043 inc_nlink(inode);
1044 btrfs_release_path(path);
1045
1046 ret = btrfs_unlink_inode(trans, root, dir,
1047 inode, victim_name,
1048 victim_name_len);
1049 kfree(victim_name);
1050 if (ret)
1051 return ret;
1052 ret = btrfs_run_delayed_items(trans, root);
1053 if (ret)
1054 return ret;
1055 *search_done = 1;
1056 goto again;
1057 }
1058 kfree(victim_name);
1059
1060 ptr = (unsigned long)(victim_ref + 1) + victim_name_len;
1061 }
1062
1063
1064
1065
1066
1067 *search_done = 1;
1068 }
1069 btrfs_release_path(path);
1070
1071
1072 extref = btrfs_lookup_inode_extref(NULL, root, path, name, namelen,
1073 inode_objectid, parent_objectid, 0,
1074 0);
1075 if (!IS_ERR_OR_NULL(extref)) {
1076 u32 item_size;
1077 u32 cur_offset = 0;
1078 unsigned long base;
1079 struct inode *victim_parent;
1080
1081 leaf = path->nodes[0];
1082
1083 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
1084 base = btrfs_item_ptr_offset(leaf, path->slots[0]);
1085
1086 while (cur_offset < item_size) {
1087 extref = (struct btrfs_inode_extref *)(base + cur_offset);
1088
1089 victim_name_len = btrfs_inode_extref_name_len(leaf, extref);
1090
1091 if (btrfs_inode_extref_parent(leaf, extref) != parent_objectid)
1092 goto next;
1093
1094 victim_name = kmalloc(victim_name_len, GFP_NOFS);
1095 if (!victim_name)
1096 return -ENOMEM;
1097 read_extent_buffer(leaf, victim_name, (unsigned long)&extref->name,
1098 victim_name_len);
1099
1100 search_key.objectid = inode_objectid;
1101 search_key.type = BTRFS_INODE_EXTREF_KEY;
1102 search_key.offset = btrfs_extref_hash(parent_objectid,
1103 victim_name,
1104 victim_name_len);
1105 ret = 0;
1106 if (!backref_in_log(log_root, &search_key,
1107 parent_objectid, victim_name,
1108 victim_name_len)) {
1109 ret = -ENOENT;
1110 victim_parent = read_one_inode(root,
1111 parent_objectid);
1112 if (victim_parent) {
1113 inc_nlink(inode);
1114 btrfs_release_path(path);
1115
1116 ret = btrfs_unlink_inode(trans, root,
1117 victim_parent,
1118 inode,
1119 victim_name,
1120 victim_name_len);
1121 if (!ret)
1122 ret = btrfs_run_delayed_items(
1123 trans, root);
1124 }
1125 iput(victim_parent);
1126 kfree(victim_name);
1127 if (ret)
1128 return ret;
1129 *search_done = 1;
1130 goto again;
1131 }
1132 kfree(victim_name);
1133 if (ret)
1134 return ret;
1135next:
1136 cur_offset += victim_name_len + sizeof(*extref);
1137 }
1138 *search_done = 1;
1139 }
1140 btrfs_release_path(path);
1141
1142
1143 di = btrfs_lookup_dir_index_item(trans, root, path, btrfs_ino(dir),
1144 ref_index, name, namelen, 0);
1145 if (di && !IS_ERR(di)) {
1146 ret = drop_one_dir_item(trans, root, path, dir, di);
1147 if (ret)
1148 return ret;
1149 }
1150 btrfs_release_path(path);
1151
1152
1153 di = btrfs_lookup_dir_item(trans, root, path, btrfs_ino(dir),
1154 name, namelen, 0);
1155 if (di && !IS_ERR(di)) {
1156 ret = drop_one_dir_item(trans, root, path, dir, di);
1157 if (ret)
1158 return ret;
1159 }
1160 btrfs_release_path(path);
1161
1162 return 0;
1163}
1164
1165static int extref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
1166 u32 *namelen, char **name, u64 *index,
1167 u64 *parent_objectid)
1168{
1169 struct btrfs_inode_extref *extref;
1170
1171 extref = (struct btrfs_inode_extref *)ref_ptr;
1172
1173 *namelen = btrfs_inode_extref_name_len(eb, extref);
1174 *name = kmalloc(*namelen, GFP_NOFS);
1175 if (*name == NULL)
1176 return -ENOMEM;
1177
1178 read_extent_buffer(eb, *name, (unsigned long)&extref->name,
1179 *namelen);
1180
1181 *index = btrfs_inode_extref_index(eb, extref);
1182 if (parent_objectid)
1183 *parent_objectid = btrfs_inode_extref_parent(eb, extref);
1184
1185 return 0;
1186}
1187
1188static int ref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
1189 u32 *namelen, char **name, u64 *index)
1190{
1191 struct btrfs_inode_ref *ref;
1192
1193 ref = (struct btrfs_inode_ref *)ref_ptr;
1194
1195 *namelen = btrfs_inode_ref_name_len(eb, ref);
1196 *name = kmalloc(*namelen, GFP_NOFS);
1197 if (*name == NULL)
1198 return -ENOMEM;
1199
1200 read_extent_buffer(eb, *name, (unsigned long)(ref + 1), *namelen);
1201
1202 *index = btrfs_inode_ref_index(eb, ref);
1203
1204 return 0;
1205}
1206
1207
1208
1209
1210
1211
1212
1213static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1214 struct btrfs_root *root,
1215 struct btrfs_root *log,
1216 struct btrfs_path *path,
1217 struct extent_buffer *eb, int slot,
1218 struct btrfs_key *key)
1219{
1220 struct inode *dir = NULL;
1221 struct inode *inode = NULL;
1222 unsigned long ref_ptr;
1223 unsigned long ref_end;
1224 char *name = NULL;
1225 int namelen;
1226 int ret;
1227 int search_done = 0;
1228 int log_ref_ver = 0;
1229 u64 parent_objectid;
1230 u64 inode_objectid;
1231 u64 ref_index = 0;
1232 int ref_struct_size;
1233
1234 ref_ptr = btrfs_item_ptr_offset(eb, slot);
1235 ref_end = ref_ptr + btrfs_item_size_nr(eb, slot);
1236
1237 if (key->type == BTRFS_INODE_EXTREF_KEY) {
1238 struct btrfs_inode_extref *r;
1239
1240 ref_struct_size = sizeof(struct btrfs_inode_extref);
1241 log_ref_ver = 1;
1242 r = (struct btrfs_inode_extref *)ref_ptr;
1243 parent_objectid = btrfs_inode_extref_parent(eb, r);
1244 } else {
1245 ref_struct_size = sizeof(struct btrfs_inode_ref);
1246 parent_objectid = key->offset;
1247 }
1248 inode_objectid = key->objectid;
1249
1250
1251
1252
1253
1254
1255
1256 dir = read_one_inode(root, parent_objectid);
1257 if (!dir) {
1258 ret = -ENOENT;
1259 goto out;
1260 }
1261
1262 inode = read_one_inode(root, inode_objectid);
1263 if (!inode) {
1264 ret = -EIO;
1265 goto out;
1266 }
1267
1268 while (ref_ptr < ref_end) {
1269 if (log_ref_ver) {
1270 ret = extref_get_fields(eb, ref_ptr, &namelen, &name,
1271 &ref_index, &parent_objectid);
1272
1273
1274
1275
1276 if (!dir)
1277 dir = read_one_inode(root, parent_objectid);
1278 if (!dir) {
1279 ret = -ENOENT;
1280 goto out;
1281 }
1282 } else {
1283 ret = ref_get_fields(eb, ref_ptr, &namelen, &name,
1284 &ref_index);
1285 }
1286 if (ret)
1287 goto out;
1288
1289
1290 if (!inode_in_dir(root, path, btrfs_ino(dir), btrfs_ino(inode),
1291 ref_index, name, namelen)) {
1292
1293
1294
1295
1296
1297
1298
1299
1300 if (!search_done) {
1301 ret = __add_inode_ref(trans, root, path, log,
1302 dir, inode, eb,
1303 inode_objectid,
1304 parent_objectid,
1305 ref_index, name, namelen,
1306 &search_done);
1307 if (ret) {
1308 if (ret == 1)
1309 ret = 0;
1310 goto out;
1311 }
1312 }
1313
1314
1315 ret = btrfs_add_link(trans, dir, inode, name, namelen,
1316 0, ref_index);
1317 if (ret)
1318 goto out;
1319
1320 btrfs_update_inode(trans, root, inode);
1321 }
1322
1323 ref_ptr = (unsigned long)(ref_ptr + ref_struct_size) + namelen;
1324 kfree(name);
1325 name = NULL;
1326 if (log_ref_ver) {
1327 iput(dir);
1328 dir = NULL;
1329 }
1330 }
1331
1332
1333 ret = overwrite_item(trans, root, path, eb, slot, key);
1334out:
1335 btrfs_release_path(path);
1336 kfree(name);
1337 iput(dir);
1338 iput(inode);
1339 return ret;
1340}
1341
1342static int insert_orphan_item(struct btrfs_trans_handle *trans,
1343 struct btrfs_root *root, u64 ino)
1344{
1345 int ret;
1346
1347 ret = btrfs_insert_orphan_item(trans, root, ino);
1348 if (ret == -EEXIST)
1349 ret = 0;
1350
1351 return ret;
1352}
1353
1354static int count_inode_extrefs(struct btrfs_root *root,
1355 struct inode *inode, struct btrfs_path *path)
1356{
1357 int ret = 0;
1358 int name_len;
1359 unsigned int nlink = 0;
1360 u32 item_size;
1361 u32 cur_offset = 0;
1362 u64 inode_objectid = btrfs_ino(inode);
1363 u64 offset = 0;
1364 unsigned long ptr;
1365 struct btrfs_inode_extref *extref;
1366 struct extent_buffer *leaf;
1367
1368 while (1) {
1369 ret = btrfs_find_one_extref(root, inode_objectid, offset, path,
1370 &extref, &offset);
1371 if (ret)
1372 break;
1373
1374 leaf = path->nodes[0];
1375 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
1376 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1377 cur_offset = 0;
1378
1379 while (cur_offset < item_size) {
1380 extref = (struct btrfs_inode_extref *) (ptr + cur_offset);
1381 name_len = btrfs_inode_extref_name_len(leaf, extref);
1382
1383 nlink++;
1384
1385 cur_offset += name_len + sizeof(*extref);
1386 }
1387
1388 offset++;
1389 btrfs_release_path(path);
1390 }
1391 btrfs_release_path(path);
1392
1393 if (ret < 0 && ret != -ENOENT)
1394 return ret;
1395 return nlink;
1396}
1397
1398static int count_inode_refs(struct btrfs_root *root,
1399 struct inode *inode, struct btrfs_path *path)
1400{
1401 int ret;
1402 struct btrfs_key key;
1403 unsigned int nlink = 0;
1404 unsigned long ptr;
1405 unsigned long ptr_end;
1406 int name_len;
1407 u64 ino = btrfs_ino(inode);
1408
1409 key.objectid = ino;
1410 key.type = BTRFS_INODE_REF_KEY;
1411 key.offset = (u64)-1;
1412
1413 while (1) {
1414 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1415 if (ret < 0)
1416 break;
1417 if (ret > 0) {
1418 if (path->slots[0] == 0)
1419 break;
1420 path->slots[0]--;
1421 }
1422process_slot:
1423 btrfs_item_key_to_cpu(path->nodes[0], &key,
1424 path->slots[0]);
1425 if (key.objectid != ino ||
1426 key.type != BTRFS_INODE_REF_KEY)
1427 break;
1428 ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
1429 ptr_end = ptr + btrfs_item_size_nr(path->nodes[0],
1430 path->slots[0]);
1431 while (ptr < ptr_end) {
1432 struct btrfs_inode_ref *ref;
1433
1434 ref = (struct btrfs_inode_ref *)ptr;
1435 name_len = btrfs_inode_ref_name_len(path->nodes[0],
1436 ref);
1437 ptr = (unsigned long)(ref + 1) + name_len;
1438 nlink++;
1439 }
1440
1441 if (key.offset == 0)
1442 break;
1443 if (path->slots[0] > 0) {
1444 path->slots[0]--;
1445 goto process_slot;
1446 }
1447 key.offset--;
1448 btrfs_release_path(path);
1449 }
1450 btrfs_release_path(path);
1451
1452 return nlink;
1453}
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans,
1466 struct btrfs_root *root,
1467 struct inode *inode)
1468{
1469 struct btrfs_path *path;
1470 int ret;
1471 u64 nlink = 0;
1472 u64 ino = btrfs_ino(inode);
1473
1474 path = btrfs_alloc_path();
1475 if (!path)
1476 return -ENOMEM;
1477
1478 ret = count_inode_refs(root, inode, path);
1479 if (ret < 0)
1480 goto out;
1481
1482 nlink = ret;
1483
1484 ret = count_inode_extrefs(root, inode, path);
1485 if (ret < 0)
1486 goto out;
1487
1488 nlink += ret;
1489
1490 ret = 0;
1491
1492 if (nlink != inode->i_nlink) {
1493 set_nlink(inode, nlink);
1494 btrfs_update_inode(trans, root, inode);
1495 }
1496 BTRFS_I(inode)->index_cnt = (u64)-1;
1497
1498 if (inode->i_nlink == 0) {
1499 if (S_ISDIR(inode->i_mode)) {
1500 ret = replay_dir_deletes(trans, root, NULL, path,
1501 ino, 1);
1502 if (ret)
1503 goto out;
1504 }
1505 ret = insert_orphan_item(trans, root, ino);
1506 }
1507
1508out:
1509 btrfs_free_path(path);
1510 return ret;
1511}
1512
1513static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
1514 struct btrfs_root *root,
1515 struct btrfs_path *path)
1516{
1517 int ret;
1518 struct btrfs_key key;
1519 struct inode *inode;
1520
1521 key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
1522 key.type = BTRFS_ORPHAN_ITEM_KEY;
1523 key.offset = (u64)-1;
1524 while (1) {
1525 ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
1526 if (ret < 0)
1527 break;
1528
1529 if (ret == 1) {
1530 if (path->slots[0] == 0)
1531 break;
1532 path->slots[0]--;
1533 }
1534
1535 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1536 if (key.objectid != BTRFS_TREE_LOG_FIXUP_OBJECTID ||
1537 key.type != BTRFS_ORPHAN_ITEM_KEY)
1538 break;
1539
1540 ret = btrfs_del_item(trans, root, path);
1541 if (ret)
1542 goto out;
1543
1544 btrfs_release_path(path);
1545 inode = read_one_inode(root, key.offset);
1546 if (!inode)
1547 return -EIO;
1548
1549 ret = fixup_inode_link_count(trans, root, inode);
1550 iput(inode);
1551 if (ret)
1552 goto out;
1553
1554
1555
1556
1557
1558
1559 key.offset = (u64)-1;
1560 }
1561 ret = 0;
1562out:
1563 btrfs_release_path(path);
1564 return ret;
1565}
1566
1567
1568
1569
1570
1571
1572
1573static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
1574 struct btrfs_root *root,
1575 struct btrfs_path *path,
1576 u64 objectid)
1577{
1578 struct btrfs_key key;
1579 int ret = 0;
1580 struct inode *inode;
1581
1582 inode = read_one_inode(root, objectid);
1583 if (!inode)
1584 return -EIO;
1585
1586 key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
1587 key.type = BTRFS_ORPHAN_ITEM_KEY;
1588 key.offset = objectid;
1589
1590 ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
1591
1592 btrfs_release_path(path);
1593 if (ret == 0) {
1594 if (!inode->i_nlink)
1595 set_nlink(inode, 1);
1596 else
1597 inc_nlink(inode);
1598 ret = btrfs_update_inode(trans, root, inode);
1599 } else if (ret == -EEXIST) {
1600 ret = 0;
1601 } else {
1602 BUG();
1603 }
1604 iput(inode);
1605
1606 return ret;
1607}
1608
1609
1610
1611
1612
1613
1614static noinline int insert_one_name(struct btrfs_trans_handle *trans,
1615 struct btrfs_root *root,
1616 u64 dirid, u64 index,
1617 char *name, int name_len,
1618 struct btrfs_key *location)
1619{
1620 struct inode *inode;
1621 struct inode *dir;
1622 int ret;
1623
1624 inode = read_one_inode(root, location->objectid);
1625 if (!inode)
1626 return -ENOENT;
1627
1628 dir = read_one_inode(root, dirid);
1629 if (!dir) {
1630 iput(inode);
1631 return -EIO;
1632 }
1633
1634 ret = btrfs_add_link(trans, dir, inode, name, name_len, 1, index);
1635
1636
1637
1638 iput(inode);
1639 iput(dir);
1640 return ret;
1641}
1642
1643
1644
1645
1646
1647static bool name_in_log_ref(struct btrfs_root *log_root,
1648 const char *name, const int name_len,
1649 const u64 dirid, const u64 ino)
1650{
1651 struct btrfs_key search_key;
1652
1653 search_key.objectid = ino;
1654 search_key.type = BTRFS_INODE_REF_KEY;
1655 search_key.offset = dirid;
1656 if (backref_in_log(log_root, &search_key, dirid, name, name_len))
1657 return true;
1658
1659 search_key.type = BTRFS_INODE_EXTREF_KEY;
1660 search_key.offset = btrfs_extref_hash(dirid, name, name_len);
1661 if (backref_in_log(log_root, &search_key, dirid, name, name_len))
1662 return true;
1663
1664 return false;
1665}
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683static noinline int replay_one_name(struct btrfs_trans_handle *trans,
1684 struct btrfs_root *root,
1685 struct btrfs_path *path,
1686 struct extent_buffer *eb,
1687 struct btrfs_dir_item *di,
1688 struct btrfs_key *key)
1689{
1690 char *name;
1691 int name_len;
1692 struct btrfs_dir_item *dst_di;
1693 struct btrfs_key found_key;
1694 struct btrfs_key log_key;
1695 struct inode *dir;
1696 u8 log_type;
1697 int exists;
1698 int ret = 0;
1699 bool update_size = (key->type == BTRFS_DIR_INDEX_KEY);
1700 bool name_added = false;
1701
1702 dir = read_one_inode(root, key->objectid);
1703 if (!dir)
1704 return -EIO;
1705
1706 name_len = btrfs_dir_name_len(eb, di);
1707 name = kmalloc(name_len, GFP_NOFS);
1708 if (!name) {
1709 ret = -ENOMEM;
1710 goto out;
1711 }
1712
1713 log_type = btrfs_dir_type(eb, di);
1714 read_extent_buffer(eb, name, (unsigned long)(di + 1),
1715 name_len);
1716
1717 btrfs_dir_item_key_to_cpu(eb, di, &log_key);
1718 exists = btrfs_lookup_inode(trans, root, path, &log_key, 0);
1719 if (exists == 0)
1720 exists = 1;
1721 else
1722 exists = 0;
1723 btrfs_release_path(path);
1724
1725 if (key->type == BTRFS_DIR_ITEM_KEY) {
1726 dst_di = btrfs_lookup_dir_item(trans, root, path, key->objectid,
1727 name, name_len, 1);
1728 } else if (key->type == BTRFS_DIR_INDEX_KEY) {
1729 dst_di = btrfs_lookup_dir_index_item(trans, root, path,
1730 key->objectid,
1731 key->offset, name,
1732 name_len, 1);
1733 } else {
1734
1735 ret = -EINVAL;
1736 goto out;
1737 }
1738 if (IS_ERR_OR_NULL(dst_di)) {
1739
1740
1741
1742 if (key->type != BTRFS_DIR_INDEX_KEY)
1743 goto out;
1744 goto insert;
1745 }
1746
1747 btrfs_dir_item_key_to_cpu(path->nodes[0], dst_di, &found_key);
1748
1749 if (found_key.objectid == log_key.objectid &&
1750 found_key.type == log_key.type &&
1751 found_key.offset == log_key.offset &&
1752 btrfs_dir_type(path->nodes[0], dst_di) == log_type) {
1753 update_size = false;
1754 goto out;
1755 }
1756
1757
1758
1759
1760
1761 if (!exists)
1762 goto out;
1763
1764 ret = drop_one_dir_item(trans, root, path, dir, dst_di);
1765 if (ret)
1766 goto out;
1767
1768 if (key->type == BTRFS_DIR_INDEX_KEY)
1769 goto insert;
1770out:
1771 btrfs_release_path(path);
1772 if (!ret && update_size) {
1773 btrfs_i_size_write(dir, dir->i_size + name_len * 2);
1774 ret = btrfs_update_inode(trans, root, dir);
1775 }
1776 kfree(name);
1777 iput(dir);
1778 if (!ret && name_added)
1779 ret = 1;
1780 return ret;
1781
1782insert:
1783 if (name_in_log_ref(root->log_root, name, name_len,
1784 key->objectid, log_key.objectid)) {
1785
1786 ret = 0;
1787 update_size = false;
1788 goto out;
1789 }
1790 btrfs_release_path(path);
1791 ret = insert_one_name(trans, root, key->objectid, key->offset,
1792 name, name_len, &log_key);
1793 if (ret && ret != -ENOENT && ret != -EEXIST)
1794 goto out;
1795 if (!ret)
1796 name_added = true;
1797 update_size = false;
1798 ret = 0;
1799 goto out;
1800}
1801
1802
1803
1804
1805
1806
1807
1808static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans,
1809 struct btrfs_root *root,
1810 struct btrfs_path *path,
1811 struct extent_buffer *eb, int slot,
1812 struct btrfs_key *key)
1813{
1814 int ret = 0;
1815 u32 item_size = btrfs_item_size_nr(eb, slot);
1816 struct btrfs_dir_item *di;
1817 int name_len;
1818 unsigned long ptr;
1819 unsigned long ptr_end;
1820 struct btrfs_path *fixup_path = NULL;
1821
1822 ptr = btrfs_item_ptr_offset(eb, slot);
1823 ptr_end = ptr + item_size;
1824 while (ptr < ptr_end) {
1825 di = (struct btrfs_dir_item *)ptr;
1826 if (verify_dir_item(root, eb, di))
1827 return -EIO;
1828 name_len = btrfs_dir_name_len(eb, di);
1829 ret = replay_one_name(trans, root, path, eb, di, key);
1830 if (ret < 0)
1831 break;
1832 ptr = (unsigned long)(di + 1);
1833 ptr += name_len;
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862 if (ret == 1 && btrfs_dir_type(eb, di) != BTRFS_FT_DIR) {
1863 struct btrfs_key di_key;
1864
1865 if (!fixup_path) {
1866 fixup_path = btrfs_alloc_path();
1867 if (!fixup_path) {
1868 ret = -ENOMEM;
1869 break;
1870 }
1871 }
1872
1873 btrfs_dir_item_key_to_cpu(eb, di, &di_key);
1874 ret = link_to_fixup_dir(trans, root, fixup_path,
1875 di_key.objectid);
1876 if (ret)
1877 break;
1878 }
1879 ret = 0;
1880 }
1881 btrfs_free_path(fixup_path);
1882 return ret;
1883}
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896static noinline int find_dir_range(struct btrfs_root *root,
1897 struct btrfs_path *path,
1898 u64 dirid, int key_type,
1899 u64 *start_ret, u64 *end_ret)
1900{
1901 struct btrfs_key key;
1902 u64 found_end;
1903 struct btrfs_dir_log_item *item;
1904 int ret;
1905 int nritems;
1906
1907 if (*start_ret == (u64)-1)
1908 return 1;
1909
1910 key.objectid = dirid;
1911 key.type = key_type;
1912 key.offset = *start_ret;
1913
1914 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1915 if (ret < 0)
1916 goto out;
1917 if (ret > 0) {
1918 if (path->slots[0] == 0)
1919 goto out;
1920 path->slots[0]--;
1921 }
1922 if (ret != 0)
1923 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1924
1925 if (key.type != key_type || key.objectid != dirid) {
1926 ret = 1;
1927 goto next;
1928 }
1929 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
1930 struct btrfs_dir_log_item);
1931 found_end = btrfs_dir_log_end(path->nodes[0], item);
1932
1933 if (*start_ret >= key.offset && *start_ret <= found_end) {
1934 ret = 0;
1935 *start_ret = key.offset;
1936 *end_ret = found_end;
1937 goto out;
1938 }
1939 ret = 1;
1940next:
1941
1942 nritems = btrfs_header_nritems(path->nodes[0]);
1943 if (path->slots[0] >= nritems) {
1944 ret = btrfs_next_leaf(root, path);
1945 if (ret)
1946 goto out;
1947 } else {
1948 path->slots[0]++;
1949 }
1950
1951 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1952
1953 if (key.type != key_type || key.objectid != dirid) {
1954 ret = 1;
1955 goto out;
1956 }
1957 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
1958 struct btrfs_dir_log_item);
1959 found_end = btrfs_dir_log_end(path->nodes[0], item);
1960 *start_ret = key.offset;
1961 *end_ret = found_end;
1962 ret = 0;
1963out:
1964 btrfs_release_path(path);
1965 return ret;
1966}
1967
1968
1969
1970
1971
1972
1973static noinline int check_item_in_log(struct btrfs_trans_handle *trans,
1974 struct btrfs_root *root,
1975 struct btrfs_root *log,
1976 struct btrfs_path *path,
1977 struct btrfs_path *log_path,
1978 struct inode *dir,
1979 struct btrfs_key *dir_key)
1980{
1981 int ret;
1982 struct extent_buffer *eb;
1983 int slot;
1984 u32 item_size;
1985 struct btrfs_dir_item *di;
1986 struct btrfs_dir_item *log_di;
1987 int name_len;
1988 unsigned long ptr;
1989 unsigned long ptr_end;
1990 char *name;
1991 struct inode *inode;
1992 struct btrfs_key location;
1993
1994again:
1995 eb = path->nodes[0];
1996 slot = path->slots[0];
1997 item_size = btrfs_item_size_nr(eb, slot);
1998 ptr = btrfs_item_ptr_offset(eb, slot);
1999 ptr_end = ptr + item_size;
2000 while (ptr < ptr_end) {
2001 di = (struct btrfs_dir_item *)ptr;
2002 if (verify_dir_item(root, eb, di)) {
2003 ret = -EIO;
2004 goto out;
2005 }
2006
2007 name_len = btrfs_dir_name_len(eb, di);
2008 name = kmalloc(name_len, GFP_NOFS);
2009 if (!name) {
2010 ret = -ENOMEM;
2011 goto out;
2012 }
2013 read_extent_buffer(eb, name, (unsigned long)(di + 1),
2014 name_len);
2015 log_di = NULL;
2016 if (log && dir_key->type == BTRFS_DIR_ITEM_KEY) {
2017 log_di = btrfs_lookup_dir_item(trans, log, log_path,
2018 dir_key->objectid,
2019 name, name_len, 0);
2020 } else if (log && dir_key->type == BTRFS_DIR_INDEX_KEY) {
2021 log_di = btrfs_lookup_dir_index_item(trans, log,
2022 log_path,
2023 dir_key->objectid,
2024 dir_key->offset,
2025 name, name_len, 0);
2026 }
2027 if (!log_di || (IS_ERR(log_di) && PTR_ERR(log_di) == -ENOENT)) {
2028 btrfs_dir_item_key_to_cpu(eb, di, &location);
2029 btrfs_release_path(path);
2030 btrfs_release_path(log_path);
2031 inode = read_one_inode(root, location.objectid);
2032 if (!inode) {
2033 kfree(name);
2034 return -EIO;
2035 }
2036
2037 ret = link_to_fixup_dir(trans, root,
2038 path, location.objectid);
2039 if (ret) {
2040 kfree(name);
2041 iput(inode);
2042 goto out;
2043 }
2044
2045 inc_nlink(inode);
2046 ret = btrfs_unlink_inode(trans, root, dir, inode,
2047 name, name_len);
2048 if (!ret)
2049 ret = btrfs_run_delayed_items(trans, root);
2050 kfree(name);
2051 iput(inode);
2052 if (ret)
2053 goto out;
2054
2055
2056
2057
2058 ret = btrfs_search_slot(NULL, root, dir_key, path,
2059 0, 0);
2060 if (ret == 0)
2061 goto again;
2062 ret = 0;
2063 goto out;
2064 } else if (IS_ERR(log_di)) {
2065 kfree(name);
2066 return PTR_ERR(log_di);
2067 }
2068 btrfs_release_path(log_path);
2069 kfree(name);
2070
2071 ptr = (unsigned long)(di + 1);
2072 ptr += name_len;
2073 }
2074 ret = 0;
2075out:
2076 btrfs_release_path(path);
2077 btrfs_release_path(log_path);
2078 return ret;
2079}
2080
2081static int replay_xattr_deletes(struct btrfs_trans_handle *trans,
2082 struct btrfs_root *root,
2083 struct btrfs_root *log,
2084 struct btrfs_path *path,
2085 const u64 ino)
2086{
2087 struct btrfs_key search_key;
2088 struct btrfs_path *log_path;
2089 int i;
2090 int nritems;
2091 int ret;
2092
2093 log_path = btrfs_alloc_path();
2094 if (!log_path)
2095 return -ENOMEM;
2096
2097 search_key.objectid = ino;
2098 search_key.type = BTRFS_XATTR_ITEM_KEY;
2099 search_key.offset = 0;
2100again:
2101 ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
2102 if (ret < 0)
2103 goto out;
2104process_leaf:
2105 nritems = btrfs_header_nritems(path->nodes[0]);
2106 for (i = path->slots[0]; i < nritems; i++) {
2107 struct btrfs_key key;
2108 struct btrfs_dir_item *di;
2109 struct btrfs_dir_item *log_di;
2110 u32 total_size;
2111 u32 cur;
2112
2113 btrfs_item_key_to_cpu(path->nodes[0], &key, i);
2114 if (key.objectid != ino || key.type != BTRFS_XATTR_ITEM_KEY) {
2115 ret = 0;
2116 goto out;
2117 }
2118
2119 di = btrfs_item_ptr(path->nodes[0], i, struct btrfs_dir_item);
2120 total_size = btrfs_item_size_nr(path->nodes[0], i);
2121 cur = 0;
2122 while (cur < total_size) {
2123 u16 name_len = btrfs_dir_name_len(path->nodes[0], di);
2124 u16 data_len = btrfs_dir_data_len(path->nodes[0], di);
2125 u32 this_len = sizeof(*di) + name_len + data_len;
2126 char *name;
2127
2128 name = kmalloc(name_len, GFP_NOFS);
2129 if (!name) {
2130 ret = -ENOMEM;
2131 goto out;
2132 }
2133 read_extent_buffer(path->nodes[0], name,
2134 (unsigned long)(di + 1), name_len);
2135
2136 log_di = btrfs_lookup_xattr(NULL, log, log_path, ino,
2137 name, name_len, 0);
2138 btrfs_release_path(log_path);
2139 if (!log_di) {
2140
2141 btrfs_release_path(path);
2142 di = btrfs_lookup_xattr(trans, root, path, ino,
2143 name, name_len, -1);
2144 kfree(name);
2145 if (IS_ERR(di)) {
2146 ret = PTR_ERR(di);
2147 goto out;
2148 }
2149 ASSERT(di);
2150 ret = btrfs_delete_one_dir_name(trans, root,
2151 path, di);
2152 if (ret)
2153 goto out;
2154 btrfs_release_path(path);
2155 search_key = key;
2156 goto again;
2157 }
2158 kfree(name);
2159 if (IS_ERR(log_di)) {
2160 ret = PTR_ERR(log_di);
2161 goto out;
2162 }
2163 cur += this_len;
2164 di = (struct btrfs_dir_item *)((char *)di + this_len);
2165 }
2166 }
2167 ret = btrfs_next_leaf(root, path);
2168 if (ret > 0)
2169 ret = 0;
2170 else if (ret == 0)
2171 goto process_leaf;
2172out:
2173 btrfs_free_path(log_path);
2174 btrfs_release_path(path);
2175 return ret;
2176}
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
2190 struct btrfs_root *root,
2191 struct btrfs_root *log,
2192 struct btrfs_path *path,
2193 u64 dirid, int del_all)
2194{
2195 u64 range_start;
2196 u64 range_end;
2197 int key_type = BTRFS_DIR_LOG_ITEM_KEY;
2198 int ret = 0;
2199 struct btrfs_key dir_key;
2200 struct btrfs_key found_key;
2201 struct btrfs_path *log_path;
2202 struct inode *dir;
2203
2204 dir_key.objectid = dirid;
2205 dir_key.type = BTRFS_DIR_ITEM_KEY;
2206 log_path = btrfs_alloc_path();
2207 if (!log_path)
2208 return -ENOMEM;
2209
2210 dir = read_one_inode(root, dirid);
2211
2212
2213
2214
2215 if (!dir) {
2216 btrfs_free_path(log_path);
2217 return 0;
2218 }
2219again:
2220 range_start = 0;
2221 range_end = 0;
2222 while (1) {
2223 if (del_all)
2224 range_end = (u64)-1;
2225 else {
2226 ret = find_dir_range(log, path, dirid, key_type,
2227 &range_start, &range_end);
2228 if (ret != 0)
2229 break;
2230 }
2231
2232 dir_key.offset = range_start;
2233 while (1) {
2234 int nritems;
2235 ret = btrfs_search_slot(NULL, root, &dir_key, path,
2236 0, 0);
2237 if (ret < 0)
2238 goto out;
2239
2240 nritems = btrfs_header_nritems(path->nodes[0]);
2241 if (path->slots[0] >= nritems) {
2242 ret = btrfs_next_leaf(root, path);
2243 if (ret)
2244 break;
2245 }
2246 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
2247 path->slots[0]);
2248 if (found_key.objectid != dirid ||
2249 found_key.type != dir_key.type)
2250 goto next_type;
2251
2252 if (found_key.offset > range_end)
2253 break;
2254
2255 ret = check_item_in_log(trans, root, log, path,
2256 log_path, dir,
2257 &found_key);
2258 if (ret)
2259 goto out;
2260 if (found_key.offset == (u64)-1)
2261 break;
2262 dir_key.offset = found_key.offset + 1;
2263 }
2264 btrfs_release_path(path);
2265 if (range_end == (u64)-1)
2266 break;
2267 range_start = range_end + 1;
2268 }
2269
2270next_type:
2271 ret = 0;
2272 if (key_type == BTRFS_DIR_LOG_ITEM_KEY) {
2273 key_type = BTRFS_DIR_LOG_INDEX_KEY;
2274 dir_key.type = BTRFS_DIR_INDEX_KEY;
2275 btrfs_release_path(path);
2276 goto again;
2277 }
2278out:
2279 btrfs_release_path(path);
2280 btrfs_free_path(log_path);
2281 iput(dir);
2282 return ret;
2283}
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb,
2297 struct walk_control *wc, u64 gen)
2298{
2299 int nritems;
2300 struct btrfs_path *path;
2301 struct btrfs_root *root = wc->replay_dest;
2302 struct btrfs_key key;
2303 int level;
2304 int i;
2305 int ret;
2306
2307 ret = btrfs_read_buffer(eb, gen);
2308 if (ret)
2309 return ret;
2310
2311 level = btrfs_header_level(eb);
2312
2313 if (level != 0)
2314 return 0;
2315
2316 path = btrfs_alloc_path();
2317 if (!path)
2318 return -ENOMEM;
2319
2320 nritems = btrfs_header_nritems(eb);
2321 for (i = 0; i < nritems; i++) {
2322 btrfs_item_key_to_cpu(eb, &key, i);
2323
2324
2325 if (key.type == BTRFS_INODE_ITEM_KEY &&
2326 wc->stage == LOG_WALK_REPLAY_INODES) {
2327 struct btrfs_inode_item *inode_item;
2328 u32 mode;
2329
2330 inode_item = btrfs_item_ptr(eb, i,
2331 struct btrfs_inode_item);
2332 ret = replay_xattr_deletes(wc->trans, root, log,
2333 path, key.objectid);
2334 if (ret)
2335 break;
2336 mode = btrfs_inode_mode(eb, inode_item);
2337 if (S_ISDIR(mode)) {
2338 ret = replay_dir_deletes(wc->trans,
2339 root, log, path, key.objectid, 0);
2340 if (ret)
2341 break;
2342 }
2343 ret = overwrite_item(wc->trans, root, path,
2344 eb, i, &key);
2345 if (ret)
2346 break;
2347
2348
2349
2350
2351
2352 if (S_ISREG(mode)) {
2353 ret = insert_orphan_item(wc->trans, root,
2354 key.objectid);
2355 if (ret)
2356 break;
2357 }
2358
2359 ret = link_to_fixup_dir(wc->trans, root,
2360 path, key.objectid);
2361 if (ret)
2362 break;
2363 }
2364
2365 if (key.type == BTRFS_DIR_INDEX_KEY &&
2366 wc->stage == LOG_WALK_REPLAY_DIR_INDEX) {
2367 ret = replay_one_dir_item(wc->trans, root, path,
2368 eb, i, &key);
2369 if (ret)
2370 break;
2371 }
2372
2373 if (wc->stage < LOG_WALK_REPLAY_ALL)
2374 continue;
2375
2376
2377 if (key.type == BTRFS_XATTR_ITEM_KEY) {
2378 ret = overwrite_item(wc->trans, root, path,
2379 eb, i, &key);
2380 if (ret)
2381 break;
2382 } else if (key.type == BTRFS_INODE_REF_KEY ||
2383 key.type == BTRFS_INODE_EXTREF_KEY) {
2384 ret = add_inode_ref(wc->trans, root, log, path,
2385 eb, i, &key);
2386 if (ret && ret != -ENOENT)
2387 break;
2388 ret = 0;
2389 } else if (key.type == BTRFS_EXTENT_DATA_KEY) {
2390 ret = replay_one_extent(wc->trans, root, path,
2391 eb, i, &key);
2392 if (ret)
2393 break;
2394 } else if (key.type == BTRFS_DIR_ITEM_KEY) {
2395 ret = replay_one_dir_item(wc->trans, root, path,
2396 eb, i, &key);
2397 if (ret)
2398 break;
2399 }
2400 }
2401 btrfs_free_path(path);
2402 return ret;
2403}
2404
2405static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
2406 struct btrfs_root *root,
2407 struct btrfs_path *path, int *level,
2408 struct walk_control *wc)
2409{
2410 u64 root_owner;
2411 u64 bytenr;
2412 u64 ptr_gen;
2413 struct extent_buffer *next;
2414 struct extent_buffer *cur;
2415 struct extent_buffer *parent;
2416 u32 blocksize;
2417 int ret = 0;
2418
2419 WARN_ON(*level < 0);
2420 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2421
2422 while (*level > 0) {
2423 WARN_ON(*level < 0);
2424 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2425 cur = path->nodes[*level];
2426
2427 WARN_ON(btrfs_header_level(cur) != *level);
2428
2429 if (path->slots[*level] >=
2430 btrfs_header_nritems(cur))
2431 break;
2432
2433 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
2434 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
2435 blocksize = root->nodesize;
2436
2437 parent = path->nodes[*level];
2438 root_owner = btrfs_header_owner(parent);
2439
2440 next = btrfs_find_create_tree_block(root, bytenr);
2441 if (IS_ERR(next))
2442 return PTR_ERR(next);
2443
2444 if (*level == 1) {
2445 ret = wc->process_func(root, next, wc, ptr_gen);
2446 if (ret) {
2447 free_extent_buffer(next);
2448 return ret;
2449 }
2450
2451 path->slots[*level]++;
2452 if (wc->free) {
2453 ret = btrfs_read_buffer(next, ptr_gen);
2454 if (ret) {
2455 free_extent_buffer(next);
2456 return ret;
2457 }
2458
2459 if (trans) {
2460 btrfs_tree_lock(next);
2461 btrfs_set_lock_blocking(next);
2462 clean_tree_block(trans, root->fs_info,
2463 next);
2464 btrfs_wait_tree_block_writeback(next);
2465 btrfs_tree_unlock(next);
2466 }
2467
2468 WARN_ON(root_owner !=
2469 BTRFS_TREE_LOG_OBJECTID);
2470 ret = btrfs_free_and_pin_reserved_extent(root,
2471 bytenr, blocksize);
2472 if (ret) {
2473 free_extent_buffer(next);
2474 return ret;
2475 }
2476 }
2477 free_extent_buffer(next);
2478 continue;
2479 }
2480 ret = btrfs_read_buffer(next, ptr_gen);
2481 if (ret) {
2482 free_extent_buffer(next);
2483 return ret;
2484 }
2485
2486 WARN_ON(*level <= 0);
2487 if (path->nodes[*level-1])
2488 free_extent_buffer(path->nodes[*level-1]);
2489 path->nodes[*level-1] = next;
2490 *level = btrfs_header_level(next);
2491 path->slots[*level] = 0;
2492 cond_resched();
2493 }
2494 WARN_ON(*level < 0);
2495 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2496
2497 path->slots[*level] = btrfs_header_nritems(path->nodes[*level]);
2498
2499 cond_resched();
2500 return 0;
2501}
2502
2503static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans,
2504 struct btrfs_root *root,
2505 struct btrfs_path *path, int *level,
2506 struct walk_control *wc)
2507{
2508 u64 root_owner;
2509 int i;
2510 int slot;
2511 int ret;
2512
2513 for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
2514 slot = path->slots[i];
2515 if (slot + 1 < btrfs_header_nritems(path->nodes[i])) {
2516 path->slots[i]++;
2517 *level = i;
2518 WARN_ON(*level == 0);
2519 return 0;
2520 } else {
2521 struct extent_buffer *parent;
2522 if (path->nodes[*level] == root->node)
2523 parent = path->nodes[*level];
2524 else
2525 parent = path->nodes[*level + 1];
2526
2527 root_owner = btrfs_header_owner(parent);
2528 ret = wc->process_func(root, path->nodes[*level], wc,
2529 btrfs_header_generation(path->nodes[*level]));
2530 if (ret)
2531 return ret;
2532
2533 if (wc->free) {
2534 struct extent_buffer *next;
2535
2536 next = path->nodes[*level];
2537
2538 if (trans) {
2539 btrfs_tree_lock(next);
2540 btrfs_set_lock_blocking(next);
2541 clean_tree_block(trans, root->fs_info,
2542 next);
2543 btrfs_wait_tree_block_writeback(next);
2544 btrfs_tree_unlock(next);
2545 }
2546
2547 WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
2548 ret = btrfs_free_and_pin_reserved_extent(root,
2549 path->nodes[*level]->start,
2550 path->nodes[*level]->len);
2551 if (ret)
2552 return ret;
2553 }
2554 free_extent_buffer(path->nodes[*level]);
2555 path->nodes[*level] = NULL;
2556 *level = i + 1;
2557 }
2558 }
2559 return 1;
2560}
2561
2562
2563
2564
2565
2566
2567static int walk_log_tree(struct btrfs_trans_handle *trans,
2568 struct btrfs_root *log, struct walk_control *wc)
2569{
2570 int ret = 0;
2571 int wret;
2572 int level;
2573 struct btrfs_path *path;
2574 int orig_level;
2575
2576 path = btrfs_alloc_path();
2577 if (!path)
2578 return -ENOMEM;
2579
2580 level = btrfs_header_level(log->node);
2581 orig_level = level;
2582 path->nodes[level] = log->node;
2583 extent_buffer_get(log->node);
2584 path->slots[level] = 0;
2585
2586 while (1) {
2587 wret = walk_down_log_tree(trans, log, path, &level, wc);
2588 if (wret > 0)
2589 break;
2590 if (wret < 0) {
2591 ret = wret;
2592 goto out;
2593 }
2594
2595 wret = walk_up_log_tree(trans, log, path, &level, wc);
2596 if (wret > 0)
2597 break;
2598 if (wret < 0) {
2599 ret = wret;
2600 goto out;
2601 }
2602 }
2603
2604
2605 if (path->nodes[orig_level]) {
2606 ret = wc->process_func(log, path->nodes[orig_level], wc,
2607 btrfs_header_generation(path->nodes[orig_level]));
2608 if (ret)
2609 goto out;
2610 if (wc->free) {
2611 struct extent_buffer *next;
2612
2613 next = path->nodes[orig_level];
2614
2615 if (trans) {
2616 btrfs_tree_lock(next);
2617 btrfs_set_lock_blocking(next);
2618 clean_tree_block(trans, log->fs_info, next);
2619 btrfs_wait_tree_block_writeback(next);
2620 btrfs_tree_unlock(next);
2621 }
2622
2623 WARN_ON(log->root_key.objectid !=
2624 BTRFS_TREE_LOG_OBJECTID);
2625 ret = btrfs_free_and_pin_reserved_extent(log, next->start,
2626 next->len);
2627 if (ret)
2628 goto out;
2629 }
2630 }
2631
2632out:
2633 btrfs_free_path(path);
2634 return ret;
2635}
2636
2637
2638
2639
2640
2641static int update_log_root(struct btrfs_trans_handle *trans,
2642 struct btrfs_root *log)
2643{
2644 int ret;
2645
2646 if (log->log_transid == 1) {
2647
2648 ret = btrfs_insert_root(trans, log->fs_info->log_root_tree,
2649 &log->root_key, &log->root_item);
2650 } else {
2651 ret = btrfs_update_root(trans, log->fs_info->log_root_tree,
2652 &log->root_key, &log->root_item);
2653 }
2654 return ret;
2655}
2656
2657static void wait_log_commit(struct btrfs_root *root, int transid)
2658{
2659 DEFINE_WAIT(wait);
2660 int index = transid % 2;
2661
2662
2663
2664
2665
2666
2667 do {
2668 prepare_to_wait(&root->log_commit_wait[index],
2669 &wait, TASK_UNINTERRUPTIBLE);
2670 mutex_unlock(&root->log_mutex);
2671
2672 if (root->log_transid_committed < transid &&
2673 atomic_read(&root->log_commit[index]))
2674 schedule();
2675
2676 finish_wait(&root->log_commit_wait[index], &wait);
2677 mutex_lock(&root->log_mutex);
2678 } while (root->log_transid_committed < transid &&
2679 atomic_read(&root->log_commit[index]));
2680}
2681
2682static void wait_for_writer(struct btrfs_root *root)
2683{
2684 DEFINE_WAIT(wait);
2685
2686 while (atomic_read(&root->log_writers)) {
2687 prepare_to_wait(&root->log_writer_wait,
2688 &wait, TASK_UNINTERRUPTIBLE);
2689 mutex_unlock(&root->log_mutex);
2690 if (atomic_read(&root->log_writers))
2691 schedule();
2692 finish_wait(&root->log_writer_wait, &wait);
2693 mutex_lock(&root->log_mutex);
2694 }
2695}
2696
2697static inline void btrfs_remove_log_ctx(struct btrfs_root *root,
2698 struct btrfs_log_ctx *ctx)
2699{
2700 if (!ctx)
2701 return;
2702
2703 mutex_lock(&root->log_mutex);
2704 list_del_init(&ctx->list);
2705 mutex_unlock(&root->log_mutex);
2706}
2707
2708
2709
2710
2711
2712static inline void btrfs_remove_all_log_ctxs(struct btrfs_root *root,
2713 int index, int error)
2714{
2715 struct btrfs_log_ctx *ctx;
2716 struct btrfs_log_ctx *safe;
2717
2718 list_for_each_entry_safe(ctx, safe, &root->log_ctxs[index], list) {
2719 list_del_init(&ctx->list);
2720 ctx->log_ret = error;
2721 }
2722
2723 INIT_LIST_HEAD(&root->log_ctxs[index]);
2724}
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738int btrfs_sync_log(struct btrfs_trans_handle *trans,
2739 struct btrfs_root *root, struct btrfs_log_ctx *ctx)
2740{
2741 int index1;
2742 int index2;
2743 int mark;
2744 int ret;
2745 struct btrfs_root *log = root->log_root;
2746 struct btrfs_root *log_root_tree = root->fs_info->log_root_tree;
2747 int log_transid = 0;
2748 struct btrfs_log_ctx root_log_ctx;
2749 struct blk_plug plug;
2750
2751 mutex_lock(&root->log_mutex);
2752 log_transid = ctx->log_transid;
2753 if (root->log_transid_committed >= log_transid) {
2754 mutex_unlock(&root->log_mutex);
2755 return ctx->log_ret;
2756 }
2757
2758 index1 = log_transid % 2;
2759 if (atomic_read(&root->log_commit[index1])) {
2760 wait_log_commit(root, log_transid);
2761 mutex_unlock(&root->log_mutex);
2762 return ctx->log_ret;
2763 }
2764 ASSERT(log_transid == root->log_transid);
2765 atomic_set(&root->log_commit[index1], 1);
2766
2767
2768 if (atomic_read(&root->log_commit[(index1 + 1) % 2]))
2769 wait_log_commit(root, log_transid - 1);
2770
2771 while (1) {
2772 int batch = atomic_read(&root->log_batch);
2773
2774 if (!btrfs_test_opt(root->fs_info, SSD) &&
2775 test_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state)) {
2776 mutex_unlock(&root->log_mutex);
2777 schedule_timeout_uninterruptible(1);
2778 mutex_lock(&root->log_mutex);
2779 }
2780 wait_for_writer(root);
2781 if (batch == atomic_read(&root->log_batch))
2782 break;
2783 }
2784
2785
2786 if (btrfs_need_log_full_commit(root->fs_info, trans)) {
2787 ret = -EAGAIN;
2788 btrfs_free_logged_extents(log, log_transid);
2789 mutex_unlock(&root->log_mutex);
2790 goto out;
2791 }
2792
2793 if (log_transid % 2 == 0)
2794 mark = EXTENT_DIRTY;
2795 else
2796 mark = EXTENT_NEW;
2797
2798
2799
2800
2801 blk_start_plug(&plug);
2802 ret = btrfs_write_marked_extents(log, &log->dirty_log_pages, mark);
2803 if (ret) {
2804 blk_finish_plug(&plug);
2805 btrfs_abort_transaction(trans, ret);
2806 btrfs_free_logged_extents(log, log_transid);
2807 btrfs_set_log_full_commit(root->fs_info, trans);
2808 mutex_unlock(&root->log_mutex);
2809 goto out;
2810 }
2811
2812 btrfs_set_root_node(&log->root_item, log->node);
2813
2814 root->log_transid++;
2815 log->log_transid = root->log_transid;
2816 root->log_start_pid = 0;
2817
2818
2819
2820
2821
2822 mutex_unlock(&root->log_mutex);
2823
2824 btrfs_init_log_ctx(&root_log_ctx, NULL);
2825
2826 mutex_lock(&log_root_tree->log_mutex);
2827 atomic_inc(&log_root_tree->log_batch);
2828 atomic_inc(&log_root_tree->log_writers);
2829
2830 index2 = log_root_tree->log_transid % 2;
2831 list_add_tail(&root_log_ctx.list, &log_root_tree->log_ctxs[index2]);
2832 root_log_ctx.log_transid = log_root_tree->log_transid;
2833
2834 mutex_unlock(&log_root_tree->log_mutex);
2835
2836 ret = update_log_root(trans, log);
2837
2838 mutex_lock(&log_root_tree->log_mutex);
2839 if (atomic_dec_and_test(&log_root_tree->log_writers)) {
2840
2841
2842
2843 if (waitqueue_active(&log_root_tree->log_writer_wait))
2844 wake_up(&log_root_tree->log_writer_wait);
2845 }
2846
2847 if (ret) {
2848 if (!list_empty(&root_log_ctx.list))
2849 list_del_init(&root_log_ctx.list);
2850
2851 blk_finish_plug(&plug);
2852 btrfs_set_log_full_commit(root->fs_info, trans);
2853
2854 if (ret != -ENOSPC) {
2855 btrfs_abort_transaction(trans, ret);
2856 mutex_unlock(&log_root_tree->log_mutex);
2857 goto out;
2858 }
2859 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2860 btrfs_free_logged_extents(log, log_transid);
2861 mutex_unlock(&log_root_tree->log_mutex);
2862 ret = -EAGAIN;
2863 goto out;
2864 }
2865
2866 if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) {
2867 blk_finish_plug(&plug);
2868 list_del_init(&root_log_ctx.list);
2869 mutex_unlock(&log_root_tree->log_mutex);
2870 ret = root_log_ctx.log_ret;
2871 goto out;
2872 }
2873
2874 index2 = root_log_ctx.log_transid % 2;
2875 if (atomic_read(&log_root_tree->log_commit[index2])) {
2876 blk_finish_plug(&plug);
2877 ret = btrfs_wait_marked_extents(log, &log->dirty_log_pages,
2878 mark);
2879 btrfs_wait_logged_extents(trans, log, log_transid);
2880 wait_log_commit(log_root_tree,
2881 root_log_ctx.log_transid);
2882 mutex_unlock(&log_root_tree->log_mutex);
2883 if (!ret)
2884 ret = root_log_ctx.log_ret;
2885 goto out;
2886 }
2887 ASSERT(root_log_ctx.log_transid == log_root_tree->log_transid);
2888 atomic_set(&log_root_tree->log_commit[index2], 1);
2889
2890 if (atomic_read(&log_root_tree->log_commit[(index2 + 1) % 2])) {
2891 wait_log_commit(log_root_tree,
2892 root_log_ctx.log_transid - 1);
2893 }
2894
2895 wait_for_writer(log_root_tree);
2896
2897
2898
2899
2900
2901 if (btrfs_need_log_full_commit(root->fs_info, trans)) {
2902 blk_finish_plug(&plug);
2903 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2904 btrfs_free_logged_extents(log, log_transid);
2905 mutex_unlock(&log_root_tree->log_mutex);
2906 ret = -EAGAIN;
2907 goto out_wake_log_root;
2908 }
2909
2910 ret = btrfs_write_marked_extents(log_root_tree,
2911 &log_root_tree->dirty_log_pages,
2912 EXTENT_DIRTY | EXTENT_NEW);
2913 blk_finish_plug(&plug);
2914 if (ret) {
2915 btrfs_set_log_full_commit(root->fs_info, trans);
2916 btrfs_abort_transaction(trans, ret);
2917 btrfs_free_logged_extents(log, log_transid);
2918 mutex_unlock(&log_root_tree->log_mutex);
2919 goto out_wake_log_root;
2920 }
2921 ret = btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2922 if (!ret)
2923 ret = btrfs_wait_marked_extents(log_root_tree,
2924 &log_root_tree->dirty_log_pages,
2925 EXTENT_NEW | EXTENT_DIRTY);
2926 if (ret) {
2927 btrfs_set_log_full_commit(root->fs_info, trans);
2928 btrfs_free_logged_extents(log, log_transid);
2929 mutex_unlock(&log_root_tree->log_mutex);
2930 goto out_wake_log_root;
2931 }
2932 btrfs_wait_logged_extents(trans, log, log_transid);
2933
2934 btrfs_set_super_log_root(root->fs_info->super_for_commit,
2935 log_root_tree->node->start);
2936 btrfs_set_super_log_root_level(root->fs_info->super_for_commit,
2937 btrfs_header_level(log_root_tree->node));
2938
2939 log_root_tree->log_transid++;
2940 mutex_unlock(&log_root_tree->log_mutex);
2941
2942
2943
2944
2945
2946
2947
2948
2949 ret = write_ctree_super(trans, root->fs_info->tree_root, 1);
2950 if (ret) {
2951 btrfs_set_log_full_commit(root->fs_info, trans);
2952 btrfs_abort_transaction(trans, ret);
2953 goto out_wake_log_root;
2954 }
2955
2956 mutex_lock(&root->log_mutex);
2957 if (root->last_log_commit < log_transid)
2958 root->last_log_commit = log_transid;
2959 mutex_unlock(&root->log_mutex);
2960
2961out_wake_log_root:
2962 mutex_lock(&log_root_tree->log_mutex);
2963 btrfs_remove_all_log_ctxs(log_root_tree, index2, ret);
2964
2965 log_root_tree->log_transid_committed++;
2966 atomic_set(&log_root_tree->log_commit[index2], 0);
2967 mutex_unlock(&log_root_tree->log_mutex);
2968
2969
2970
2971
2972 if (waitqueue_active(&log_root_tree->log_commit_wait[index2]))
2973 wake_up(&log_root_tree->log_commit_wait[index2]);
2974out:
2975 mutex_lock(&root->log_mutex);
2976 btrfs_remove_all_log_ctxs(root, index1, ret);
2977 root->log_transid_committed++;
2978 atomic_set(&root->log_commit[index1], 0);
2979 mutex_unlock(&root->log_mutex);
2980
2981
2982
2983
2984 if (waitqueue_active(&root->log_commit_wait[index1]))
2985 wake_up(&root->log_commit_wait[index1]);
2986 return ret;
2987}
2988
2989static void free_log_tree(struct btrfs_trans_handle *trans,
2990 struct btrfs_root *log)
2991{
2992 int ret;
2993 u64 start;
2994 u64 end;
2995 struct walk_control wc = {
2996 .free = 1,
2997 .process_func = process_one_buffer
2998 };
2999
3000 ret = walk_log_tree(trans, log, &wc);
3001
3002 if (ret)
3003 btrfs_abort_transaction(trans, ret);
3004
3005 while (1) {
3006 ret = find_first_extent_bit(&log->dirty_log_pages,
3007 0, &start, &end, EXTENT_DIRTY | EXTENT_NEW,
3008 NULL);
3009 if (ret)
3010 break;
3011
3012 clear_extent_bits(&log->dirty_log_pages, start, end,
3013 EXTENT_DIRTY | EXTENT_NEW);
3014 }
3015
3016
3017
3018
3019
3020
3021 btrfs_free_logged_extents(log, 0);
3022 btrfs_free_logged_extents(log, 1);
3023
3024 free_extent_buffer(log->node);
3025 kfree(log);
3026}
3027
3028
3029
3030
3031
3032int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root)
3033{
3034 if (root->log_root) {
3035 free_log_tree(trans, root->log_root);
3036 root->log_root = NULL;
3037 }
3038 return 0;
3039}
3040
3041int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
3042 struct btrfs_fs_info *fs_info)
3043{
3044 if (fs_info->log_root_tree) {
3045 free_log_tree(trans, fs_info->log_root_tree);
3046 fs_info->log_root_tree = NULL;
3047 }
3048 return 0;
3049}
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,
3073 struct btrfs_root *root,
3074 const char *name, int name_len,
3075 struct inode *dir, u64 index)
3076{
3077 struct btrfs_root *log;
3078 struct btrfs_dir_item *di;
3079 struct btrfs_path *path;
3080 int ret;
3081 int err = 0;
3082 int bytes_del = 0;
3083 u64 dir_ino = btrfs_ino(dir);
3084
3085 if (BTRFS_I(dir)->logged_trans < trans->transid)
3086 return 0;
3087
3088 ret = join_running_log_trans(root);
3089 if (ret)
3090 return 0;
3091
3092 mutex_lock(&BTRFS_I(dir)->log_mutex);
3093
3094 log = root->log_root;
3095 path = btrfs_alloc_path();
3096 if (!path) {
3097 err = -ENOMEM;
3098 goto out_unlock;
3099 }
3100
3101 di = btrfs_lookup_dir_item(trans, log, path, dir_ino,
3102 name, name_len, -1);
3103 if (IS_ERR(di)) {
3104 err = PTR_ERR(di);
3105 goto fail;
3106 }
3107 if (di) {
3108 ret = btrfs_delete_one_dir_name(trans, log, path, di);
3109 bytes_del += name_len;
3110 if (ret) {
3111 err = ret;
3112 goto fail;
3113 }
3114 }
3115 btrfs_release_path(path);
3116 di = btrfs_lookup_dir_index_item(trans, log, path, dir_ino,
3117 index, name, name_len, -1);
3118 if (IS_ERR(di)) {
3119 err = PTR_ERR(di);
3120 goto fail;
3121 }
3122 if (di) {
3123 ret = btrfs_delete_one_dir_name(trans, log, path, di);
3124 bytes_del += name_len;
3125 if (ret) {
3126 err = ret;
3127 goto fail;
3128 }
3129 }
3130
3131
3132
3133
3134 if (bytes_del) {
3135 struct btrfs_key key;
3136
3137 key.objectid = dir_ino;
3138 key.offset = 0;
3139 key.type = BTRFS_INODE_ITEM_KEY;
3140 btrfs_release_path(path);
3141
3142 ret = btrfs_search_slot(trans, log, &key, path, 0, 1);
3143 if (ret < 0) {
3144 err = ret;
3145 goto fail;
3146 }
3147 if (ret == 0) {
3148 struct btrfs_inode_item *item;
3149 u64 i_size;
3150
3151 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
3152 struct btrfs_inode_item);
3153 i_size = btrfs_inode_size(path->nodes[0], item);
3154 if (i_size > bytes_del)
3155 i_size -= bytes_del;
3156 else
3157 i_size = 0;
3158 btrfs_set_inode_size(path->nodes[0], item, i_size);
3159 btrfs_mark_buffer_dirty(path->nodes[0]);
3160 } else
3161 ret = 0;
3162 btrfs_release_path(path);
3163 }
3164fail:
3165 btrfs_free_path(path);
3166out_unlock:
3167 mutex_unlock(&BTRFS_I(dir)->log_mutex);
3168 if (ret == -ENOSPC) {
3169 btrfs_set_log_full_commit(root->fs_info, trans);
3170 ret = 0;
3171 } else if (ret < 0)
3172 btrfs_abort_transaction(trans, ret);
3173
3174 btrfs_end_log_trans(root);
3175
3176 return err;
3177}
3178
3179
3180int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans,
3181 struct btrfs_root *root,
3182 const char *name, int name_len,
3183 struct inode *inode, u64 dirid)
3184{
3185 struct btrfs_root *log;
3186 u64 index;
3187 int ret;
3188
3189 if (BTRFS_I(inode)->logged_trans < trans->transid)
3190 return 0;
3191
3192 ret = join_running_log_trans(root);
3193 if (ret)
3194 return 0;
3195 log = root->log_root;
3196 mutex_lock(&BTRFS_I(inode)->log_mutex);
3197
3198 ret = btrfs_del_inode_ref(trans, log, name, name_len, btrfs_ino(inode),
3199 dirid, &index);
3200 mutex_unlock(&BTRFS_I(inode)->log_mutex);
3201 if (ret == -ENOSPC) {
3202 btrfs_set_log_full_commit(root->fs_info, trans);
3203 ret = 0;
3204 } else if (ret < 0 && ret != -ENOENT)
3205 btrfs_abort_transaction(trans, ret);
3206 btrfs_end_log_trans(root);
3207
3208 return ret;
3209}
3210
3211
3212
3213
3214
3215
3216static noinline int insert_dir_log_key(struct btrfs_trans_handle *trans,
3217 struct btrfs_root *log,
3218 struct btrfs_path *path,
3219 int key_type, u64 dirid,
3220 u64 first_offset, u64 last_offset)
3221{
3222 int ret;
3223 struct btrfs_key key;
3224 struct btrfs_dir_log_item *item;
3225
3226 key.objectid = dirid;
3227 key.offset = first_offset;
3228 if (key_type == BTRFS_DIR_ITEM_KEY)
3229 key.type = BTRFS_DIR_LOG_ITEM_KEY;
3230 else
3231 key.type = BTRFS_DIR_LOG_INDEX_KEY;
3232 ret = btrfs_insert_empty_item(trans, log, path, &key, sizeof(*item));
3233 if (ret)
3234 return ret;
3235
3236 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
3237 struct btrfs_dir_log_item);
3238 btrfs_set_dir_log_end(path->nodes[0], item, last_offset);
3239 btrfs_mark_buffer_dirty(path->nodes[0]);
3240 btrfs_release_path(path);
3241 return 0;
3242}
3243
3244
3245
3246
3247
3248
3249static noinline int log_dir_items(struct btrfs_trans_handle *trans,
3250 struct btrfs_root *root, struct inode *inode,
3251 struct btrfs_path *path,
3252 struct btrfs_path *dst_path, int key_type,
3253 struct btrfs_log_ctx *ctx,
3254 u64 min_offset, u64 *last_offset_ret)
3255{
3256 struct btrfs_key min_key;
3257 struct btrfs_root *log = root->log_root;
3258 struct extent_buffer *src;
3259 int err = 0;
3260 int ret;
3261 int i;
3262 int nritems;
3263 u64 first_offset = min_offset;
3264 u64 last_offset = (u64)-1;
3265 u64 ino = btrfs_ino(inode);
3266
3267 log = root->log_root;
3268
3269 min_key.objectid = ino;
3270 min_key.type = key_type;
3271 min_key.offset = min_offset;
3272
3273 ret = btrfs_search_forward(root, &min_key, path, trans->transid);
3274
3275
3276
3277
3278
3279 if (ret != 0 || min_key.objectid != ino || min_key.type != key_type) {
3280 min_key.objectid = ino;
3281 min_key.type = key_type;
3282 min_key.offset = (u64)-1;
3283 btrfs_release_path(path);
3284 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
3285 if (ret < 0) {
3286 btrfs_release_path(path);
3287 return ret;
3288 }
3289 ret = btrfs_previous_item(root, path, ino, key_type);
3290
3291
3292
3293
3294
3295
3296 if (ret == 0) {
3297 struct btrfs_key tmp;
3298 btrfs_item_key_to_cpu(path->nodes[0], &tmp,
3299 path->slots[0]);
3300 if (key_type == tmp.type)
3301 first_offset = max(min_offset, tmp.offset) + 1;
3302 }
3303 goto done;
3304 }
3305
3306
3307 ret = btrfs_previous_item(root, path, ino, key_type);
3308 if (ret == 0) {
3309 struct btrfs_key tmp;
3310 btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]);
3311 if (key_type == tmp.type) {
3312 first_offset = tmp.offset;
3313 ret = overwrite_item(trans, log, dst_path,
3314 path->nodes[0], path->slots[0],
3315 &tmp);
3316 if (ret) {
3317 err = ret;
3318 goto done;
3319 }
3320 }
3321 }
3322 btrfs_release_path(path);
3323
3324
3325 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
3326 if (WARN_ON(ret != 0))
3327 goto done;
3328
3329
3330
3331
3332
3333 while (1) {
3334 struct btrfs_key tmp;
3335 src = path->nodes[0];
3336 nritems = btrfs_header_nritems(src);
3337 for (i = path->slots[0]; i < nritems; i++) {
3338 struct btrfs_dir_item *di;
3339
3340 btrfs_item_key_to_cpu(src, &min_key, i);
3341
3342 if (min_key.objectid != ino || min_key.type != key_type)
3343 goto done;
3344 ret = overwrite_item(trans, log, dst_path, src, i,
3345 &min_key);
3346 if (ret) {
3347 err = ret;
3348 goto done;
3349 }
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374 di = btrfs_item_ptr(src, i, struct btrfs_dir_item);
3375 btrfs_dir_item_key_to_cpu(src, di, &tmp);
3376 if (ctx &&
3377 (btrfs_dir_transid(src, di) == trans->transid ||
3378 btrfs_dir_type(src, di) == BTRFS_FT_DIR) &&
3379 tmp.type != BTRFS_ROOT_ITEM_KEY)
3380 ctx->log_new_dentries = true;
3381 }
3382 path->slots[0] = nritems;
3383
3384
3385
3386
3387
3388 ret = btrfs_next_leaf(root, path);
3389 if (ret == 1) {
3390 last_offset = (u64)-1;
3391 goto done;
3392 }
3393 btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]);
3394 if (tmp.objectid != ino || tmp.type != key_type) {
3395 last_offset = (u64)-1;
3396 goto done;
3397 }
3398 if (btrfs_header_generation(path->nodes[0]) != trans->transid) {
3399 ret = overwrite_item(trans, log, dst_path,
3400 path->nodes[0], path->slots[0],
3401 &tmp);
3402 if (ret)
3403 err = ret;
3404 else
3405 last_offset = tmp.offset;
3406 goto done;
3407 }
3408 }
3409done:
3410 btrfs_release_path(path);
3411 btrfs_release_path(dst_path);
3412
3413 if (err == 0) {
3414 *last_offset_ret = last_offset;
3415
3416
3417
3418
3419 ret = insert_dir_log_key(trans, log, path, key_type,
3420 ino, first_offset, last_offset);
3421 if (ret)
3422 err = ret;
3423 }
3424 return err;
3425}
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439static noinline int log_directory_changes(struct btrfs_trans_handle *trans,
3440 struct btrfs_root *root, struct inode *inode,
3441 struct btrfs_path *path,
3442 struct btrfs_path *dst_path,
3443 struct btrfs_log_ctx *ctx)
3444{
3445 u64 min_key;
3446 u64 max_key;
3447 int ret;
3448 int key_type = BTRFS_DIR_ITEM_KEY;
3449
3450again:
3451 min_key = 0;
3452 max_key = 0;
3453 while (1) {
3454 ret = log_dir_items(trans, root, inode, path,
3455 dst_path, key_type, ctx, min_key,
3456 &max_key);
3457 if (ret)
3458 return ret;
3459 if (max_key == (u64)-1)
3460 break;
3461 min_key = max_key + 1;
3462 }
3463
3464 if (key_type == BTRFS_DIR_ITEM_KEY) {
3465 key_type = BTRFS_DIR_INDEX_KEY;
3466 goto again;
3467 }
3468 return 0;
3469}
3470
3471
3472
3473
3474
3475
3476
3477static int drop_objectid_items(struct btrfs_trans_handle *trans,
3478 struct btrfs_root *log,
3479 struct btrfs_path *path,
3480 u64 objectid, int max_key_type)
3481{
3482 int ret;
3483 struct btrfs_key key;
3484 struct btrfs_key found_key;
3485 int start_slot;
3486
3487 key.objectid = objectid;
3488 key.type = max_key_type;
3489 key.offset = (u64)-1;
3490
3491 while (1) {
3492 ret = btrfs_search_slot(trans, log, &key, path, -1, 1);
3493 BUG_ON(ret == 0);
3494 if (ret < 0)
3495 break;
3496
3497 if (path->slots[0] == 0)
3498 break;
3499
3500 path->slots[0]--;
3501 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
3502 path->slots[0]);
3503
3504 if (found_key.objectid != objectid)
3505 break;
3506
3507 found_key.offset = 0;
3508 found_key.type = 0;
3509 ret = btrfs_bin_search(path->nodes[0], &found_key, 0,
3510 &start_slot);
3511
3512 ret = btrfs_del_items(trans, log, path, start_slot,
3513 path->slots[0] - start_slot + 1);
3514
3515
3516
3517
3518 if (ret || start_slot != 0)
3519 break;
3520 btrfs_release_path(path);
3521 }
3522 btrfs_release_path(path);
3523 if (ret > 0)
3524 ret = 0;
3525 return ret;
3526}
3527
3528static void fill_inode_item(struct btrfs_trans_handle *trans,
3529 struct extent_buffer *leaf,
3530 struct btrfs_inode_item *item,
3531 struct inode *inode, int log_inode_only,
3532 u64 logged_isize)
3533{
3534 struct btrfs_map_token token;
3535
3536 btrfs_init_map_token(&token);
3537
3538 if (log_inode_only) {
3539
3540
3541
3542
3543
3544 btrfs_set_token_inode_generation(leaf, item, 0, &token);
3545 btrfs_set_token_inode_size(leaf, item, logged_isize, &token);
3546 } else {
3547 btrfs_set_token_inode_generation(leaf, item,
3548 BTRFS_I(inode)->generation,
3549 &token);
3550 btrfs_set_token_inode_size(leaf, item, inode->i_size, &token);
3551 }
3552
3553 btrfs_set_token_inode_uid(leaf, item, i_uid_read(inode), &token);
3554 btrfs_set_token_inode_gid(leaf, item, i_gid_read(inode), &token);
3555 btrfs_set_token_inode_mode(leaf, item, inode->i_mode, &token);
3556 btrfs_set_token_inode_nlink(leaf, item, inode->i_nlink, &token);
3557
3558 btrfs_set_token_timespec_sec(leaf, &item->atime,
3559 inode->i_atime.tv_sec, &token);
3560 btrfs_set_token_timespec_nsec(leaf, &item->atime,
3561 inode->i_atime.tv_nsec, &token);
3562
3563 btrfs_set_token_timespec_sec(leaf, &item->mtime,
3564 inode->i_mtime.tv_sec, &token);
3565 btrfs_set_token_timespec_nsec(leaf, &item->mtime,
3566 inode->i_mtime.tv_nsec, &token);
3567
3568 btrfs_set_token_timespec_sec(leaf, &item->ctime,
3569 inode->i_ctime.tv_sec, &token);
3570 btrfs_set_token_timespec_nsec(leaf, &item->ctime,
3571 inode->i_ctime.tv_nsec, &token);
3572
3573 btrfs_set_token_inode_nbytes(leaf, item, inode_get_bytes(inode),
3574 &token);
3575
3576 btrfs_set_token_inode_sequence(leaf, item, inode->i_version, &token);
3577 btrfs_set_token_inode_transid(leaf, item, trans->transid, &token);
3578 btrfs_set_token_inode_rdev(leaf, item, inode->i_rdev, &token);
3579 btrfs_set_token_inode_flags(leaf, item, BTRFS_I(inode)->flags, &token);
3580 btrfs_set_token_inode_block_group(leaf, item, 0, &token);
3581}
3582
3583static int log_inode_item(struct btrfs_trans_handle *trans,
3584 struct btrfs_root *log, struct btrfs_path *path,
3585 struct inode *inode)
3586{
3587 struct btrfs_inode_item *inode_item;
3588 int ret;
3589
3590 ret = btrfs_insert_empty_item(trans, log, path,
3591 &BTRFS_I(inode)->location,
3592 sizeof(*inode_item));
3593 if (ret && ret != -EEXIST)
3594 return ret;
3595 inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0],
3596 struct btrfs_inode_item);
3597 fill_inode_item(trans, path->nodes[0], inode_item, inode, 0, 0);
3598 btrfs_release_path(path);
3599 return 0;
3600}
3601
3602static noinline int copy_items(struct btrfs_trans_handle *trans,
3603 struct inode *inode,
3604 struct btrfs_path *dst_path,
3605 struct btrfs_path *src_path, u64 *last_extent,
3606 int start_slot, int nr, int inode_only,
3607 u64 logged_isize)
3608{
3609 unsigned long src_offset;
3610 unsigned long dst_offset;
3611 struct btrfs_root *log = BTRFS_I(inode)->root->log_root;
3612 struct btrfs_file_extent_item *extent;
3613 struct btrfs_inode_item *inode_item;
3614 struct extent_buffer *src = src_path->nodes[0];
3615 struct btrfs_key first_key, last_key, key;
3616 int ret;
3617 struct btrfs_key *ins_keys;
3618 u32 *ins_sizes;
3619 char *ins_data;
3620 int i;
3621 struct list_head ordered_sums;
3622 int skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
3623 bool has_extents = false;
3624 bool need_find_last_extent = true;
3625 bool done = false;
3626
3627 INIT_LIST_HEAD(&ordered_sums);
3628
3629 ins_data = kmalloc(nr * sizeof(struct btrfs_key) +
3630 nr * sizeof(u32), GFP_NOFS);
3631 if (!ins_data)
3632 return -ENOMEM;
3633
3634 first_key.objectid = (u64)-1;
3635
3636 ins_sizes = (u32 *)ins_data;
3637 ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32));
3638
3639 for (i = 0; i < nr; i++) {
3640 ins_sizes[i] = btrfs_item_size_nr(src, i + start_slot);
3641 btrfs_item_key_to_cpu(src, ins_keys + i, i + start_slot);
3642 }
3643 ret = btrfs_insert_empty_items(trans, log, dst_path,
3644 ins_keys, ins_sizes, nr);
3645 if (ret) {
3646 kfree(ins_data);
3647 return ret;
3648 }
3649
3650 for (i = 0; i < nr; i++, dst_path->slots[0]++) {
3651 dst_offset = btrfs_item_ptr_offset(dst_path->nodes[0],
3652 dst_path->slots[0]);
3653
3654 src_offset = btrfs_item_ptr_offset(src, start_slot + i);
3655
3656 if ((i == (nr - 1)))
3657 last_key = ins_keys[i];
3658
3659 if (ins_keys[i].type == BTRFS_INODE_ITEM_KEY) {
3660 inode_item = btrfs_item_ptr(dst_path->nodes[0],
3661 dst_path->slots[0],
3662 struct btrfs_inode_item);
3663 fill_inode_item(trans, dst_path->nodes[0], inode_item,
3664 inode, inode_only == LOG_INODE_EXISTS,
3665 logged_isize);
3666 } else {
3667 copy_extent_buffer(dst_path->nodes[0], src, dst_offset,
3668 src_offset, ins_sizes[i]);
3669 }
3670
3671
3672
3673
3674
3675
3676
3677 if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY) {
3678 has_extents = true;
3679 if (first_key.objectid == (u64)-1)
3680 first_key = ins_keys[i];
3681 } else {
3682 need_find_last_extent = false;
3683 }
3684
3685
3686
3687
3688
3689 if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY &&
3690 !skip_csum) {
3691 int found_type;
3692 extent = btrfs_item_ptr(src, start_slot + i,
3693 struct btrfs_file_extent_item);
3694
3695 if (btrfs_file_extent_generation(src, extent) < trans->transid)
3696 continue;
3697
3698 found_type = btrfs_file_extent_type(src, extent);
3699 if (found_type == BTRFS_FILE_EXTENT_REG) {
3700 u64 ds, dl, cs, cl;
3701 ds = btrfs_file_extent_disk_bytenr(src,
3702 extent);
3703
3704 if (ds == 0)
3705 continue;
3706
3707 dl = btrfs_file_extent_disk_num_bytes(src,
3708 extent);
3709 cs = btrfs_file_extent_offset(src, extent);
3710 cl = btrfs_file_extent_num_bytes(src,
3711 extent);
3712 if (btrfs_file_extent_compression(src,
3713 extent)) {
3714 cs = 0;
3715 cl = dl;
3716 }
3717
3718 ret = btrfs_lookup_csums_range(
3719 log->fs_info->csum_root,
3720 ds + cs, ds + cs + cl - 1,
3721 &ordered_sums, 0);
3722 if (ret) {
3723 btrfs_release_path(dst_path);
3724 kfree(ins_data);
3725 return ret;
3726 }
3727 }
3728 }
3729 }
3730
3731 btrfs_mark_buffer_dirty(dst_path->nodes[0]);
3732 btrfs_release_path(dst_path);
3733 kfree(ins_data);
3734
3735
3736
3737
3738
3739 ret = 0;
3740 while (!list_empty(&ordered_sums)) {
3741 struct btrfs_ordered_sum *sums = list_entry(ordered_sums.next,
3742 struct btrfs_ordered_sum,
3743 list);
3744 if (!ret)
3745 ret = btrfs_csum_file_blocks(trans, log, sums);
3746 list_del(&sums->list);
3747 kfree(sums);
3748 }
3749
3750 if (!has_extents)
3751 return ret;
3752
3753 if (need_find_last_extent && *last_extent == first_key.offset) {
3754
3755
3756
3757
3758
3759
3760 need_find_last_extent = false;
3761 }
3762
3763
3764
3765
3766
3767
3768
3769 if (need_find_last_extent) {
3770 u64 len;
3771
3772 ret = btrfs_prev_leaf(BTRFS_I(inode)->root, src_path);
3773 if (ret < 0)
3774 return ret;
3775 if (ret)
3776 goto fill_holes;
3777 if (src_path->slots[0])
3778 src_path->slots[0]--;
3779 src = src_path->nodes[0];
3780 btrfs_item_key_to_cpu(src, &key, src_path->slots[0]);
3781 if (key.objectid != btrfs_ino(inode) ||
3782 key.type != BTRFS_EXTENT_DATA_KEY)
3783 goto fill_holes;
3784 extent = btrfs_item_ptr(src, src_path->slots[0],
3785 struct btrfs_file_extent_item);
3786 if (btrfs_file_extent_type(src, extent) ==
3787 BTRFS_FILE_EXTENT_INLINE) {
3788 len = btrfs_file_extent_inline_len(src,
3789 src_path->slots[0],
3790 extent);
3791 *last_extent = ALIGN(key.offset + len,
3792 log->sectorsize);
3793 } else {
3794 len = btrfs_file_extent_num_bytes(src, extent);
3795 *last_extent = key.offset + len;
3796 }
3797 }
3798fill_holes:
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811 if (need_find_last_extent) {
3812
3813 btrfs_release_path(src_path);
3814 ret = btrfs_search_slot(NULL, BTRFS_I(inode)->root, &first_key,
3815 src_path, 0, 0);
3816 if (ret < 0)
3817 return ret;
3818 ASSERT(ret == 0);
3819 src = src_path->nodes[0];
3820 i = src_path->slots[0];
3821 } else {
3822 i = start_slot;
3823 }
3824
3825
3826
3827
3828
3829
3830 while (!done) {
3831 u64 offset, len;
3832 u64 extent_end;
3833
3834 if (i >= btrfs_header_nritems(src_path->nodes[0])) {
3835 ret = btrfs_next_leaf(BTRFS_I(inode)->root, src_path);
3836 if (ret < 0)
3837 return ret;
3838 ASSERT(ret == 0);
3839 src = src_path->nodes[0];
3840 i = 0;
3841 }
3842
3843 btrfs_item_key_to_cpu(src, &key, i);
3844 if (!btrfs_comp_cpu_keys(&key, &last_key))
3845 done = true;
3846 if (key.objectid != btrfs_ino(inode) ||
3847 key.type != BTRFS_EXTENT_DATA_KEY) {
3848 i++;
3849 continue;
3850 }
3851 extent = btrfs_item_ptr(src, i, struct btrfs_file_extent_item);
3852 if (btrfs_file_extent_type(src, extent) ==
3853 BTRFS_FILE_EXTENT_INLINE) {
3854 len = btrfs_file_extent_inline_len(src, i, extent);
3855 extent_end = ALIGN(key.offset + len, log->sectorsize);
3856 } else {
3857 len = btrfs_file_extent_num_bytes(src, extent);
3858 extent_end = key.offset + len;
3859 }
3860 i++;
3861
3862 if (*last_extent == key.offset) {
3863 *last_extent = extent_end;
3864 continue;
3865 }
3866 offset = *last_extent;
3867 len = key.offset - *last_extent;
3868 ret = btrfs_insert_file_extent(trans, log, btrfs_ino(inode),
3869 offset, 0, 0, len, 0, len, 0,
3870 0, 0);
3871 if (ret)
3872 break;
3873 *last_extent = extent_end;
3874 }
3875
3876
3877
3878
3879 if (!ret && need_find_last_extent)
3880 ret = 1;
3881 return ret;
3882}
3883
3884static int extent_cmp(void *priv, struct list_head *a, struct list_head *b)
3885{
3886 struct extent_map *em1, *em2;
3887
3888 em1 = list_entry(a, struct extent_map, list);
3889 em2 = list_entry(b, struct extent_map, list);
3890
3891 if (em1->start < em2->start)
3892 return -1;
3893 else if (em1->start > em2->start)
3894 return 1;
3895 return 0;
3896}
3897
3898static int wait_ordered_extents(struct btrfs_trans_handle *trans,
3899 struct inode *inode,
3900 struct btrfs_root *root,
3901 const struct extent_map *em,
3902 const struct list_head *logged_list,
3903 bool *ordered_io_error)
3904{
3905 struct btrfs_ordered_extent *ordered;
3906 struct btrfs_root *log = root->log_root;
3907 u64 mod_start = em->mod_start;
3908 u64 mod_len = em->mod_len;
3909 const bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
3910 u64 csum_offset;
3911 u64 csum_len;
3912 LIST_HEAD(ordered_sums);
3913 int ret = 0;
3914
3915 *ordered_io_error = false;
3916
3917 if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags) ||
3918 em->block_start == EXTENT_MAP_HOLE)
3919 return 0;
3920
3921
3922
3923
3924
3925
3926 list_for_each_entry(ordered, logged_list, log_list) {
3927 struct btrfs_ordered_sum *sum;
3928
3929 if (!mod_len)
3930 break;
3931
3932 if (ordered->file_offset + ordered->len <= mod_start ||
3933 mod_start + mod_len <= ordered->file_offset)
3934 continue;
3935
3936 if (!test_bit(BTRFS_ORDERED_IO_DONE, &ordered->flags) &&
3937 !test_bit(BTRFS_ORDERED_IOERR, &ordered->flags) &&
3938 !test_bit(BTRFS_ORDERED_DIRECT, &ordered->flags)) {
3939 const u64 start = ordered->file_offset;
3940 const u64 end = ordered->file_offset + ordered->len - 1;
3941
3942 WARN_ON(ordered->inode != inode);
3943 filemap_fdatawrite_range(inode->i_mapping, start, end);
3944 }
3945
3946 wait_event(ordered->wait,
3947 (test_bit(BTRFS_ORDERED_IO_DONE, &ordered->flags) ||
3948 test_bit(BTRFS_ORDERED_IOERR, &ordered->flags)));
3949
3950 if (test_bit(BTRFS_ORDERED_IOERR, &ordered->flags)) {
3951
3952
3953
3954
3955
3956 filemap_check_errors(inode->i_mapping);
3957 *ordered_io_error = true;
3958 break;
3959 }
3960
3961
3962
3963
3964
3965 if (ordered->file_offset > mod_start) {
3966 if (ordered->file_offset + ordered->len >=
3967 mod_start + mod_len)
3968 mod_len = ordered->file_offset - mod_start;
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979 } else {
3980 if (ordered->file_offset + ordered->len <
3981 mod_start + mod_len) {
3982 mod_len = (mod_start + mod_len) -
3983 (ordered->file_offset + ordered->len);
3984 mod_start = ordered->file_offset +
3985 ordered->len;
3986 } else {
3987 mod_len = 0;
3988 }
3989 }
3990
3991 if (skip_csum)
3992 continue;
3993
3994
3995
3996
3997
3998 if (test_and_set_bit(BTRFS_ORDERED_LOGGED_CSUM,
3999 &ordered->flags))
4000 continue;
4001
4002 list_for_each_entry(sum, &ordered->list, list) {
4003 ret = btrfs_csum_file_blocks(trans, log, sum);
4004 if (ret)
4005 break;
4006 }
4007 }
4008
4009 if (*ordered_io_error || !mod_len || ret || skip_csum)
4010 return ret;
4011
4012 if (em->compress_type) {
4013 csum_offset = 0;
4014 csum_len = max(em->block_len, em->orig_block_len);
4015 } else {
4016 csum_offset = mod_start - em->start;
4017 csum_len = mod_len;
4018 }
4019
4020
4021 ret = btrfs_lookup_csums_range(log->fs_info->csum_root,
4022 em->block_start + csum_offset,
4023 em->block_start + csum_offset +
4024 csum_len - 1, &ordered_sums, 0);
4025 if (ret)
4026 return ret;
4027
4028 while (!list_empty(&ordered_sums)) {
4029 struct btrfs_ordered_sum *sums = list_entry(ordered_sums.next,
4030 struct btrfs_ordered_sum,
4031 list);
4032 if (!ret)
4033 ret = btrfs_csum_file_blocks(trans, log, sums);
4034 list_del(&sums->list);
4035 kfree(sums);
4036 }
4037
4038 return ret;
4039}
4040
4041static int log_one_extent(struct btrfs_trans_handle *trans,
4042 struct inode *inode, struct btrfs_root *root,
4043 const struct extent_map *em,
4044 struct btrfs_path *path,
4045 const struct list_head *logged_list,
4046 struct btrfs_log_ctx *ctx)
4047{
4048 struct btrfs_root *log = root->log_root;
4049 struct btrfs_file_extent_item *fi;
4050 struct extent_buffer *leaf;
4051 struct btrfs_map_token token;
4052 struct btrfs_key key;
4053 u64 extent_offset = em->start - em->orig_start;
4054 u64 block_len;
4055 int ret;
4056 int extent_inserted = 0;
4057 bool ordered_io_err = false;
4058
4059 ret = wait_ordered_extents(trans, inode, root, em, logged_list,
4060 &ordered_io_err);
4061 if (ret)
4062 return ret;
4063
4064 if (ordered_io_err) {
4065 ctx->io_err = -EIO;
4066 return 0;
4067 }
4068
4069 btrfs_init_map_token(&token);
4070
4071 ret = __btrfs_drop_extents(trans, log, inode, path, em->start,
4072 em->start + em->len, NULL, 0, 1,
4073 sizeof(*fi), &extent_inserted);
4074 if (ret)
4075 return ret;
4076
4077 if (!extent_inserted) {
4078 key.objectid = btrfs_ino(inode);
4079 key.type = BTRFS_EXTENT_DATA_KEY;
4080 key.offset = em->start;
4081
4082 ret = btrfs_insert_empty_item(trans, log, path, &key,
4083 sizeof(*fi));
4084 if (ret)
4085 return ret;
4086 }
4087 leaf = path->nodes[0];
4088 fi = btrfs_item_ptr(leaf, path->slots[0],
4089 struct btrfs_file_extent_item);
4090
4091 btrfs_set_token_file_extent_generation(leaf, fi, trans->transid,
4092 &token);
4093 if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
4094 btrfs_set_token_file_extent_type(leaf, fi,
4095 BTRFS_FILE_EXTENT_PREALLOC,
4096 &token);
4097 else
4098 btrfs_set_token_file_extent_type(leaf, fi,
4099 BTRFS_FILE_EXTENT_REG,
4100 &token);
4101
4102 block_len = max(em->block_len, em->orig_block_len);
4103 if (em->compress_type != BTRFS_COMPRESS_NONE) {
4104 btrfs_set_token_file_extent_disk_bytenr(leaf, fi,
4105 em->block_start,
4106 &token);
4107 btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, block_len,
4108 &token);
4109 } else if (em->block_start < EXTENT_MAP_LAST_BYTE) {
4110 btrfs_set_token_file_extent_disk_bytenr(leaf, fi,
4111 em->block_start -
4112 extent_offset, &token);
4113 btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, block_len,
4114 &token);
4115 } else {
4116 btrfs_set_token_file_extent_disk_bytenr(leaf, fi, 0, &token);
4117 btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, 0,
4118 &token);
4119 }
4120
4121 btrfs_set_token_file_extent_offset(leaf, fi, extent_offset, &token);
4122 btrfs_set_token_file_extent_num_bytes(leaf, fi, em->len, &token);
4123 btrfs_set_token_file_extent_ram_bytes(leaf, fi, em->ram_bytes, &token);
4124 btrfs_set_token_file_extent_compression(leaf, fi, em->compress_type,
4125 &token);
4126 btrfs_set_token_file_extent_encryption(leaf, fi, 0, &token);
4127 btrfs_set_token_file_extent_other_encoding(leaf, fi, 0, &token);
4128 btrfs_mark_buffer_dirty(leaf);
4129
4130 btrfs_release_path(path);
4131
4132 return ret;
4133}
4134
4135static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
4136 struct btrfs_root *root,
4137 struct inode *inode,
4138 struct btrfs_path *path,
4139 struct list_head *logged_list,
4140 struct btrfs_log_ctx *ctx,
4141 const u64 start,
4142 const u64 end)
4143{
4144 struct extent_map *em, *n;
4145 struct list_head extents;
4146 struct extent_map_tree *tree = &BTRFS_I(inode)->extent_tree;
4147 u64 test_gen;
4148 int ret = 0;
4149 int num = 0;
4150
4151 INIT_LIST_HEAD(&extents);
4152
4153 down_write(&BTRFS_I(inode)->dio_sem);
4154 write_lock(&tree->lock);
4155 test_gen = root->fs_info->last_trans_committed;
4156
4157 list_for_each_entry_safe(em, n, &tree->modified_extents, list) {
4158 list_del_init(&em->list);
4159
4160
4161
4162
4163
4164
4165
4166 if (++num > 32768) {
4167 list_del_init(&tree->modified_extents);
4168 ret = -EFBIG;
4169 goto process;
4170 }
4171
4172 if (em->generation <= test_gen)
4173 continue;
4174
4175 atomic_inc(&em->refs);
4176 set_bit(EXTENT_FLAG_LOGGING, &em->flags);
4177 list_add_tail(&em->list, &extents);
4178 num++;
4179 }
4180
4181 list_sort(NULL, &extents, extent_cmp);
4182 btrfs_get_logged_extents(inode, logged_list, start, end);
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193 ret = filemap_check_errors(inode->i_mapping);
4194 if (ret)
4195 ctx->io_err = ret;
4196process:
4197 while (!list_empty(&extents)) {
4198 em = list_entry(extents.next, struct extent_map, list);
4199
4200 list_del_init(&em->list);
4201
4202
4203
4204
4205
4206 if (ret) {
4207 clear_em_logging(tree, em);
4208 free_extent_map(em);
4209 continue;
4210 }
4211
4212 write_unlock(&tree->lock);
4213
4214 ret = log_one_extent(trans, inode, root, em, path, logged_list,
4215 ctx);
4216 write_lock(&tree->lock);
4217 clear_em_logging(tree, em);
4218 free_extent_map(em);
4219 }
4220 WARN_ON(!list_empty(&extents));
4221 write_unlock(&tree->lock);
4222 up_write(&BTRFS_I(inode)->dio_sem);
4223
4224 btrfs_release_path(path);
4225 return ret;
4226}
4227
4228static int logged_inode_size(struct btrfs_root *log, struct inode *inode,
4229 struct btrfs_path *path, u64 *size_ret)
4230{
4231 struct btrfs_key key;
4232 int ret;
4233
4234 key.objectid = btrfs_ino(inode);
4235 key.type = BTRFS_INODE_ITEM_KEY;
4236 key.offset = 0;
4237
4238 ret = btrfs_search_slot(NULL, log, &key, path, 0, 0);
4239 if (ret < 0) {
4240 return ret;
4241 } else if (ret > 0) {
4242 *size_ret = 0;
4243 } else {
4244 struct btrfs_inode_item *item;
4245
4246 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
4247 struct btrfs_inode_item);
4248 *size_ret = btrfs_inode_size(path->nodes[0], item);
4249 }
4250
4251 btrfs_release_path(path);
4252 return 0;
4253}
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264static int btrfs_log_all_xattrs(struct btrfs_trans_handle *trans,
4265 struct btrfs_root *root,
4266 struct inode *inode,
4267 struct btrfs_path *path,
4268 struct btrfs_path *dst_path)
4269{
4270 int ret;
4271 struct btrfs_key key;
4272 const u64 ino = btrfs_ino(inode);
4273 int ins_nr = 0;
4274 int start_slot = 0;
4275
4276 key.objectid = ino;
4277 key.type = BTRFS_XATTR_ITEM_KEY;
4278 key.offset = 0;
4279
4280 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
4281 if (ret < 0)
4282 return ret;
4283
4284 while (true) {
4285 int slot = path->slots[0];
4286 struct extent_buffer *leaf = path->nodes[0];
4287 int nritems = btrfs_header_nritems(leaf);
4288
4289 if (slot >= nritems) {
4290 if (ins_nr > 0) {
4291 u64 last_extent = 0;
4292
4293 ret = copy_items(trans, inode, dst_path, path,
4294 &last_extent, start_slot,
4295 ins_nr, 1, 0);
4296
4297 ASSERT(ret <= 0);
4298 if (ret < 0)
4299 return ret;
4300 ins_nr = 0;
4301 }
4302 ret = btrfs_next_leaf(root, path);
4303 if (ret < 0)
4304 return ret;
4305 else if (ret > 0)
4306 break;
4307 continue;
4308 }
4309
4310 btrfs_item_key_to_cpu(leaf, &key, slot);
4311 if (key.objectid != ino || key.type != BTRFS_XATTR_ITEM_KEY)
4312 break;
4313
4314 if (ins_nr == 0)
4315 start_slot = slot;
4316 ins_nr++;
4317 path->slots[0]++;
4318 cond_resched();
4319 }
4320 if (ins_nr > 0) {
4321 u64 last_extent = 0;
4322
4323 ret = copy_items(trans, inode, dst_path, path,
4324 &last_extent, start_slot,
4325 ins_nr, 1, 0);
4326
4327 ASSERT(ret <= 0);
4328 if (ret < 0)
4329 return ret;
4330 }
4331
4332 return 0;
4333}
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359static int btrfs_log_trailing_hole(struct btrfs_trans_handle *trans,
4360 struct btrfs_root *root,
4361 struct inode *inode,
4362 struct btrfs_path *path)
4363{
4364 int ret;
4365 struct btrfs_key key;
4366 u64 hole_start;
4367 u64 hole_size;
4368 struct extent_buffer *leaf;
4369 struct btrfs_root *log = root->log_root;
4370 const u64 ino = btrfs_ino(inode);
4371 const u64 i_size = i_size_read(inode);
4372
4373 if (!btrfs_fs_incompat(root->fs_info, NO_HOLES))
4374 return 0;
4375
4376 key.objectid = ino;
4377 key.type = BTRFS_EXTENT_DATA_KEY;
4378 key.offset = (u64)-1;
4379
4380 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
4381 ASSERT(ret != 0);
4382 if (ret < 0)
4383 return ret;
4384
4385 ASSERT(path->slots[0] > 0);
4386 path->slots[0]--;
4387 leaf = path->nodes[0];
4388 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
4389
4390 if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) {
4391
4392 hole_start = 0;
4393 hole_size = i_size;
4394 } else {
4395 struct btrfs_file_extent_item *extent;
4396 u64 len;
4397
4398
4399
4400
4401
4402 if (key.offset >= i_size)
4403 return 0;
4404
4405 extent = btrfs_item_ptr(leaf, path->slots[0],
4406 struct btrfs_file_extent_item);
4407
4408 if (btrfs_file_extent_type(leaf, extent) ==
4409 BTRFS_FILE_EXTENT_INLINE) {
4410 len = btrfs_file_extent_inline_len(leaf,
4411 path->slots[0],
4412 extent);
4413 ASSERT(len == i_size);
4414 return 0;
4415 }
4416
4417 len = btrfs_file_extent_num_bytes(leaf, extent);
4418
4419 if (key.offset + len > i_size)
4420 return 0;
4421 hole_start = key.offset + len;
4422 hole_size = i_size - hole_start;
4423 }
4424 btrfs_release_path(path);
4425
4426
4427 if (hole_size == 0)
4428 return 0;
4429
4430 hole_size = ALIGN(hole_size, root->sectorsize);
4431 ret = btrfs_insert_file_extent(trans, log, ino, hole_start, 0, 0,
4432 hole_size, 0, hole_size, 0, 0, 0);
4433 return ret;
4434}
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478static int btrfs_check_ref_name_override(struct extent_buffer *eb,
4479 const int slot,
4480 const struct btrfs_key *key,
4481 struct inode *inode,
4482 u64 *other_ino)
4483{
4484 int ret;
4485 struct btrfs_path *search_path;
4486 char *name = NULL;
4487 u32 name_len = 0;
4488 u32 item_size = btrfs_item_size_nr(eb, slot);
4489 u32 cur_offset = 0;
4490 unsigned long ptr = btrfs_item_ptr_offset(eb, slot);
4491
4492 search_path = btrfs_alloc_path();
4493 if (!search_path)
4494 return -ENOMEM;
4495 search_path->search_commit_root = 1;
4496 search_path->skip_locking = 1;
4497
4498 while (cur_offset < item_size) {
4499 u64 parent;
4500 u32 this_name_len;
4501 u32 this_len;
4502 unsigned long name_ptr;
4503 struct btrfs_dir_item *di;
4504
4505 if (key->type == BTRFS_INODE_REF_KEY) {
4506 struct btrfs_inode_ref *iref;
4507
4508 iref = (struct btrfs_inode_ref *)(ptr + cur_offset);
4509 parent = key->offset;
4510 this_name_len = btrfs_inode_ref_name_len(eb, iref);
4511 name_ptr = (unsigned long)(iref + 1);
4512 this_len = sizeof(*iref) + this_name_len;
4513 } else {
4514 struct btrfs_inode_extref *extref;
4515
4516 extref = (struct btrfs_inode_extref *)(ptr +
4517 cur_offset);
4518 parent = btrfs_inode_extref_parent(eb, extref);
4519 this_name_len = btrfs_inode_extref_name_len(eb, extref);
4520 name_ptr = (unsigned long)&extref->name;
4521 this_len = sizeof(*extref) + this_name_len;
4522 }
4523
4524 if (this_name_len > name_len) {
4525 char *new_name;
4526
4527 new_name = krealloc(name, this_name_len, GFP_NOFS);
4528 if (!new_name) {
4529 ret = -ENOMEM;
4530 goto out;
4531 }
4532 name_len = this_name_len;
4533 name = new_name;
4534 }
4535
4536 read_extent_buffer(eb, name, name_ptr, this_name_len);
4537 di = btrfs_lookup_dir_item(NULL, BTRFS_I(inode)->root,
4538 search_path, parent,
4539 name, this_name_len, 0);
4540 if (di && !IS_ERR(di)) {
4541 struct btrfs_key di_key;
4542
4543 btrfs_dir_item_key_to_cpu(search_path->nodes[0],
4544 di, &di_key);
4545 if (di_key.type == BTRFS_INODE_ITEM_KEY) {
4546 ret = 1;
4547 *other_ino = di_key.objectid;
4548 } else {
4549 ret = -EAGAIN;
4550 }
4551 goto out;
4552 } else if (IS_ERR(di)) {
4553 ret = PTR_ERR(di);
4554 goto out;
4555 }
4556 btrfs_release_path(search_path);
4557
4558 cur_offset += this_len;
4559 }
4560 ret = 0;
4561out:
4562 btrfs_free_path(search_path);
4563 kfree(name);
4564 return ret;
4565}
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581static int btrfs_log_inode(struct btrfs_trans_handle *trans,
4582 struct btrfs_root *root, struct inode *inode,
4583 int inode_only,
4584 const loff_t start,
4585 const loff_t end,
4586 struct btrfs_log_ctx *ctx)
4587{
4588 struct btrfs_path *path;
4589 struct btrfs_path *dst_path;
4590 struct btrfs_key min_key;
4591 struct btrfs_key max_key;
4592 struct btrfs_root *log = root->log_root;
4593 struct extent_buffer *src = NULL;
4594 LIST_HEAD(logged_list);
4595 u64 last_extent = 0;
4596 int err = 0;
4597 int ret;
4598 int nritems;
4599 int ins_start_slot = 0;
4600 int ins_nr;
4601 bool fast_search = false;
4602 u64 ino = btrfs_ino(inode);
4603 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
4604 u64 logged_isize = 0;
4605 bool need_log_inode_item = true;
4606
4607 path = btrfs_alloc_path();
4608 if (!path)
4609 return -ENOMEM;
4610 dst_path = btrfs_alloc_path();
4611 if (!dst_path) {
4612 btrfs_free_path(path);
4613 return -ENOMEM;
4614 }
4615
4616 min_key.objectid = ino;
4617 min_key.type = BTRFS_INODE_ITEM_KEY;
4618 min_key.offset = 0;
4619
4620 max_key.objectid = ino;
4621
4622
4623
4624 if (S_ISDIR(inode->i_mode) ||
4625 (!test_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
4626 &BTRFS_I(inode)->runtime_flags) &&
4627 inode_only == LOG_INODE_EXISTS))
4628 max_key.type = BTRFS_XATTR_ITEM_KEY;
4629 else
4630 max_key.type = (u8)-1;
4631 max_key.offset = (u64)-1;
4632
4633
4634
4635
4636
4637
4638
4639 if (S_ISDIR(inode->i_mode) ||
4640 BTRFS_I(inode)->generation > root->fs_info->last_trans_committed)
4641 ret = btrfs_commit_inode_delayed_items(trans, inode);
4642 else
4643 ret = btrfs_commit_inode_delayed_inode(inode);
4644
4645 if (ret) {
4646 btrfs_free_path(path);
4647 btrfs_free_path(dst_path);
4648 return ret;
4649 }
4650
4651 mutex_lock(&BTRFS_I(inode)->log_mutex);
4652
4653
4654
4655
4656
4657 if (S_ISDIR(inode->i_mode)) {
4658 int max_key_type = BTRFS_DIR_LOG_INDEX_KEY;
4659
4660 if (inode_only == LOG_INODE_EXISTS)
4661 max_key_type = BTRFS_XATTR_ITEM_KEY;
4662 ret = drop_objectid_items(trans, log, path, ino, max_key_type);
4663 } else {
4664 if (inode_only == LOG_INODE_EXISTS) {
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678 err = logged_inode_size(log, inode, path,
4679 &logged_isize);
4680 if (err)
4681 goto out_unlock;
4682 }
4683 if (test_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
4684 &BTRFS_I(inode)->runtime_flags)) {
4685 if (inode_only == LOG_INODE_EXISTS) {
4686 max_key.type = BTRFS_XATTR_ITEM_KEY;
4687 ret = drop_objectid_items(trans, log, path, ino,
4688 max_key.type);
4689 } else {
4690 clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
4691 &BTRFS_I(inode)->runtime_flags);
4692 clear_bit(BTRFS_INODE_COPY_EVERYTHING,
4693 &BTRFS_I(inode)->runtime_flags);
4694 while(1) {
4695 ret = btrfs_truncate_inode_items(trans,
4696 log, inode, 0, 0);
4697 if (ret != -EAGAIN)
4698 break;
4699 }
4700 }
4701 } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
4702 &BTRFS_I(inode)->runtime_flags) ||
4703 inode_only == LOG_INODE_EXISTS) {
4704 if (inode_only == LOG_INODE_ALL)
4705 fast_search = true;
4706 max_key.type = BTRFS_XATTR_ITEM_KEY;
4707 ret = drop_objectid_items(trans, log, path, ino,
4708 max_key.type);
4709 } else {
4710 if (inode_only == LOG_INODE_ALL)
4711 fast_search = true;
4712 goto log_extents;
4713 }
4714
4715 }
4716 if (ret) {
4717 err = ret;
4718 goto out_unlock;
4719 }
4720
4721 while (1) {
4722 ins_nr = 0;
4723 ret = btrfs_search_forward(root, &min_key,
4724 path, trans->transid);
4725 if (ret < 0) {
4726 err = ret;
4727 goto out_unlock;
4728 }
4729 if (ret != 0)
4730 break;
4731again:
4732
4733 if (min_key.objectid != ino)
4734 break;
4735 if (min_key.type > max_key.type)
4736 break;
4737
4738 if (min_key.type == BTRFS_INODE_ITEM_KEY)
4739 need_log_inode_item = false;
4740
4741 if ((min_key.type == BTRFS_INODE_REF_KEY ||
4742 min_key.type == BTRFS_INODE_EXTREF_KEY) &&
4743 BTRFS_I(inode)->generation == trans->transid) {
4744 u64 other_ino = 0;
4745
4746 ret = btrfs_check_ref_name_override(path->nodes[0],
4747 path->slots[0],
4748 &min_key, inode,
4749 &other_ino);
4750 if (ret < 0) {
4751 err = ret;
4752 goto out_unlock;
4753 } else if (ret > 0 && ctx &&
4754 other_ino != btrfs_ino(ctx->inode)) {
4755 struct btrfs_key inode_key;
4756 struct inode *other_inode;
4757
4758 if (ins_nr > 0) {
4759 ins_nr++;
4760 } else {
4761 ins_nr = 1;
4762 ins_start_slot = path->slots[0];
4763 }
4764 ret = copy_items(trans, inode, dst_path, path,
4765 &last_extent, ins_start_slot,
4766 ins_nr, inode_only,
4767 logged_isize);
4768 if (ret < 0) {
4769 err = ret;
4770 goto out_unlock;
4771 }
4772 ins_nr = 0;
4773 btrfs_release_path(path);
4774 inode_key.objectid = other_ino;
4775 inode_key.type = BTRFS_INODE_ITEM_KEY;
4776 inode_key.offset = 0;
4777 other_inode = btrfs_iget(root->fs_info->sb,
4778 &inode_key, root,
4779 NULL);
4780
4781
4782
4783
4784
4785
4786 if (IS_ERR(other_inode) &&
4787 PTR_ERR(other_inode) == -ENOENT) {
4788 goto next_key;
4789 } else if (IS_ERR(other_inode)) {
4790 err = PTR_ERR(other_inode);
4791 goto out_unlock;
4792 }
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802 err = btrfs_log_inode(trans, root, other_inode,
4803 LOG_INODE_EXISTS,
4804 0, LLONG_MAX, ctx);
4805 iput(other_inode);
4806 if (err)
4807 goto out_unlock;
4808 else
4809 goto next_key;
4810 }
4811 }
4812
4813
4814 if (min_key.type == BTRFS_XATTR_ITEM_KEY) {
4815 if (ins_nr == 0)
4816 goto next_slot;
4817 ret = copy_items(trans, inode, dst_path, path,
4818 &last_extent, ins_start_slot,
4819 ins_nr, inode_only, logged_isize);
4820 if (ret < 0) {
4821 err = ret;
4822 goto out_unlock;
4823 }
4824 ins_nr = 0;
4825 if (ret) {
4826 btrfs_release_path(path);
4827 continue;
4828 }
4829 goto next_slot;
4830 }
4831
4832 src = path->nodes[0];
4833 if (ins_nr && ins_start_slot + ins_nr == path->slots[0]) {
4834 ins_nr++;
4835 goto next_slot;
4836 } else if (!ins_nr) {
4837 ins_start_slot = path->slots[0];
4838 ins_nr = 1;
4839 goto next_slot;
4840 }
4841
4842 ret = copy_items(trans, inode, dst_path, path, &last_extent,
4843 ins_start_slot, ins_nr, inode_only,
4844 logged_isize);
4845 if (ret < 0) {
4846 err = ret;
4847 goto out_unlock;
4848 }
4849 if (ret) {
4850 ins_nr = 0;
4851 btrfs_release_path(path);
4852 continue;
4853 }
4854 ins_nr = 1;
4855 ins_start_slot = path->slots[0];
4856next_slot:
4857
4858 nritems = btrfs_header_nritems(path->nodes[0]);
4859 path->slots[0]++;
4860 if (path->slots[0] < nritems) {
4861 btrfs_item_key_to_cpu(path->nodes[0], &min_key,
4862 path->slots[0]);
4863 goto again;
4864 }
4865 if (ins_nr) {
4866 ret = copy_items(trans, inode, dst_path, path,
4867 &last_extent, ins_start_slot,
4868 ins_nr, inode_only, logged_isize);
4869 if (ret < 0) {
4870 err = ret;
4871 goto out_unlock;
4872 }
4873 ret = 0;
4874 ins_nr = 0;
4875 }
4876 btrfs_release_path(path);
4877next_key:
4878 if (min_key.offset < (u64)-1) {
4879 min_key.offset++;
4880 } else if (min_key.type < max_key.type) {
4881 min_key.type++;
4882 min_key.offset = 0;
4883 } else {
4884 break;
4885 }
4886 }
4887 if (ins_nr) {
4888 ret = copy_items(trans, inode, dst_path, path, &last_extent,
4889 ins_start_slot, ins_nr, inode_only,
4890 logged_isize);
4891 if (ret < 0) {
4892 err = ret;
4893 goto out_unlock;
4894 }
4895 ret = 0;
4896 ins_nr = 0;
4897 }
4898
4899 btrfs_release_path(path);
4900 btrfs_release_path(dst_path);
4901 err = btrfs_log_all_xattrs(trans, root, inode, path, dst_path);
4902 if (err)
4903 goto out_unlock;
4904 if (max_key.type >= BTRFS_EXTENT_DATA_KEY && !fast_search) {
4905 btrfs_release_path(path);
4906 btrfs_release_path(dst_path);
4907 err = btrfs_log_trailing_hole(trans, root, inode, path);
4908 if (err)
4909 goto out_unlock;
4910 }
4911log_extents:
4912 btrfs_release_path(path);
4913 btrfs_release_path(dst_path);
4914 if (need_log_inode_item) {
4915 err = log_inode_item(trans, log, dst_path, inode);
4916 if (err)
4917 goto out_unlock;
4918 }
4919 if (fast_search) {
4920 ret = btrfs_log_changed_extents(trans, root, inode, dst_path,
4921 &logged_list, ctx, start, end);
4922 if (ret) {
4923 err = ret;
4924 goto out_unlock;
4925 }
4926 } else if (inode_only == LOG_INODE_ALL) {
4927 struct extent_map *em, *n;
4928
4929 write_lock(&em_tree->lock);
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948 list_for_each_entry_safe(em, n, &em_tree->modified_extents,
4949 list) {
4950 const u64 mod_end = em->mod_start + em->mod_len - 1;
4951
4952 if (em->mod_start >= start && mod_end <= end)
4953 list_del_init(&em->list);
4954 }
4955 write_unlock(&em_tree->lock);
4956 }
4957
4958 if (inode_only == LOG_INODE_ALL && S_ISDIR(inode->i_mode)) {
4959 ret = log_directory_changes(trans, root, inode, path, dst_path,
4960 ctx);
4961 if (ret) {
4962 err = ret;
4963 goto out_unlock;
4964 }
4965 }
4966
4967 spin_lock(&BTRFS_I(inode)->lock);
4968 BTRFS_I(inode)->logged_trans = trans->transid;
4969 BTRFS_I(inode)->last_log_commit = BTRFS_I(inode)->last_sub_trans;
4970 spin_unlock(&BTRFS_I(inode)->lock);
4971out_unlock:
4972 if (unlikely(err))
4973 btrfs_put_logged_extents(&logged_list);
4974 else
4975 btrfs_submit_logged_extents(&logged_list, log);
4976 mutex_unlock(&BTRFS_I(inode)->log_mutex);
4977
4978 btrfs_free_path(path);
4979 btrfs_free_path(dst_path);
4980 return err;
4981}
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999static bool btrfs_must_commit_transaction(struct btrfs_trans_handle *trans,
5000 struct inode *inode)
5001{
5002 struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
5003 bool ret = false;
5004
5005 mutex_lock(&BTRFS_I(inode)->log_mutex);
5006 if (BTRFS_I(inode)->last_unlink_trans > fs_info->last_trans_committed) {
5007
5008
5009
5010
5011 btrfs_set_log_full_commit(fs_info, trans);
5012 ret = true;
5013 }
5014 mutex_unlock(&BTRFS_I(inode)->log_mutex);
5015
5016 return ret;
5017}
5018
5019
5020
5021
5022
5023
5024
5025static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans,
5026 struct inode *inode,
5027 struct dentry *parent,
5028 struct super_block *sb,
5029 u64 last_committed)
5030{
5031 int ret = 0;
5032 struct dentry *old_parent = NULL;
5033 struct inode *orig_inode = inode;
5034
5035
5036
5037
5038
5039
5040
5041 if (S_ISREG(inode->i_mode) &&
5042 BTRFS_I(inode)->generation <= last_committed &&
5043 BTRFS_I(inode)->last_unlink_trans <= last_committed)
5044 goto out;
5045
5046 if (!S_ISDIR(inode->i_mode)) {
5047 if (!parent || d_really_is_negative(parent) || sb != parent->d_sb)
5048 goto out;
5049 inode = d_inode(parent);
5050 }
5051
5052 while (1) {
5053
5054
5055
5056
5057
5058
5059 if (inode != orig_inode)
5060 BTRFS_I(inode)->logged_trans = trans->transid;
5061 smp_mb();
5062
5063 if (btrfs_must_commit_transaction(trans, inode)) {
5064 ret = 1;
5065 break;
5066 }
5067
5068 if (!parent || d_really_is_negative(parent) || sb != parent->d_sb)
5069 break;
5070
5071 if (IS_ROOT(parent)) {
5072 inode = d_inode(parent);
5073 if (btrfs_must_commit_transaction(trans, inode))
5074 ret = 1;
5075 break;
5076 }
5077
5078 parent = dget_parent(parent);
5079 dput(old_parent);
5080 old_parent = parent;
5081 inode = d_inode(parent);
5082
5083 }
5084 dput(old_parent);
5085out:
5086 return ret;
5087}
5088
5089struct btrfs_dir_list {
5090 u64 ino;
5091 struct list_head list;
5092};
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136static int log_new_dir_dentries(struct btrfs_trans_handle *trans,
5137 struct btrfs_root *root,
5138 struct inode *start_inode,
5139 struct btrfs_log_ctx *ctx)
5140{
5141 struct btrfs_root *log = root->log_root;
5142 struct btrfs_path *path;
5143 LIST_HEAD(dir_list);
5144 struct btrfs_dir_list *dir_elem;
5145 int ret = 0;
5146
5147 path = btrfs_alloc_path();
5148 if (!path)
5149 return -ENOMEM;
5150
5151 dir_elem = kmalloc(sizeof(*dir_elem), GFP_NOFS);
5152 if (!dir_elem) {
5153 btrfs_free_path(path);
5154 return -ENOMEM;
5155 }
5156 dir_elem->ino = btrfs_ino(start_inode);
5157 list_add_tail(&dir_elem->list, &dir_list);
5158
5159 while (!list_empty(&dir_list)) {
5160 struct extent_buffer *leaf;
5161 struct btrfs_key min_key;
5162 int nritems;
5163 int i;
5164
5165 dir_elem = list_first_entry(&dir_list, struct btrfs_dir_list,
5166 list);
5167 if (ret)
5168 goto next_dir_inode;
5169
5170 min_key.objectid = dir_elem->ino;
5171 min_key.type = BTRFS_DIR_ITEM_KEY;
5172 min_key.offset = 0;
5173again:
5174 btrfs_release_path(path);
5175 ret = btrfs_search_forward(log, &min_key, path, trans->transid);
5176 if (ret < 0) {
5177 goto next_dir_inode;
5178 } else if (ret > 0) {
5179 ret = 0;
5180 goto next_dir_inode;
5181 }
5182
5183process_leaf:
5184 leaf = path->nodes[0];
5185 nritems = btrfs_header_nritems(leaf);
5186 for (i = path->slots[0]; i < nritems; i++) {
5187 struct btrfs_dir_item *di;
5188 struct btrfs_key di_key;
5189 struct inode *di_inode;
5190 struct btrfs_dir_list *new_dir_elem;
5191 int log_mode = LOG_INODE_EXISTS;
5192 int type;
5193
5194 btrfs_item_key_to_cpu(leaf, &min_key, i);
5195 if (min_key.objectid != dir_elem->ino ||
5196 min_key.type != BTRFS_DIR_ITEM_KEY)
5197 goto next_dir_inode;
5198
5199 di = btrfs_item_ptr(leaf, i, struct btrfs_dir_item);
5200 type = btrfs_dir_type(leaf, di);
5201 if (btrfs_dir_transid(leaf, di) < trans->transid &&
5202 type != BTRFS_FT_DIR)
5203 continue;
5204 btrfs_dir_item_key_to_cpu(leaf, di, &di_key);
5205 if (di_key.type == BTRFS_ROOT_ITEM_KEY)
5206 continue;
5207
5208 di_inode = btrfs_iget(root->fs_info->sb, &di_key,
5209 root, NULL);
5210 if (IS_ERR(di_inode)) {
5211 ret = PTR_ERR(di_inode);
5212 goto next_dir_inode;
5213 }
5214
5215 if (btrfs_inode_in_log(di_inode, trans->transid)) {
5216 iput(di_inode);
5217 continue;
5218 }
5219
5220 ctx->log_new_dentries = false;
5221 if (type == BTRFS_FT_DIR || type == BTRFS_FT_SYMLINK)
5222 log_mode = LOG_INODE_ALL;
5223 btrfs_release_path(path);
5224 ret = btrfs_log_inode(trans, root, di_inode,
5225 log_mode, 0, LLONG_MAX, ctx);
5226 if (!ret &&
5227 btrfs_must_commit_transaction(trans, di_inode))
5228 ret = 1;
5229 iput(di_inode);
5230 if (ret)
5231 goto next_dir_inode;
5232 if (ctx->log_new_dentries) {
5233 new_dir_elem = kmalloc(sizeof(*new_dir_elem),
5234 GFP_NOFS);
5235 if (!new_dir_elem) {
5236 ret = -ENOMEM;
5237 goto next_dir_inode;
5238 }
5239 new_dir_elem->ino = di_key.objectid;
5240 list_add_tail(&new_dir_elem->list, &dir_list);
5241 }
5242 break;
5243 }
5244 if (i == nritems) {
5245 ret = btrfs_next_leaf(log, path);
5246 if (ret < 0) {
5247 goto next_dir_inode;
5248 } else if (ret > 0) {
5249 ret = 0;
5250 goto next_dir_inode;
5251 }
5252 goto process_leaf;
5253 }
5254 if (min_key.offset < (u64)-1) {
5255 min_key.offset++;
5256 goto again;
5257 }
5258next_dir_inode:
5259 list_del(&dir_elem->list);
5260 kfree(dir_elem);
5261 }
5262
5263 btrfs_free_path(path);
5264 return ret;
5265}
5266
5267static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
5268 struct inode *inode,
5269 struct btrfs_log_ctx *ctx)
5270{
5271 int ret;
5272 struct btrfs_path *path;
5273 struct btrfs_key key;
5274 struct btrfs_root *root = BTRFS_I(inode)->root;
5275 const u64 ino = btrfs_ino(inode);
5276
5277 path = btrfs_alloc_path();
5278 if (!path)
5279 return -ENOMEM;
5280 path->skip_locking = 1;
5281 path->search_commit_root = 1;
5282
5283 key.objectid = ino;
5284 key.type = BTRFS_INODE_REF_KEY;
5285 key.offset = 0;
5286 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
5287 if (ret < 0)
5288 goto out;
5289
5290 while (true) {
5291 struct extent_buffer *leaf = path->nodes[0];
5292 int slot = path->slots[0];
5293 u32 cur_offset = 0;
5294 u32 item_size;
5295 unsigned long ptr;
5296
5297 if (slot >= btrfs_header_nritems(leaf)) {
5298 ret = btrfs_next_leaf(root, path);
5299 if (ret < 0)
5300 goto out;
5301 else if (ret > 0)
5302 break;
5303 continue;
5304 }
5305
5306 btrfs_item_key_to_cpu(leaf, &key, slot);
5307
5308 if (key.objectid != ino || key.type > BTRFS_INODE_EXTREF_KEY)
5309 break;
5310
5311 item_size = btrfs_item_size_nr(leaf, slot);
5312 ptr = btrfs_item_ptr_offset(leaf, slot);
5313 while (cur_offset < item_size) {
5314 struct btrfs_key inode_key;
5315 struct inode *dir_inode;
5316
5317 inode_key.type = BTRFS_INODE_ITEM_KEY;
5318 inode_key.offset = 0;
5319
5320 if (key.type == BTRFS_INODE_EXTREF_KEY) {
5321 struct btrfs_inode_extref *extref;
5322
5323 extref = (struct btrfs_inode_extref *)
5324 (ptr + cur_offset);
5325 inode_key.objectid = btrfs_inode_extref_parent(
5326 leaf, extref);
5327 cur_offset += sizeof(*extref);
5328 cur_offset += btrfs_inode_extref_name_len(leaf,
5329 extref);
5330 } else {
5331 inode_key.objectid = key.offset;
5332 cur_offset = item_size;
5333 }
5334
5335 dir_inode = btrfs_iget(root->fs_info->sb, &inode_key,
5336 root, NULL);
5337
5338 if (IS_ERR(dir_inode))
5339 continue;
5340
5341 if (ctx)
5342 ctx->log_new_dentries = false;
5343 ret = btrfs_log_inode(trans, root, dir_inode,
5344 LOG_INODE_ALL, 0, LLONG_MAX, ctx);
5345 if (!ret &&
5346 btrfs_must_commit_transaction(trans, dir_inode))
5347 ret = 1;
5348 if (!ret && ctx && ctx->log_new_dentries)
5349 ret = log_new_dir_dentries(trans, root,
5350 dir_inode, ctx);
5351 iput(dir_inode);
5352 if (ret)
5353 goto out;
5354 }
5355 path->slots[0]++;
5356 }
5357 ret = 0;
5358out:
5359 btrfs_free_path(path);
5360 return ret;
5361}
5362
5363
5364
5365
5366
5367
5368
5369static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
5370 struct btrfs_root *root, struct inode *inode,
5371 struct dentry *parent,
5372 const loff_t start,
5373 const loff_t end,
5374 int exists_only,
5375 struct btrfs_log_ctx *ctx)
5376{
5377 int inode_only = exists_only ? LOG_INODE_EXISTS : LOG_INODE_ALL;
5378 struct super_block *sb;
5379 struct dentry *old_parent = NULL;
5380 int ret = 0;
5381 u64 last_committed = root->fs_info->last_trans_committed;
5382 bool log_dentries = false;
5383 struct inode *orig_inode = inode;
5384
5385 sb = inode->i_sb;
5386
5387 if (btrfs_test_opt(root->fs_info, NOTREELOG)) {
5388 ret = 1;
5389 goto end_no_trans;
5390 }
5391
5392
5393
5394
5395
5396 if (root->fs_info->last_trans_log_full_commit >
5397 root->fs_info->last_trans_committed) {
5398 ret = 1;
5399 goto end_no_trans;
5400 }
5401
5402 if (root != BTRFS_I(inode)->root ||
5403 btrfs_root_refs(&root->root_item) == 0) {
5404 ret = 1;
5405 goto end_no_trans;
5406 }
5407
5408 ret = check_parent_dirs_for_sync(trans, inode, parent,
5409 sb, last_committed);
5410 if (ret)
5411 goto end_no_trans;
5412
5413 if (btrfs_inode_in_log(inode, trans->transid)) {
5414 ret = BTRFS_NO_LOG_SYNC;
5415 goto end_no_trans;
5416 }
5417
5418 ret = start_log_trans(trans, root, ctx);
5419 if (ret)
5420 goto end_no_trans;
5421
5422 ret = btrfs_log_inode(trans, root, inode, inode_only, start, end, ctx);
5423 if (ret)
5424 goto end_trans;
5425
5426
5427
5428
5429
5430
5431
5432 if (S_ISREG(inode->i_mode) &&
5433 BTRFS_I(inode)->generation <= last_committed &&
5434 BTRFS_I(inode)->last_unlink_trans <= last_committed) {
5435 ret = 0;
5436 goto end_trans;
5437 }
5438
5439 if (S_ISDIR(inode->i_mode) && ctx && ctx->log_new_dentries)
5440 log_dentries = true;
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483 if (BTRFS_I(inode)->last_unlink_trans > last_committed) {
5484 ret = btrfs_log_all_parents(trans, orig_inode, ctx);
5485 if (ret)
5486 goto end_trans;
5487 }
5488
5489 while (1) {
5490 if (!parent || d_really_is_negative(parent) || sb != parent->d_sb)
5491 break;
5492
5493 inode = d_inode(parent);
5494 if (root != BTRFS_I(inode)->root)
5495 break;
5496
5497 if (BTRFS_I(inode)->generation > last_committed) {
5498 ret = btrfs_log_inode(trans, root, inode,
5499 LOG_INODE_EXISTS,
5500 0, LLONG_MAX, ctx);
5501 if (ret)
5502 goto end_trans;
5503 }
5504 if (IS_ROOT(parent))
5505 break;
5506
5507 parent = dget_parent(parent);
5508 dput(old_parent);
5509 old_parent = parent;
5510 }
5511 if (log_dentries)
5512 ret = log_new_dir_dentries(trans, root, orig_inode, ctx);
5513 else
5514 ret = 0;
5515end_trans:
5516 dput(old_parent);
5517 if (ret < 0) {
5518 btrfs_set_log_full_commit(root->fs_info, trans);
5519 ret = 1;
5520 }
5521
5522 if (ret)
5523 btrfs_remove_log_ctx(root, ctx);
5524 btrfs_end_log_trans(root);
5525end_no_trans:
5526 return ret;
5527}
5528
5529
5530
5531
5532
5533
5534
5535int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans,
5536 struct btrfs_root *root, struct dentry *dentry,
5537 const loff_t start,
5538 const loff_t end,
5539 struct btrfs_log_ctx *ctx)
5540{
5541 struct dentry *parent = dget_parent(dentry);
5542 int ret;
5543
5544 ret = btrfs_log_inode_parent(trans, root, d_inode(dentry), parent,
5545 start, end, 0, ctx);
5546 dput(parent);
5547
5548 return ret;
5549}
5550
5551
5552
5553
5554
5555int btrfs_recover_log_trees(struct btrfs_root *log_root_tree)
5556{
5557 int ret;
5558 struct btrfs_path *path;
5559 struct btrfs_trans_handle *trans;
5560 struct btrfs_key key;
5561 struct btrfs_key found_key;
5562 struct btrfs_key tmp_key;
5563 struct btrfs_root *log;
5564 struct btrfs_fs_info *fs_info = log_root_tree->fs_info;
5565 struct walk_control wc = {
5566 .process_func = process_one_buffer,
5567 .stage = 0,
5568 };
5569
5570 path = btrfs_alloc_path();
5571 if (!path)
5572 return -ENOMEM;
5573
5574 set_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags);
5575
5576 trans = btrfs_start_transaction(fs_info->tree_root, 0);
5577 if (IS_ERR(trans)) {
5578 ret = PTR_ERR(trans);
5579 goto error;
5580 }
5581
5582 wc.trans = trans;
5583 wc.pin = 1;
5584
5585 ret = walk_log_tree(trans, log_root_tree, &wc);
5586 if (ret) {
5587 btrfs_handle_fs_error(fs_info, ret,
5588 "Failed to pin buffers while recovering log root tree.");
5589 goto error;
5590 }
5591
5592again:
5593 key.objectid = BTRFS_TREE_LOG_OBJECTID;
5594 key.offset = (u64)-1;
5595 key.type = BTRFS_ROOT_ITEM_KEY;
5596
5597 while (1) {
5598 ret = btrfs_search_slot(NULL, log_root_tree, &key, path, 0, 0);
5599
5600 if (ret < 0) {
5601 btrfs_handle_fs_error(fs_info, ret,
5602 "Couldn't find tree log root.");
5603 goto error;
5604 }
5605 if (ret > 0) {
5606 if (path->slots[0] == 0)
5607 break;
5608 path->slots[0]--;
5609 }
5610 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
5611 path->slots[0]);
5612 btrfs_release_path(path);
5613 if (found_key.objectid != BTRFS_TREE_LOG_OBJECTID)
5614 break;
5615
5616 log = btrfs_read_fs_root(log_root_tree, &found_key);
5617 if (IS_ERR(log)) {
5618 ret = PTR_ERR(log);
5619 btrfs_handle_fs_error(fs_info, ret,
5620 "Couldn't read tree log root.");
5621 goto error;
5622 }
5623
5624 tmp_key.objectid = found_key.offset;
5625 tmp_key.type = BTRFS_ROOT_ITEM_KEY;
5626 tmp_key.offset = (u64)-1;
5627
5628 wc.replay_dest = btrfs_read_fs_root_no_name(fs_info, &tmp_key);
5629 if (IS_ERR(wc.replay_dest)) {
5630 ret = PTR_ERR(wc.replay_dest);
5631 free_extent_buffer(log->node);
5632 free_extent_buffer(log->commit_root);
5633 kfree(log);
5634 btrfs_handle_fs_error(fs_info, ret,
5635 "Couldn't read target root for tree log recovery.");
5636 goto error;
5637 }
5638
5639 wc.replay_dest->log_root = log;
5640 btrfs_record_root_in_trans(trans, wc.replay_dest);
5641 ret = walk_log_tree(trans, log, &wc);
5642
5643 if (!ret && wc.stage == LOG_WALK_REPLAY_ALL) {
5644 ret = fixup_inode_link_counts(trans, wc.replay_dest,
5645 path);
5646 }
5647
5648 key.offset = found_key.offset - 1;
5649 wc.replay_dest->log_root = NULL;
5650 free_extent_buffer(log->node);
5651 free_extent_buffer(log->commit_root);
5652 kfree(log);
5653
5654 if (ret)
5655 goto error;
5656
5657 if (found_key.offset == 0)
5658 break;
5659 }
5660 btrfs_release_path(path);
5661
5662
5663 if (wc.pin) {
5664 wc.pin = 0;
5665 wc.process_func = replay_one_buffer;
5666 wc.stage = LOG_WALK_REPLAY_INODES;
5667 goto again;
5668 }
5669
5670 if (wc.stage < LOG_WALK_REPLAY_ALL) {
5671 wc.stage++;
5672 goto again;
5673 }
5674
5675 btrfs_free_path(path);
5676
5677
5678 ret = btrfs_commit_transaction(trans, fs_info->tree_root);
5679 if (ret)
5680 return ret;
5681
5682 free_extent_buffer(log_root_tree->node);
5683 log_root_tree->log_root = NULL;
5684 clear_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags);
5685 kfree(log_root_tree);
5686
5687 return 0;
5688error:
5689 if (wc.trans)
5690 btrfs_end_transaction(wc.trans, fs_info->tree_root);
5691 btrfs_free_path(path);
5692 return ret;
5693}
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans,
5707 struct inode *dir, struct inode *inode,
5708 int for_rename)
5709{
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720 mutex_lock(&BTRFS_I(inode)->log_mutex);
5721 BTRFS_I(inode)->last_unlink_trans = trans->transid;
5722 mutex_unlock(&BTRFS_I(inode)->log_mutex);
5723
5724
5725
5726
5727
5728 smp_mb();
5729 if (BTRFS_I(dir)->logged_trans == trans->transid)
5730 return;
5731
5732
5733
5734
5735
5736 if (BTRFS_I(inode)->logged_trans == trans->transid)
5737 return;
5738
5739
5740
5741
5742
5743
5744
5745
5746 if (for_rename)
5747 goto record;
5748
5749
5750 return;
5751
5752record:
5753 mutex_lock(&BTRFS_I(dir)->log_mutex);
5754 BTRFS_I(dir)->last_unlink_trans = trans->transid;
5755 mutex_unlock(&BTRFS_I(dir)->log_mutex);
5756}
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770void btrfs_record_snapshot_destroy(struct btrfs_trans_handle *trans,
5771 struct inode *dir)
5772{
5773 mutex_lock(&BTRFS_I(dir)->log_mutex);
5774 BTRFS_I(dir)->last_unlink_trans = trans->transid;
5775 mutex_unlock(&BTRFS_I(dir)->log_mutex);
5776}
5777
5778
5779
5780
5781
5782
5783
5784
5785int btrfs_log_new_name(struct btrfs_trans_handle *trans,
5786 struct inode *inode, struct inode *old_dir,
5787 struct dentry *parent)
5788{
5789 struct btrfs_root * root = BTRFS_I(inode)->root;
5790
5791
5792
5793
5794
5795 if (S_ISREG(inode->i_mode))
5796 BTRFS_I(inode)->last_unlink_trans = trans->transid;
5797
5798
5799
5800
5801
5802 if (BTRFS_I(inode)->logged_trans <=
5803 root->fs_info->last_trans_committed &&
5804 (!old_dir || BTRFS_I(old_dir)->logged_trans <=
5805 root->fs_info->last_trans_committed))
5806 return 0;
5807
5808 return btrfs_log_inode_parent(trans, root, inode, parent, 0,
5809 LLONG_MAX, 1, NULL);
5810}
5811
5812