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
30
31
32
33
34
35
36#define LOG_INODE_ALL 0
37#define LOG_INODE_EXISTS 1
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91#define LOG_WALK_PIN_ONLY 0
92#define LOG_WALK_REPLAY_INODES 1
93#define LOG_WALK_REPLAY_DIR_INDEX 2
94#define LOG_WALK_REPLAY_ALL 3
95
96static int btrfs_log_inode(struct btrfs_trans_handle *trans,
97 struct btrfs_root *root, struct inode *inode,
98 int inode_only,
99 const loff_t start,
100 const loff_t end,
101 struct btrfs_log_ctx *ctx);
102static int link_to_fixup_dir(struct btrfs_trans_handle *trans,
103 struct btrfs_root *root,
104 struct btrfs_path *path, u64 objectid);
105static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
106 struct btrfs_root *root,
107 struct btrfs_root *log,
108 struct btrfs_path *path,
109 u64 dirid, int del_all);
110
111
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
139static int start_log_trans(struct btrfs_trans_handle *trans,
140 struct btrfs_root *root,
141 struct btrfs_log_ctx *ctx)
142{
143 int index;
144 int ret;
145
146 mutex_lock(&root->log_mutex);
147 if (root->log_root) {
148 if (btrfs_need_log_full_commit(root->fs_info, trans)) {
149 ret = -EAGAIN;
150 goto out;
151 }
152 if (!root->log_start_pid) {
153 root->log_start_pid = current->pid;
154 clear_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state);
155 } else if (root->log_start_pid != current->pid) {
156 set_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state);
157 }
158
159 atomic_inc(&root->log_batch);
160 atomic_inc(&root->log_writers);
161 if (ctx) {
162 index = root->log_transid % 2;
163 list_add_tail(&ctx->list, &root->log_ctxs[index]);
164 ctx->log_transid = root->log_transid;
165 }
166 mutex_unlock(&root->log_mutex);
167 return 0;
168 }
169
170 ret = 0;
171 mutex_lock(&root->fs_info->tree_log_mutex);
172 if (!root->fs_info->log_root_tree)
173 ret = btrfs_init_log_root_tree(trans, root->fs_info);
174 mutex_unlock(&root->fs_info->tree_log_mutex);
175 if (ret)
176 goto out;
177
178 if (!root->log_root) {
179 ret = btrfs_add_log_tree(trans, root);
180 if (ret)
181 goto out;
182 }
183 clear_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state);
184 root->log_start_pid = current->pid;
185 atomic_inc(&root->log_batch);
186 atomic_inc(&root->log_writers);
187 if (ctx) {
188 index = root->log_transid % 2;
189 list_add_tail(&ctx->list, &root->log_ctxs[index]);
190 ctx->log_transid = root->log_transid;
191 }
192out:
193 mutex_unlock(&root->log_mutex);
194 return ret;
195}
196
197
198
199
200
201
202static int join_running_log_trans(struct btrfs_root *root)
203{
204 int ret = -ENOENT;
205
206 smp_mb();
207 if (!root->log_root)
208 return -ENOENT;
209
210 mutex_lock(&root->log_mutex);
211 if (root->log_root) {
212 ret = 0;
213 atomic_inc(&root->log_writers);
214 }
215 mutex_unlock(&root->log_mutex);
216 return ret;
217}
218
219
220
221
222
223
224int btrfs_pin_log_trans(struct btrfs_root *root)
225{
226 int ret = -ENOENT;
227
228 mutex_lock(&root->log_mutex);
229 atomic_inc(&root->log_writers);
230 mutex_unlock(&root->log_mutex);
231 return ret;
232}
233
234
235
236
237
238void btrfs_end_log_trans(struct btrfs_root *root)
239{
240 if (atomic_dec_and_test(&root->log_writers)) {
241 smp_mb();
242 if (waitqueue_active(&root->log_writer_wait))
243 wake_up(&root->log_writer_wait);
244 }
245}
246
247
248
249
250
251
252
253
254struct walk_control {
255
256
257
258 int free;
259
260
261
262
263 int write;
264
265
266
267
268 int wait;
269
270
271
272
273 int pin;
274
275
276 int stage;
277
278
279 struct btrfs_root *replay_dest;
280
281
282 struct btrfs_trans_handle *trans;
283
284
285
286
287
288
289 int (*process_func)(struct btrfs_root *log, struct extent_buffer *eb,
290 struct walk_control *wc, u64 gen);
291};
292
293
294
295
296static int process_one_buffer(struct btrfs_root *log,
297 struct extent_buffer *eb,
298 struct walk_control *wc, u64 gen)
299{
300 int ret = 0;
301
302
303
304
305
306 if (btrfs_fs_incompat(log->fs_info, MIXED_GROUPS)) {
307 ret = btrfs_read_buffer(eb, gen);
308 if (ret)
309 return ret;
310 }
311
312 if (wc->pin)
313 ret = btrfs_pin_extent_for_log_replay(log->fs_info->extent_root,
314 eb->start, eb->len);
315
316 if (!ret && btrfs_buffer_uptodate(eb, gen, 0)) {
317 if (wc->pin && btrfs_header_level(eb) == 0)
318 ret = btrfs_exclude_logged_extents(log, eb);
319 if (wc->write)
320 btrfs_write_tree_block(eb);
321 if (wc->wait)
322 btrfs_wait_tree_block_writeback(eb);
323 }
324 return ret;
325}
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341static noinline int overwrite_item(struct btrfs_trans_handle *trans,
342 struct btrfs_root *root,
343 struct btrfs_path *path,
344 struct extent_buffer *eb, int slot,
345 struct btrfs_key *key)
346{
347 int ret;
348 u32 item_size;
349 u64 saved_i_size = 0;
350 int save_old_i_size = 0;
351 unsigned long src_ptr;
352 unsigned long dst_ptr;
353 int overwrite_root = 0;
354 bool inode_item = key->type == BTRFS_INODE_ITEM_KEY;
355
356 if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID)
357 overwrite_root = 1;
358
359 item_size = btrfs_item_size_nr(eb, slot);
360 src_ptr = btrfs_item_ptr_offset(eb, slot);
361
362
363 ret = btrfs_search_slot(NULL, root, key, path, 0, 0);
364 if (ret < 0)
365 return ret;
366
367 if (ret == 0) {
368 char *src_copy;
369 char *dst_copy;
370 u32 dst_size = btrfs_item_size_nr(path->nodes[0],
371 path->slots[0]);
372 if (dst_size != item_size)
373 goto insert;
374
375 if (item_size == 0) {
376 btrfs_release_path(path);
377 return 0;
378 }
379 dst_copy = kmalloc(item_size, GFP_NOFS);
380 src_copy = kmalloc(item_size, GFP_NOFS);
381 if (!dst_copy || !src_copy) {
382 btrfs_release_path(path);
383 kfree(dst_copy);
384 kfree(src_copy);
385 return -ENOMEM;
386 }
387
388 read_extent_buffer(eb, src_copy, src_ptr, item_size);
389
390 dst_ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
391 read_extent_buffer(path->nodes[0], dst_copy, dst_ptr,
392 item_size);
393 ret = memcmp(dst_copy, src_copy, item_size);
394
395 kfree(dst_copy);
396 kfree(src_copy);
397
398
399
400
401
402
403 if (ret == 0) {
404 btrfs_release_path(path);
405 return 0;
406 }
407
408
409
410
411
412 if (inode_item) {
413 struct btrfs_inode_item *item;
414 u64 nbytes;
415 u32 mode;
416
417 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
418 struct btrfs_inode_item);
419 nbytes = btrfs_inode_nbytes(path->nodes[0], item);
420 item = btrfs_item_ptr(eb, slot,
421 struct btrfs_inode_item);
422 btrfs_set_inode_nbytes(eb, item, nbytes);
423
424
425
426
427
428
429 mode = btrfs_inode_mode(eb, item);
430 if (S_ISDIR(mode))
431 btrfs_set_inode_size(eb, item, 0);
432 }
433 } else if (inode_item) {
434 struct btrfs_inode_item *item;
435 u32 mode;
436
437
438
439
440
441 item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item);
442 btrfs_set_inode_nbytes(eb, item, 0);
443
444
445
446
447
448
449 mode = btrfs_inode_mode(eb, item);
450 if (S_ISDIR(mode))
451 btrfs_set_inode_size(eb, item, 0);
452 }
453insert:
454 btrfs_release_path(path);
455
456 ret = btrfs_insert_empty_item(trans, root, path,
457 key, item_size);
458
459
460 if (ret == -EEXIST) {
461 u32 found_size;
462 found_size = btrfs_item_size_nr(path->nodes[0],
463 path->slots[0]);
464 if (found_size > item_size)
465 btrfs_truncate_item(root, path, item_size, 1);
466 else if (found_size < item_size)
467 btrfs_extend_item(root, path,
468 item_size - found_size);
469 } else if (ret) {
470 return ret;
471 }
472 dst_ptr = btrfs_item_ptr_offset(path->nodes[0],
473 path->slots[0]);
474
475
476
477
478
479
480
481
482
483
484 if (key->type == BTRFS_INODE_ITEM_KEY && ret == -EEXIST) {
485 struct btrfs_inode_item *src_item;
486 struct btrfs_inode_item *dst_item;
487
488 src_item = (struct btrfs_inode_item *)src_ptr;
489 dst_item = (struct btrfs_inode_item *)dst_ptr;
490
491 if (btrfs_inode_generation(eb, src_item) == 0)
492 goto no_copy;
493
494 if (overwrite_root &&
495 S_ISDIR(btrfs_inode_mode(eb, src_item)) &&
496 S_ISDIR(btrfs_inode_mode(path->nodes[0], dst_item))) {
497 save_old_i_size = 1;
498 saved_i_size = btrfs_inode_size(path->nodes[0],
499 dst_item);
500 }
501 }
502
503 copy_extent_buffer(path->nodes[0], eb, dst_ptr,
504 src_ptr, item_size);
505
506 if (save_old_i_size) {
507 struct btrfs_inode_item *dst_item;
508 dst_item = (struct btrfs_inode_item *)dst_ptr;
509 btrfs_set_inode_size(path->nodes[0], dst_item, saved_i_size);
510 }
511
512
513 if (key->type == BTRFS_INODE_ITEM_KEY) {
514 struct btrfs_inode_item *dst_item;
515 dst_item = (struct btrfs_inode_item *)dst_ptr;
516 if (btrfs_inode_generation(path->nodes[0], dst_item) == 0) {
517 btrfs_set_inode_generation(path->nodes[0], dst_item,
518 trans->transid);
519 }
520 }
521no_copy:
522 btrfs_mark_buffer_dirty(path->nodes[0]);
523 btrfs_release_path(path);
524 return 0;
525}
526
527
528
529
530
531static noinline struct inode *read_one_inode(struct btrfs_root *root,
532 u64 objectid)
533{
534 struct btrfs_key key;
535 struct inode *inode;
536
537 key.objectid = objectid;
538 key.type = BTRFS_INODE_ITEM_KEY;
539 key.offset = 0;
540 inode = btrfs_iget(root->fs_info->sb, &key, root, NULL);
541 if (IS_ERR(inode)) {
542 inode = NULL;
543 } else if (is_bad_inode(inode)) {
544 iput(inode);
545 inode = NULL;
546 }
547 return inode;
548}
549
550
551
552
553
554
555
556
557
558
559
560
561
562static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
563 struct btrfs_root *root,
564 struct btrfs_path *path,
565 struct extent_buffer *eb, int slot,
566 struct btrfs_key *key)
567{
568 int found_type;
569 u64 extent_end;
570 u64 start = key->offset;
571 u64 nbytes = 0;
572 struct btrfs_file_extent_item *item;
573 struct inode *inode = NULL;
574 unsigned long size;
575 int ret = 0;
576
577 item = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
578 found_type = btrfs_file_extent_type(eb, item);
579
580 if (found_type == BTRFS_FILE_EXTENT_REG ||
581 found_type == BTRFS_FILE_EXTENT_PREALLOC) {
582 nbytes = btrfs_file_extent_num_bytes(eb, item);
583 extent_end = start + nbytes;
584
585
586
587
588
589 if (btrfs_file_extent_disk_bytenr(eb, item) == 0)
590 nbytes = 0;
591 } else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
592 size = btrfs_file_extent_inline_len(eb, slot, item);
593 nbytes = btrfs_file_extent_ram_bytes(eb, item);
594 extent_end = ALIGN(start + size, root->sectorsize);
595 } else {
596 ret = 0;
597 goto out;
598 }
599
600 inode = read_one_inode(root, key->objectid);
601 if (!inode) {
602 ret = -EIO;
603 goto out;
604 }
605
606
607
608
609
610
611 ret = btrfs_lookup_file_extent(trans, root, path, btrfs_ino(inode),
612 start, 0);
613
614 if (ret == 0 &&
615 (found_type == BTRFS_FILE_EXTENT_REG ||
616 found_type == BTRFS_FILE_EXTENT_PREALLOC)) {
617 struct btrfs_file_extent_item cmp1;
618 struct btrfs_file_extent_item cmp2;
619 struct btrfs_file_extent_item *existing;
620 struct extent_buffer *leaf;
621
622 leaf = path->nodes[0];
623 existing = btrfs_item_ptr(leaf, path->slots[0],
624 struct btrfs_file_extent_item);
625
626 read_extent_buffer(eb, &cmp1, (unsigned long)item,
627 sizeof(cmp1));
628 read_extent_buffer(leaf, &cmp2, (unsigned long)existing,
629 sizeof(cmp2));
630
631
632
633
634
635 if (memcmp(&cmp1, &cmp2, sizeof(cmp1)) == 0) {
636 btrfs_release_path(path);
637 goto out;
638 }
639 }
640 btrfs_release_path(path);
641
642
643 ret = btrfs_drop_extents(trans, root, inode, start, extent_end, 1);
644 if (ret)
645 goto out;
646
647 if (found_type == BTRFS_FILE_EXTENT_REG ||
648 found_type == BTRFS_FILE_EXTENT_PREALLOC) {
649 u64 offset;
650 unsigned long dest_offset;
651 struct btrfs_key ins;
652
653 ret = btrfs_insert_empty_item(trans, root, path, key,
654 sizeof(*item));
655 if (ret)
656 goto out;
657 dest_offset = btrfs_item_ptr_offset(path->nodes[0],
658 path->slots[0]);
659 copy_extent_buffer(path->nodes[0], eb, dest_offset,
660 (unsigned long)item, sizeof(*item));
661
662 ins.objectid = btrfs_file_extent_disk_bytenr(eb, item);
663 ins.offset = btrfs_file_extent_disk_num_bytes(eb, item);
664 ins.type = BTRFS_EXTENT_ITEM_KEY;
665 offset = key->offset - btrfs_file_extent_offset(eb, item);
666
667 if (ins.objectid > 0) {
668 u64 csum_start;
669 u64 csum_end;
670 LIST_HEAD(ordered_sums);
671
672
673
674
675 ret = btrfs_lookup_data_extent(root, ins.objectid,
676 ins.offset);
677 if (ret == 0) {
678 ret = btrfs_inc_extent_ref(trans, root,
679 ins.objectid, ins.offset,
680 0, root->root_key.objectid,
681 key->objectid, offset, 0);
682 if (ret)
683 goto out;
684 } else {
685
686
687
688
689 ret = btrfs_alloc_logged_file_extent(trans,
690 root, root->root_key.objectid,
691 key->objectid, offset, &ins);
692 if (ret)
693 goto out;
694 }
695 btrfs_release_path(path);
696
697 if (btrfs_file_extent_compression(eb, item)) {
698 csum_start = ins.objectid;
699 csum_end = csum_start + ins.offset;
700 } else {
701 csum_start = ins.objectid +
702 btrfs_file_extent_offset(eb, item);
703 csum_end = csum_start +
704 btrfs_file_extent_num_bytes(eb, item);
705 }
706
707 ret = btrfs_lookup_csums_range(root->log_root,
708 csum_start, csum_end - 1,
709 &ordered_sums, 0);
710 if (ret)
711 goto out;
712 while (!list_empty(&ordered_sums)) {
713 struct btrfs_ordered_sum *sums;
714 sums = list_entry(ordered_sums.next,
715 struct btrfs_ordered_sum,
716 list);
717 if (!ret)
718 ret = btrfs_csum_file_blocks(trans,
719 root->fs_info->csum_root,
720 sums);
721 list_del(&sums->list);
722 kfree(sums);
723 }
724 if (ret)
725 goto out;
726 } else {
727 btrfs_release_path(path);
728 }
729 } else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
730
731 ret = overwrite_item(trans, root, path, eb, slot, key);
732 if (ret)
733 goto out;
734 }
735
736 inode_add_bytes(inode, nbytes);
737 ret = btrfs_update_inode(trans, root, inode);
738out:
739 if (inode)
740 iput(inode);
741 return ret;
742}
743
744
745
746
747
748
749
750
751
752static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,
753 struct btrfs_root *root,
754 struct btrfs_path *path,
755 struct inode *dir,
756 struct btrfs_dir_item *di)
757{
758 struct inode *inode;
759 char *name;
760 int name_len;
761 struct extent_buffer *leaf;
762 struct btrfs_key location;
763 int ret;
764
765 leaf = path->nodes[0];
766
767 btrfs_dir_item_key_to_cpu(leaf, di, &location);
768 name_len = btrfs_dir_name_len(leaf, di);
769 name = kmalloc(name_len, GFP_NOFS);
770 if (!name)
771 return -ENOMEM;
772
773 read_extent_buffer(leaf, name, (unsigned long)(di + 1), name_len);
774 btrfs_release_path(path);
775
776 inode = read_one_inode(root, location.objectid);
777 if (!inode) {
778 ret = -EIO;
779 goto out;
780 }
781
782 ret = link_to_fixup_dir(trans, root, path, location.objectid);
783 if (ret)
784 goto out;
785
786 ret = btrfs_unlink_inode(trans, root, dir, inode, name, name_len);
787 if (ret)
788 goto out;
789 else
790 ret = btrfs_run_delayed_items(trans, root);
791out:
792 kfree(name);
793 iput(inode);
794 return ret;
795}
796
797
798
799
800
801
802static noinline int inode_in_dir(struct btrfs_root *root,
803 struct btrfs_path *path,
804 u64 dirid, u64 objectid, u64 index,
805 const char *name, int name_len)
806{
807 struct btrfs_dir_item *di;
808 struct btrfs_key location;
809 int match = 0;
810
811 di = btrfs_lookup_dir_index_item(NULL, root, path, dirid,
812 index, name, name_len, 0);
813 if (di && !IS_ERR(di)) {
814 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
815 if (location.objectid != objectid)
816 goto out;
817 } else
818 goto out;
819 btrfs_release_path(path);
820
821 di = btrfs_lookup_dir_item(NULL, root, path, dirid, name, name_len, 0);
822 if (di && !IS_ERR(di)) {
823 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
824 if (location.objectid != objectid)
825 goto out;
826 } else
827 goto out;
828 match = 1;
829out:
830 btrfs_release_path(path);
831 return match;
832}
833
834
835
836
837
838
839
840
841
842
843
844static noinline int backref_in_log(struct btrfs_root *log,
845 struct btrfs_key *key,
846 u64 ref_objectid,
847 char *name, int namelen)
848{
849 struct btrfs_path *path;
850 struct btrfs_inode_ref *ref;
851 unsigned long ptr;
852 unsigned long ptr_end;
853 unsigned long name_ptr;
854 int found_name_len;
855 int item_size;
856 int ret;
857 int match = 0;
858
859 path = btrfs_alloc_path();
860 if (!path)
861 return -ENOMEM;
862
863 ret = btrfs_search_slot(NULL, log, key, path, 0, 0);
864 if (ret != 0)
865 goto out;
866
867 ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
868
869 if (key->type == BTRFS_INODE_EXTREF_KEY) {
870 if (btrfs_find_name_in_ext_backref(path, ref_objectid,
871 name, namelen, NULL))
872 match = 1;
873
874 goto out;
875 }
876
877 item_size = btrfs_item_size_nr(path->nodes[0], path->slots[0]);
878 ptr_end = ptr + item_size;
879 while (ptr < ptr_end) {
880 ref = (struct btrfs_inode_ref *)ptr;
881 found_name_len = btrfs_inode_ref_name_len(path->nodes[0], ref);
882 if (found_name_len == namelen) {
883 name_ptr = (unsigned long)(ref + 1);
884 ret = memcmp_extent_buffer(path->nodes[0], name,
885 name_ptr, namelen);
886 if (ret == 0) {
887 match = 1;
888 goto out;
889 }
890 }
891 ptr = (unsigned long)(ref + 1) + found_name_len;
892 }
893out:
894 btrfs_free_path(path);
895 return match;
896}
897
898static inline int __add_inode_ref(struct btrfs_trans_handle *trans,
899 struct btrfs_root *root,
900 struct btrfs_path *path,
901 struct btrfs_root *log_root,
902 struct inode *dir, struct inode *inode,
903 struct extent_buffer *eb,
904 u64 inode_objectid, u64 parent_objectid,
905 u64 ref_index, char *name, int namelen,
906 int *search_done)
907{
908 int ret;
909 char *victim_name;
910 int victim_name_len;
911 struct extent_buffer *leaf;
912 struct btrfs_dir_item *di;
913 struct btrfs_key search_key;
914 struct btrfs_inode_extref *extref;
915
916again:
917
918 search_key.objectid = inode_objectid;
919 search_key.type = BTRFS_INODE_REF_KEY;
920 search_key.offset = parent_objectid;
921 ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
922 if (ret == 0) {
923 struct btrfs_inode_ref *victim_ref;
924 unsigned long ptr;
925 unsigned long ptr_end;
926
927 leaf = path->nodes[0];
928
929
930
931
932 if (search_key.objectid == search_key.offset)
933 return 1;
934
935
936
937
938
939 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
940 ptr_end = ptr + btrfs_item_size_nr(leaf, path->slots[0]);
941 while (ptr < ptr_end) {
942 victim_ref = (struct btrfs_inode_ref *)ptr;
943 victim_name_len = btrfs_inode_ref_name_len(leaf,
944 victim_ref);
945 victim_name = kmalloc(victim_name_len, GFP_NOFS);
946 if (!victim_name)
947 return -ENOMEM;
948
949 read_extent_buffer(leaf, victim_name,
950 (unsigned long)(victim_ref + 1),
951 victim_name_len);
952
953 if (!backref_in_log(log_root, &search_key,
954 parent_objectid,
955 victim_name,
956 victim_name_len)) {
957 inc_nlink(inode);
958 btrfs_release_path(path);
959
960 ret = btrfs_unlink_inode(trans, root, dir,
961 inode, victim_name,
962 victim_name_len);
963 kfree(victim_name);
964 if (ret)
965 return ret;
966 ret = btrfs_run_delayed_items(trans, root);
967 if (ret)
968 return ret;
969 *search_done = 1;
970 goto again;
971 }
972 kfree(victim_name);
973
974 ptr = (unsigned long)(victim_ref + 1) + victim_name_len;
975 }
976
977
978
979
980
981 *search_done = 1;
982 }
983 btrfs_release_path(path);
984
985
986 extref = btrfs_lookup_inode_extref(NULL, root, path, name, namelen,
987 inode_objectid, parent_objectid, 0,
988 0);
989 if (!IS_ERR_OR_NULL(extref)) {
990 u32 item_size;
991 u32 cur_offset = 0;
992 unsigned long base;
993 struct inode *victim_parent;
994
995 leaf = path->nodes[0];
996
997 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
998 base = btrfs_item_ptr_offset(leaf, path->slots[0]);
999
1000 while (cur_offset < item_size) {
1001 extref = (struct btrfs_inode_extref *)base + cur_offset;
1002
1003 victim_name_len = btrfs_inode_extref_name_len(leaf, extref);
1004
1005 if (btrfs_inode_extref_parent(leaf, extref) != parent_objectid)
1006 goto next;
1007
1008 victim_name = kmalloc(victim_name_len, GFP_NOFS);
1009 if (!victim_name)
1010 return -ENOMEM;
1011 read_extent_buffer(leaf, victim_name, (unsigned long)&extref->name,
1012 victim_name_len);
1013
1014 search_key.objectid = inode_objectid;
1015 search_key.type = BTRFS_INODE_EXTREF_KEY;
1016 search_key.offset = btrfs_extref_hash(parent_objectid,
1017 victim_name,
1018 victim_name_len);
1019 ret = 0;
1020 if (!backref_in_log(log_root, &search_key,
1021 parent_objectid, victim_name,
1022 victim_name_len)) {
1023 ret = -ENOENT;
1024 victim_parent = read_one_inode(root,
1025 parent_objectid);
1026 if (victim_parent) {
1027 inc_nlink(inode);
1028 btrfs_release_path(path);
1029
1030 ret = btrfs_unlink_inode(trans, root,
1031 victim_parent,
1032 inode,
1033 victim_name,
1034 victim_name_len);
1035 if (!ret)
1036 ret = btrfs_run_delayed_items(
1037 trans, root);
1038 }
1039 iput(victim_parent);
1040 kfree(victim_name);
1041 if (ret)
1042 return ret;
1043 *search_done = 1;
1044 goto again;
1045 }
1046 kfree(victim_name);
1047 if (ret)
1048 return ret;
1049next:
1050 cur_offset += victim_name_len + sizeof(*extref);
1051 }
1052 *search_done = 1;
1053 }
1054 btrfs_release_path(path);
1055
1056
1057 di = btrfs_lookup_dir_index_item(trans, root, path, btrfs_ino(dir),
1058 ref_index, name, namelen, 0);
1059 if (di && !IS_ERR(di)) {
1060 ret = drop_one_dir_item(trans, root, path, dir, di);
1061 if (ret)
1062 return ret;
1063 }
1064 btrfs_release_path(path);
1065
1066
1067 di = btrfs_lookup_dir_item(trans, root, path, btrfs_ino(dir),
1068 name, namelen, 0);
1069 if (di && !IS_ERR(di)) {
1070 ret = drop_one_dir_item(trans, root, path, dir, di);
1071 if (ret)
1072 return ret;
1073 }
1074 btrfs_release_path(path);
1075
1076 return 0;
1077}
1078
1079static int extref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
1080 u32 *namelen, char **name, u64 *index,
1081 u64 *parent_objectid)
1082{
1083 struct btrfs_inode_extref *extref;
1084
1085 extref = (struct btrfs_inode_extref *)ref_ptr;
1086
1087 *namelen = btrfs_inode_extref_name_len(eb, extref);
1088 *name = kmalloc(*namelen, GFP_NOFS);
1089 if (*name == NULL)
1090 return -ENOMEM;
1091
1092 read_extent_buffer(eb, *name, (unsigned long)&extref->name,
1093 *namelen);
1094
1095 *index = btrfs_inode_extref_index(eb, extref);
1096 if (parent_objectid)
1097 *parent_objectid = btrfs_inode_extref_parent(eb, extref);
1098
1099 return 0;
1100}
1101
1102static int ref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
1103 u32 *namelen, char **name, u64 *index)
1104{
1105 struct btrfs_inode_ref *ref;
1106
1107 ref = (struct btrfs_inode_ref *)ref_ptr;
1108
1109 *namelen = btrfs_inode_ref_name_len(eb, ref);
1110 *name = kmalloc(*namelen, GFP_NOFS);
1111 if (*name == NULL)
1112 return -ENOMEM;
1113
1114 read_extent_buffer(eb, *name, (unsigned long)(ref + 1), *namelen);
1115
1116 *index = btrfs_inode_ref_index(eb, ref);
1117
1118 return 0;
1119}
1120
1121
1122
1123
1124
1125
1126
1127static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
1128 struct btrfs_root *root,
1129 struct btrfs_root *log,
1130 struct btrfs_path *path,
1131 struct extent_buffer *eb, int slot,
1132 struct btrfs_key *key)
1133{
1134 struct inode *dir = NULL;
1135 struct inode *inode = NULL;
1136 unsigned long ref_ptr;
1137 unsigned long ref_end;
1138 char *name = NULL;
1139 int namelen;
1140 int ret;
1141 int search_done = 0;
1142 int log_ref_ver = 0;
1143 u64 parent_objectid;
1144 u64 inode_objectid;
1145 u64 ref_index = 0;
1146 int ref_struct_size;
1147
1148 ref_ptr = btrfs_item_ptr_offset(eb, slot);
1149 ref_end = ref_ptr + btrfs_item_size_nr(eb, slot);
1150
1151 if (key->type == BTRFS_INODE_EXTREF_KEY) {
1152 struct btrfs_inode_extref *r;
1153
1154 ref_struct_size = sizeof(struct btrfs_inode_extref);
1155 log_ref_ver = 1;
1156 r = (struct btrfs_inode_extref *)ref_ptr;
1157 parent_objectid = btrfs_inode_extref_parent(eb, r);
1158 } else {
1159 ref_struct_size = sizeof(struct btrfs_inode_ref);
1160 parent_objectid = key->offset;
1161 }
1162 inode_objectid = key->objectid;
1163
1164
1165
1166
1167
1168
1169
1170 dir = read_one_inode(root, parent_objectid);
1171 if (!dir) {
1172 ret = -ENOENT;
1173 goto out;
1174 }
1175
1176 inode = read_one_inode(root, inode_objectid);
1177 if (!inode) {
1178 ret = -EIO;
1179 goto out;
1180 }
1181
1182 while (ref_ptr < ref_end) {
1183 if (log_ref_ver) {
1184 ret = extref_get_fields(eb, ref_ptr, &namelen, &name,
1185 &ref_index, &parent_objectid);
1186
1187
1188
1189
1190 if (!dir)
1191 dir = read_one_inode(root, parent_objectid);
1192 if (!dir) {
1193 ret = -ENOENT;
1194 goto out;
1195 }
1196 } else {
1197 ret = ref_get_fields(eb, ref_ptr, &namelen, &name,
1198 &ref_index);
1199 }
1200 if (ret)
1201 goto out;
1202
1203
1204 if (!inode_in_dir(root, path, btrfs_ino(dir), btrfs_ino(inode),
1205 ref_index, name, namelen)) {
1206
1207
1208
1209
1210
1211
1212
1213
1214 if (!search_done) {
1215 ret = __add_inode_ref(trans, root, path, log,
1216 dir, inode, eb,
1217 inode_objectid,
1218 parent_objectid,
1219 ref_index, name, namelen,
1220 &search_done);
1221 if (ret) {
1222 if (ret == 1)
1223 ret = 0;
1224 goto out;
1225 }
1226 }
1227
1228
1229 ret = btrfs_add_link(trans, dir, inode, name, namelen,
1230 0, ref_index);
1231 if (ret)
1232 goto out;
1233
1234 btrfs_update_inode(trans, root, inode);
1235 }
1236
1237 ref_ptr = (unsigned long)(ref_ptr + ref_struct_size) + namelen;
1238 kfree(name);
1239 name = NULL;
1240 if (log_ref_ver) {
1241 iput(dir);
1242 dir = NULL;
1243 }
1244 }
1245
1246
1247 ret = overwrite_item(trans, root, path, eb, slot, key);
1248out:
1249 btrfs_release_path(path);
1250 kfree(name);
1251 iput(dir);
1252 iput(inode);
1253 return ret;
1254}
1255
1256static int insert_orphan_item(struct btrfs_trans_handle *trans,
1257 struct btrfs_root *root, u64 offset)
1258{
1259 int ret;
1260 ret = btrfs_find_item(root, NULL, BTRFS_ORPHAN_OBJECTID,
1261 offset, BTRFS_ORPHAN_ITEM_KEY, NULL);
1262 if (ret > 0)
1263 ret = btrfs_insert_orphan_item(trans, root, offset);
1264 return ret;
1265}
1266
1267static int count_inode_extrefs(struct btrfs_root *root,
1268 struct inode *inode, struct btrfs_path *path)
1269{
1270 int ret = 0;
1271 int name_len;
1272 unsigned int nlink = 0;
1273 u32 item_size;
1274 u32 cur_offset = 0;
1275 u64 inode_objectid = btrfs_ino(inode);
1276 u64 offset = 0;
1277 unsigned long ptr;
1278 struct btrfs_inode_extref *extref;
1279 struct extent_buffer *leaf;
1280
1281 while (1) {
1282 ret = btrfs_find_one_extref(root, inode_objectid, offset, path,
1283 &extref, &offset);
1284 if (ret)
1285 break;
1286
1287 leaf = path->nodes[0];
1288 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
1289 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
1290
1291 while (cur_offset < item_size) {
1292 extref = (struct btrfs_inode_extref *) (ptr + cur_offset);
1293 name_len = btrfs_inode_extref_name_len(leaf, extref);
1294
1295 nlink++;
1296
1297 cur_offset += name_len + sizeof(*extref);
1298 }
1299
1300 offset++;
1301 btrfs_release_path(path);
1302 }
1303 btrfs_release_path(path);
1304
1305 if (ret < 0)
1306 return ret;
1307 return nlink;
1308}
1309
1310static int count_inode_refs(struct btrfs_root *root,
1311 struct inode *inode, struct btrfs_path *path)
1312{
1313 int ret;
1314 struct btrfs_key key;
1315 unsigned int nlink = 0;
1316 unsigned long ptr;
1317 unsigned long ptr_end;
1318 int name_len;
1319 u64 ino = btrfs_ino(inode);
1320
1321 key.objectid = ino;
1322 key.type = BTRFS_INODE_REF_KEY;
1323 key.offset = (u64)-1;
1324
1325 while (1) {
1326 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1327 if (ret < 0)
1328 break;
1329 if (ret > 0) {
1330 if (path->slots[0] == 0)
1331 break;
1332 path->slots[0]--;
1333 }
1334process_slot:
1335 btrfs_item_key_to_cpu(path->nodes[0], &key,
1336 path->slots[0]);
1337 if (key.objectid != ino ||
1338 key.type != BTRFS_INODE_REF_KEY)
1339 break;
1340 ptr = btrfs_item_ptr_offset(path->nodes[0], path->slots[0]);
1341 ptr_end = ptr + btrfs_item_size_nr(path->nodes[0],
1342 path->slots[0]);
1343 while (ptr < ptr_end) {
1344 struct btrfs_inode_ref *ref;
1345
1346 ref = (struct btrfs_inode_ref *)ptr;
1347 name_len = btrfs_inode_ref_name_len(path->nodes[0],
1348 ref);
1349 ptr = (unsigned long)(ref + 1) + name_len;
1350 nlink++;
1351 }
1352
1353 if (key.offset == 0)
1354 break;
1355 if (path->slots[0] > 0) {
1356 path->slots[0]--;
1357 goto process_slot;
1358 }
1359 key.offset--;
1360 btrfs_release_path(path);
1361 }
1362 btrfs_release_path(path);
1363
1364 return nlink;
1365}
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377static noinline int fixup_inode_link_count(struct btrfs_trans_handle *trans,
1378 struct btrfs_root *root,
1379 struct inode *inode)
1380{
1381 struct btrfs_path *path;
1382 int ret;
1383 u64 nlink = 0;
1384 u64 ino = btrfs_ino(inode);
1385
1386 path = btrfs_alloc_path();
1387 if (!path)
1388 return -ENOMEM;
1389
1390 ret = count_inode_refs(root, inode, path);
1391 if (ret < 0)
1392 goto out;
1393
1394 nlink = ret;
1395
1396 ret = count_inode_extrefs(root, inode, path);
1397 if (ret == -ENOENT)
1398 ret = 0;
1399
1400 if (ret < 0)
1401 goto out;
1402
1403 nlink += ret;
1404
1405 ret = 0;
1406
1407 if (nlink != inode->i_nlink) {
1408 set_nlink(inode, nlink);
1409 btrfs_update_inode(trans, root, inode);
1410 }
1411 BTRFS_I(inode)->index_cnt = (u64)-1;
1412
1413 if (inode->i_nlink == 0) {
1414 if (S_ISDIR(inode->i_mode)) {
1415 ret = replay_dir_deletes(trans, root, NULL, path,
1416 ino, 1);
1417 if (ret)
1418 goto out;
1419 }
1420 ret = insert_orphan_item(trans, root, ino);
1421 }
1422
1423out:
1424 btrfs_free_path(path);
1425 return ret;
1426}
1427
1428static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
1429 struct btrfs_root *root,
1430 struct btrfs_path *path)
1431{
1432 int ret;
1433 struct btrfs_key key;
1434 struct inode *inode;
1435
1436 key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
1437 key.type = BTRFS_ORPHAN_ITEM_KEY;
1438 key.offset = (u64)-1;
1439 while (1) {
1440 ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
1441 if (ret < 0)
1442 break;
1443
1444 if (ret == 1) {
1445 if (path->slots[0] == 0)
1446 break;
1447 path->slots[0]--;
1448 }
1449
1450 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1451 if (key.objectid != BTRFS_TREE_LOG_FIXUP_OBJECTID ||
1452 key.type != BTRFS_ORPHAN_ITEM_KEY)
1453 break;
1454
1455 ret = btrfs_del_item(trans, root, path);
1456 if (ret)
1457 goto out;
1458
1459 btrfs_release_path(path);
1460 inode = read_one_inode(root, key.offset);
1461 if (!inode)
1462 return -EIO;
1463
1464 ret = fixup_inode_link_count(trans, root, inode);
1465 iput(inode);
1466 if (ret)
1467 goto out;
1468
1469
1470
1471
1472
1473
1474 key.offset = (u64)-1;
1475 }
1476 ret = 0;
1477out:
1478 btrfs_release_path(path);
1479 return ret;
1480}
1481
1482
1483
1484
1485
1486
1487
1488static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
1489 struct btrfs_root *root,
1490 struct btrfs_path *path,
1491 u64 objectid)
1492{
1493 struct btrfs_key key;
1494 int ret = 0;
1495 struct inode *inode;
1496
1497 inode = read_one_inode(root, objectid);
1498 if (!inode)
1499 return -EIO;
1500
1501 key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
1502 key.type = BTRFS_ORPHAN_ITEM_KEY;
1503 key.offset = objectid;
1504
1505 ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
1506
1507 btrfs_release_path(path);
1508 if (ret == 0) {
1509 if (!inode->i_nlink)
1510 set_nlink(inode, 1);
1511 else
1512 inc_nlink(inode);
1513 ret = btrfs_update_inode(trans, root, inode);
1514 } else if (ret == -EEXIST) {
1515 ret = 0;
1516 } else {
1517 BUG();
1518 }
1519 iput(inode);
1520
1521 return ret;
1522}
1523
1524
1525
1526
1527
1528
1529static noinline int insert_one_name(struct btrfs_trans_handle *trans,
1530 struct btrfs_root *root,
1531 struct btrfs_path *path,
1532 u64 dirid, u64 index,
1533 char *name, int name_len, u8 type,
1534 struct btrfs_key *location)
1535{
1536 struct inode *inode;
1537 struct inode *dir;
1538 int ret;
1539
1540 inode = read_one_inode(root, location->objectid);
1541 if (!inode)
1542 return -ENOENT;
1543
1544 dir = read_one_inode(root, dirid);
1545 if (!dir) {
1546 iput(inode);
1547 return -EIO;
1548 }
1549
1550 ret = btrfs_add_link(trans, dir, inode, name, name_len, 1, index);
1551
1552
1553
1554 iput(inode);
1555 iput(dir);
1556 return ret;
1557}
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572static noinline int replay_one_name(struct btrfs_trans_handle *trans,
1573 struct btrfs_root *root,
1574 struct btrfs_path *path,
1575 struct extent_buffer *eb,
1576 struct btrfs_dir_item *di,
1577 struct btrfs_key *key)
1578{
1579 char *name;
1580 int name_len;
1581 struct btrfs_dir_item *dst_di;
1582 struct btrfs_key found_key;
1583 struct btrfs_key log_key;
1584 struct inode *dir;
1585 u8 log_type;
1586 int exists;
1587 int ret = 0;
1588 bool update_size = (key->type == BTRFS_DIR_INDEX_KEY);
1589
1590 dir = read_one_inode(root, key->objectid);
1591 if (!dir)
1592 return -EIO;
1593
1594 name_len = btrfs_dir_name_len(eb, di);
1595 name = kmalloc(name_len, GFP_NOFS);
1596 if (!name) {
1597 ret = -ENOMEM;
1598 goto out;
1599 }
1600
1601 log_type = btrfs_dir_type(eb, di);
1602 read_extent_buffer(eb, name, (unsigned long)(di + 1),
1603 name_len);
1604
1605 btrfs_dir_item_key_to_cpu(eb, di, &log_key);
1606 exists = btrfs_lookup_inode(trans, root, path, &log_key, 0);
1607 if (exists == 0)
1608 exists = 1;
1609 else
1610 exists = 0;
1611 btrfs_release_path(path);
1612
1613 if (key->type == BTRFS_DIR_ITEM_KEY) {
1614 dst_di = btrfs_lookup_dir_item(trans, root, path, key->objectid,
1615 name, name_len, 1);
1616 } else if (key->type == BTRFS_DIR_INDEX_KEY) {
1617 dst_di = btrfs_lookup_dir_index_item(trans, root, path,
1618 key->objectid,
1619 key->offset, name,
1620 name_len, 1);
1621 } else {
1622
1623 ret = -EINVAL;
1624 goto out;
1625 }
1626 if (IS_ERR_OR_NULL(dst_di)) {
1627
1628
1629
1630 if (key->type != BTRFS_DIR_INDEX_KEY)
1631 goto out;
1632 goto insert;
1633 }
1634
1635 btrfs_dir_item_key_to_cpu(path->nodes[0], dst_di, &found_key);
1636
1637 if (found_key.objectid == log_key.objectid &&
1638 found_key.type == log_key.type &&
1639 found_key.offset == log_key.offset &&
1640 btrfs_dir_type(path->nodes[0], dst_di) == log_type) {
1641 update_size = false;
1642 goto out;
1643 }
1644
1645
1646
1647
1648
1649 if (!exists)
1650 goto out;
1651
1652 ret = drop_one_dir_item(trans, root, path, dir, dst_di);
1653 if (ret)
1654 goto out;
1655
1656 if (key->type == BTRFS_DIR_INDEX_KEY)
1657 goto insert;
1658out:
1659 btrfs_release_path(path);
1660 if (!ret && update_size) {
1661 btrfs_i_size_write(dir, dir->i_size + name_len * 2);
1662 ret = btrfs_update_inode(trans, root, dir);
1663 }
1664 kfree(name);
1665 iput(dir);
1666 return ret;
1667
1668insert:
1669 btrfs_release_path(path);
1670 ret = insert_one_name(trans, root, path, key->objectid, key->offset,
1671 name, name_len, log_type, &log_key);
1672 if (ret && ret != -ENOENT)
1673 goto out;
1674 update_size = false;
1675 ret = 0;
1676 goto out;
1677}
1678
1679
1680
1681
1682
1683
1684
1685static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans,
1686 struct btrfs_root *root,
1687 struct btrfs_path *path,
1688 struct extent_buffer *eb, int slot,
1689 struct btrfs_key *key)
1690{
1691 int ret;
1692 u32 item_size = btrfs_item_size_nr(eb, slot);
1693 struct btrfs_dir_item *di;
1694 int name_len;
1695 unsigned long ptr;
1696 unsigned long ptr_end;
1697
1698 ptr = btrfs_item_ptr_offset(eb, slot);
1699 ptr_end = ptr + item_size;
1700 while (ptr < ptr_end) {
1701 di = (struct btrfs_dir_item *)ptr;
1702 if (verify_dir_item(root, eb, di))
1703 return -EIO;
1704 name_len = btrfs_dir_name_len(eb, di);
1705 ret = replay_one_name(trans, root, path, eb, di, key);
1706 if (ret)
1707 return ret;
1708 ptr = (unsigned long)(di + 1);
1709 ptr += name_len;
1710 }
1711 return 0;
1712}
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725static noinline int find_dir_range(struct btrfs_root *root,
1726 struct btrfs_path *path,
1727 u64 dirid, int key_type,
1728 u64 *start_ret, u64 *end_ret)
1729{
1730 struct btrfs_key key;
1731 u64 found_end;
1732 struct btrfs_dir_log_item *item;
1733 int ret;
1734 int nritems;
1735
1736 if (*start_ret == (u64)-1)
1737 return 1;
1738
1739 key.objectid = dirid;
1740 key.type = key_type;
1741 key.offset = *start_ret;
1742
1743 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1744 if (ret < 0)
1745 goto out;
1746 if (ret > 0) {
1747 if (path->slots[0] == 0)
1748 goto out;
1749 path->slots[0]--;
1750 }
1751 if (ret != 0)
1752 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1753
1754 if (key.type != key_type || key.objectid != dirid) {
1755 ret = 1;
1756 goto next;
1757 }
1758 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
1759 struct btrfs_dir_log_item);
1760 found_end = btrfs_dir_log_end(path->nodes[0], item);
1761
1762 if (*start_ret >= key.offset && *start_ret <= found_end) {
1763 ret = 0;
1764 *start_ret = key.offset;
1765 *end_ret = found_end;
1766 goto out;
1767 }
1768 ret = 1;
1769next:
1770
1771 nritems = btrfs_header_nritems(path->nodes[0]);
1772 if (path->slots[0] >= nritems) {
1773 ret = btrfs_next_leaf(root, path);
1774 if (ret)
1775 goto out;
1776 } else {
1777 path->slots[0]++;
1778 }
1779
1780 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1781
1782 if (key.type != key_type || key.objectid != dirid) {
1783 ret = 1;
1784 goto out;
1785 }
1786 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
1787 struct btrfs_dir_log_item);
1788 found_end = btrfs_dir_log_end(path->nodes[0], item);
1789 *start_ret = key.offset;
1790 *end_ret = found_end;
1791 ret = 0;
1792out:
1793 btrfs_release_path(path);
1794 return ret;
1795}
1796
1797
1798
1799
1800
1801
1802static noinline int check_item_in_log(struct btrfs_trans_handle *trans,
1803 struct btrfs_root *root,
1804 struct btrfs_root *log,
1805 struct btrfs_path *path,
1806 struct btrfs_path *log_path,
1807 struct inode *dir,
1808 struct btrfs_key *dir_key)
1809{
1810 int ret;
1811 struct extent_buffer *eb;
1812 int slot;
1813 u32 item_size;
1814 struct btrfs_dir_item *di;
1815 struct btrfs_dir_item *log_di;
1816 int name_len;
1817 unsigned long ptr;
1818 unsigned long ptr_end;
1819 char *name;
1820 struct inode *inode;
1821 struct btrfs_key location;
1822
1823again:
1824 eb = path->nodes[0];
1825 slot = path->slots[0];
1826 item_size = btrfs_item_size_nr(eb, slot);
1827 ptr = btrfs_item_ptr_offset(eb, slot);
1828 ptr_end = ptr + item_size;
1829 while (ptr < ptr_end) {
1830 di = (struct btrfs_dir_item *)ptr;
1831 if (verify_dir_item(root, eb, di)) {
1832 ret = -EIO;
1833 goto out;
1834 }
1835
1836 name_len = btrfs_dir_name_len(eb, di);
1837 name = kmalloc(name_len, GFP_NOFS);
1838 if (!name) {
1839 ret = -ENOMEM;
1840 goto out;
1841 }
1842 read_extent_buffer(eb, name, (unsigned long)(di + 1),
1843 name_len);
1844 log_di = NULL;
1845 if (log && dir_key->type == BTRFS_DIR_ITEM_KEY) {
1846 log_di = btrfs_lookup_dir_item(trans, log, log_path,
1847 dir_key->objectid,
1848 name, name_len, 0);
1849 } else if (log && dir_key->type == BTRFS_DIR_INDEX_KEY) {
1850 log_di = btrfs_lookup_dir_index_item(trans, log,
1851 log_path,
1852 dir_key->objectid,
1853 dir_key->offset,
1854 name, name_len, 0);
1855 }
1856 if (!log_di || (IS_ERR(log_di) && PTR_ERR(log_di) == -ENOENT)) {
1857 btrfs_dir_item_key_to_cpu(eb, di, &location);
1858 btrfs_release_path(path);
1859 btrfs_release_path(log_path);
1860 inode = read_one_inode(root, location.objectid);
1861 if (!inode) {
1862 kfree(name);
1863 return -EIO;
1864 }
1865
1866 ret = link_to_fixup_dir(trans, root,
1867 path, location.objectid);
1868 if (ret) {
1869 kfree(name);
1870 iput(inode);
1871 goto out;
1872 }
1873
1874 inc_nlink(inode);
1875 ret = btrfs_unlink_inode(trans, root, dir, inode,
1876 name, name_len);
1877 if (!ret)
1878 ret = btrfs_run_delayed_items(trans, root);
1879 kfree(name);
1880 iput(inode);
1881 if (ret)
1882 goto out;
1883
1884
1885
1886
1887 ret = btrfs_search_slot(NULL, root, dir_key, path,
1888 0, 0);
1889 if (ret == 0)
1890 goto again;
1891 ret = 0;
1892 goto out;
1893 } else if (IS_ERR(log_di)) {
1894 kfree(name);
1895 return PTR_ERR(log_di);
1896 }
1897 btrfs_release_path(log_path);
1898 kfree(name);
1899
1900 ptr = (unsigned long)(di + 1);
1901 ptr += name_len;
1902 }
1903 ret = 0;
1904out:
1905 btrfs_release_path(path);
1906 btrfs_release_path(log_path);
1907 return ret;
1908}
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
1921 struct btrfs_root *root,
1922 struct btrfs_root *log,
1923 struct btrfs_path *path,
1924 u64 dirid, int del_all)
1925{
1926 u64 range_start;
1927 u64 range_end;
1928 int key_type = BTRFS_DIR_LOG_ITEM_KEY;
1929 int ret = 0;
1930 struct btrfs_key dir_key;
1931 struct btrfs_key found_key;
1932 struct btrfs_path *log_path;
1933 struct inode *dir;
1934
1935 dir_key.objectid = dirid;
1936 dir_key.type = BTRFS_DIR_ITEM_KEY;
1937 log_path = btrfs_alloc_path();
1938 if (!log_path)
1939 return -ENOMEM;
1940
1941 dir = read_one_inode(root, dirid);
1942
1943
1944
1945
1946 if (!dir) {
1947 btrfs_free_path(log_path);
1948 return 0;
1949 }
1950again:
1951 range_start = 0;
1952 range_end = 0;
1953 while (1) {
1954 if (del_all)
1955 range_end = (u64)-1;
1956 else {
1957 ret = find_dir_range(log, path, dirid, key_type,
1958 &range_start, &range_end);
1959 if (ret != 0)
1960 break;
1961 }
1962
1963 dir_key.offset = range_start;
1964 while (1) {
1965 int nritems;
1966 ret = btrfs_search_slot(NULL, root, &dir_key, path,
1967 0, 0);
1968 if (ret < 0)
1969 goto out;
1970
1971 nritems = btrfs_header_nritems(path->nodes[0]);
1972 if (path->slots[0] >= nritems) {
1973 ret = btrfs_next_leaf(root, path);
1974 if (ret)
1975 break;
1976 }
1977 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
1978 path->slots[0]);
1979 if (found_key.objectid != dirid ||
1980 found_key.type != dir_key.type)
1981 goto next_type;
1982
1983 if (found_key.offset > range_end)
1984 break;
1985
1986 ret = check_item_in_log(trans, root, log, path,
1987 log_path, dir,
1988 &found_key);
1989 if (ret)
1990 goto out;
1991 if (found_key.offset == (u64)-1)
1992 break;
1993 dir_key.offset = found_key.offset + 1;
1994 }
1995 btrfs_release_path(path);
1996 if (range_end == (u64)-1)
1997 break;
1998 range_start = range_end + 1;
1999 }
2000
2001next_type:
2002 ret = 0;
2003 if (key_type == BTRFS_DIR_LOG_ITEM_KEY) {
2004 key_type = BTRFS_DIR_LOG_INDEX_KEY;
2005 dir_key.type = BTRFS_DIR_INDEX_KEY;
2006 btrfs_release_path(path);
2007 goto again;
2008 }
2009out:
2010 btrfs_release_path(path);
2011 btrfs_free_path(log_path);
2012 iput(dir);
2013 return ret;
2014}
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb,
2028 struct walk_control *wc, u64 gen)
2029{
2030 int nritems;
2031 struct btrfs_path *path;
2032 struct btrfs_root *root = wc->replay_dest;
2033 struct btrfs_key key;
2034 int level;
2035 int i;
2036 int ret;
2037
2038 ret = btrfs_read_buffer(eb, gen);
2039 if (ret)
2040 return ret;
2041
2042 level = btrfs_header_level(eb);
2043
2044 if (level != 0)
2045 return 0;
2046
2047 path = btrfs_alloc_path();
2048 if (!path)
2049 return -ENOMEM;
2050
2051 nritems = btrfs_header_nritems(eb);
2052 for (i = 0; i < nritems; i++) {
2053 btrfs_item_key_to_cpu(eb, &key, i);
2054
2055
2056 if (key.type == BTRFS_INODE_ITEM_KEY &&
2057 wc->stage == LOG_WALK_REPLAY_INODES) {
2058 struct btrfs_inode_item *inode_item;
2059 u32 mode;
2060
2061 inode_item = btrfs_item_ptr(eb, i,
2062 struct btrfs_inode_item);
2063 mode = btrfs_inode_mode(eb, inode_item);
2064 if (S_ISDIR(mode)) {
2065 ret = replay_dir_deletes(wc->trans,
2066 root, log, path, key.objectid, 0);
2067 if (ret)
2068 break;
2069 }
2070 ret = overwrite_item(wc->trans, root, path,
2071 eb, i, &key);
2072 if (ret)
2073 break;
2074
2075
2076
2077
2078
2079 if (S_ISREG(mode)) {
2080 ret = insert_orphan_item(wc->trans, root,
2081 key.objectid);
2082 if (ret)
2083 break;
2084 }
2085
2086 ret = link_to_fixup_dir(wc->trans, root,
2087 path, key.objectid);
2088 if (ret)
2089 break;
2090 }
2091
2092 if (key.type == BTRFS_DIR_INDEX_KEY &&
2093 wc->stage == LOG_WALK_REPLAY_DIR_INDEX) {
2094 ret = replay_one_dir_item(wc->trans, root, path,
2095 eb, i, &key);
2096 if (ret)
2097 break;
2098 }
2099
2100 if (wc->stage < LOG_WALK_REPLAY_ALL)
2101 continue;
2102
2103
2104 if (key.type == BTRFS_XATTR_ITEM_KEY) {
2105 ret = overwrite_item(wc->trans, root, path,
2106 eb, i, &key);
2107 if (ret)
2108 break;
2109 } else if (key.type == BTRFS_INODE_REF_KEY ||
2110 key.type == BTRFS_INODE_EXTREF_KEY) {
2111 ret = add_inode_ref(wc->trans, root, log, path,
2112 eb, i, &key);
2113 if (ret && ret != -ENOENT)
2114 break;
2115 ret = 0;
2116 } else if (key.type == BTRFS_EXTENT_DATA_KEY) {
2117 ret = replay_one_extent(wc->trans, root, path,
2118 eb, i, &key);
2119 if (ret)
2120 break;
2121 } else if (key.type == BTRFS_DIR_ITEM_KEY) {
2122 ret = replay_one_dir_item(wc->trans, root, path,
2123 eb, i, &key);
2124 if (ret)
2125 break;
2126 }
2127 }
2128 btrfs_free_path(path);
2129 return ret;
2130}
2131
2132static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
2133 struct btrfs_root *root,
2134 struct btrfs_path *path, int *level,
2135 struct walk_control *wc)
2136{
2137 u64 root_owner;
2138 u64 bytenr;
2139 u64 ptr_gen;
2140 struct extent_buffer *next;
2141 struct extent_buffer *cur;
2142 struct extent_buffer *parent;
2143 u32 blocksize;
2144 int ret = 0;
2145
2146 WARN_ON(*level < 0);
2147 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2148
2149 while (*level > 0) {
2150 WARN_ON(*level < 0);
2151 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2152 cur = path->nodes[*level];
2153
2154 WARN_ON(btrfs_header_level(cur) != *level);
2155
2156 if (path->slots[*level] >=
2157 btrfs_header_nritems(cur))
2158 break;
2159
2160 bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
2161 ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
2162 blocksize = root->nodesize;
2163
2164 parent = path->nodes[*level];
2165 root_owner = btrfs_header_owner(parent);
2166
2167 next = btrfs_find_create_tree_block(root, bytenr, blocksize);
2168 if (!next)
2169 return -ENOMEM;
2170
2171 if (*level == 1) {
2172 ret = wc->process_func(root, next, wc, ptr_gen);
2173 if (ret) {
2174 free_extent_buffer(next);
2175 return ret;
2176 }
2177
2178 path->slots[*level]++;
2179 if (wc->free) {
2180 ret = btrfs_read_buffer(next, ptr_gen);
2181 if (ret) {
2182 free_extent_buffer(next);
2183 return ret;
2184 }
2185
2186 if (trans) {
2187 btrfs_tree_lock(next);
2188 btrfs_set_lock_blocking(next);
2189 clean_tree_block(trans, root, next);
2190 btrfs_wait_tree_block_writeback(next);
2191 btrfs_tree_unlock(next);
2192 }
2193
2194 WARN_ON(root_owner !=
2195 BTRFS_TREE_LOG_OBJECTID);
2196 ret = btrfs_free_and_pin_reserved_extent(root,
2197 bytenr, blocksize);
2198 if (ret) {
2199 free_extent_buffer(next);
2200 return ret;
2201 }
2202 }
2203 free_extent_buffer(next);
2204 continue;
2205 }
2206 ret = btrfs_read_buffer(next, ptr_gen);
2207 if (ret) {
2208 free_extent_buffer(next);
2209 return ret;
2210 }
2211
2212 WARN_ON(*level <= 0);
2213 if (path->nodes[*level-1])
2214 free_extent_buffer(path->nodes[*level-1]);
2215 path->nodes[*level-1] = next;
2216 *level = btrfs_header_level(next);
2217 path->slots[*level] = 0;
2218 cond_resched();
2219 }
2220 WARN_ON(*level < 0);
2221 WARN_ON(*level >= BTRFS_MAX_LEVEL);
2222
2223 path->slots[*level] = btrfs_header_nritems(path->nodes[*level]);
2224
2225 cond_resched();
2226 return 0;
2227}
2228
2229static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans,
2230 struct btrfs_root *root,
2231 struct btrfs_path *path, int *level,
2232 struct walk_control *wc)
2233{
2234 u64 root_owner;
2235 int i;
2236 int slot;
2237 int ret;
2238
2239 for (i = *level; i < BTRFS_MAX_LEVEL - 1 && path->nodes[i]; i++) {
2240 slot = path->slots[i];
2241 if (slot + 1 < btrfs_header_nritems(path->nodes[i])) {
2242 path->slots[i]++;
2243 *level = i;
2244 WARN_ON(*level == 0);
2245 return 0;
2246 } else {
2247 struct extent_buffer *parent;
2248 if (path->nodes[*level] == root->node)
2249 parent = path->nodes[*level];
2250 else
2251 parent = path->nodes[*level + 1];
2252
2253 root_owner = btrfs_header_owner(parent);
2254 ret = wc->process_func(root, path->nodes[*level], wc,
2255 btrfs_header_generation(path->nodes[*level]));
2256 if (ret)
2257 return ret;
2258
2259 if (wc->free) {
2260 struct extent_buffer *next;
2261
2262 next = path->nodes[*level];
2263
2264 if (trans) {
2265 btrfs_tree_lock(next);
2266 btrfs_set_lock_blocking(next);
2267 clean_tree_block(trans, root, next);
2268 btrfs_wait_tree_block_writeback(next);
2269 btrfs_tree_unlock(next);
2270 }
2271
2272 WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID);
2273 ret = btrfs_free_and_pin_reserved_extent(root,
2274 path->nodes[*level]->start,
2275 path->nodes[*level]->len);
2276 if (ret)
2277 return ret;
2278 }
2279 free_extent_buffer(path->nodes[*level]);
2280 path->nodes[*level] = NULL;
2281 *level = i + 1;
2282 }
2283 }
2284 return 1;
2285}
2286
2287
2288
2289
2290
2291
2292static int walk_log_tree(struct btrfs_trans_handle *trans,
2293 struct btrfs_root *log, struct walk_control *wc)
2294{
2295 int ret = 0;
2296 int wret;
2297 int level;
2298 struct btrfs_path *path;
2299 int orig_level;
2300
2301 path = btrfs_alloc_path();
2302 if (!path)
2303 return -ENOMEM;
2304
2305 level = btrfs_header_level(log->node);
2306 orig_level = level;
2307 path->nodes[level] = log->node;
2308 extent_buffer_get(log->node);
2309 path->slots[level] = 0;
2310
2311 while (1) {
2312 wret = walk_down_log_tree(trans, log, path, &level, wc);
2313 if (wret > 0)
2314 break;
2315 if (wret < 0) {
2316 ret = wret;
2317 goto out;
2318 }
2319
2320 wret = walk_up_log_tree(trans, log, path, &level, wc);
2321 if (wret > 0)
2322 break;
2323 if (wret < 0) {
2324 ret = wret;
2325 goto out;
2326 }
2327 }
2328
2329
2330 if (path->nodes[orig_level]) {
2331 ret = wc->process_func(log, path->nodes[orig_level], wc,
2332 btrfs_header_generation(path->nodes[orig_level]));
2333 if (ret)
2334 goto out;
2335 if (wc->free) {
2336 struct extent_buffer *next;
2337
2338 next = path->nodes[orig_level];
2339
2340 if (trans) {
2341 btrfs_tree_lock(next);
2342 btrfs_set_lock_blocking(next);
2343 clean_tree_block(trans, log, next);
2344 btrfs_wait_tree_block_writeback(next);
2345 btrfs_tree_unlock(next);
2346 }
2347
2348 WARN_ON(log->root_key.objectid !=
2349 BTRFS_TREE_LOG_OBJECTID);
2350 ret = btrfs_free_and_pin_reserved_extent(log, next->start,
2351 next->len);
2352 if (ret)
2353 goto out;
2354 }
2355 }
2356
2357out:
2358 btrfs_free_path(path);
2359 return ret;
2360}
2361
2362
2363
2364
2365
2366static int update_log_root(struct btrfs_trans_handle *trans,
2367 struct btrfs_root *log)
2368{
2369 int ret;
2370
2371 if (log->log_transid == 1) {
2372
2373 ret = btrfs_insert_root(trans, log->fs_info->log_root_tree,
2374 &log->root_key, &log->root_item);
2375 } else {
2376 ret = btrfs_update_root(trans, log->fs_info->log_root_tree,
2377 &log->root_key, &log->root_item);
2378 }
2379 return ret;
2380}
2381
2382static void wait_log_commit(struct btrfs_trans_handle *trans,
2383 struct btrfs_root *root, int transid)
2384{
2385 DEFINE_WAIT(wait);
2386 int index = transid % 2;
2387
2388
2389
2390
2391
2392
2393 do {
2394 prepare_to_wait(&root->log_commit_wait[index],
2395 &wait, TASK_UNINTERRUPTIBLE);
2396 mutex_unlock(&root->log_mutex);
2397
2398 if (root->log_transid_committed < transid &&
2399 atomic_read(&root->log_commit[index]))
2400 schedule();
2401
2402 finish_wait(&root->log_commit_wait[index], &wait);
2403 mutex_lock(&root->log_mutex);
2404 } while (root->log_transid_committed < transid &&
2405 atomic_read(&root->log_commit[index]));
2406}
2407
2408static void wait_for_writer(struct btrfs_trans_handle *trans,
2409 struct btrfs_root *root)
2410{
2411 DEFINE_WAIT(wait);
2412
2413 while (atomic_read(&root->log_writers)) {
2414 prepare_to_wait(&root->log_writer_wait,
2415 &wait, TASK_UNINTERRUPTIBLE);
2416 mutex_unlock(&root->log_mutex);
2417 if (atomic_read(&root->log_writers))
2418 schedule();
2419 mutex_lock(&root->log_mutex);
2420 finish_wait(&root->log_writer_wait, &wait);
2421 }
2422}
2423
2424static inline void btrfs_remove_log_ctx(struct btrfs_root *root,
2425 struct btrfs_log_ctx *ctx)
2426{
2427 if (!ctx)
2428 return;
2429
2430 mutex_lock(&root->log_mutex);
2431 list_del_init(&ctx->list);
2432 mutex_unlock(&root->log_mutex);
2433}
2434
2435
2436
2437
2438
2439static inline void btrfs_remove_all_log_ctxs(struct btrfs_root *root,
2440 int index, int error)
2441{
2442 struct btrfs_log_ctx *ctx;
2443
2444 if (!error) {
2445 INIT_LIST_HEAD(&root->log_ctxs[index]);
2446 return;
2447 }
2448
2449 list_for_each_entry(ctx, &root->log_ctxs[index], list)
2450 ctx->log_ret = error;
2451
2452 INIT_LIST_HEAD(&root->log_ctxs[index]);
2453}
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467int btrfs_sync_log(struct btrfs_trans_handle *trans,
2468 struct btrfs_root *root, struct btrfs_log_ctx *ctx)
2469{
2470 int index1;
2471 int index2;
2472 int mark;
2473 int ret;
2474 struct btrfs_root *log = root->log_root;
2475 struct btrfs_root *log_root_tree = root->fs_info->log_root_tree;
2476 int log_transid = 0;
2477 struct btrfs_log_ctx root_log_ctx;
2478 struct blk_plug plug;
2479
2480 mutex_lock(&root->log_mutex);
2481 log_transid = ctx->log_transid;
2482 if (root->log_transid_committed >= log_transid) {
2483 mutex_unlock(&root->log_mutex);
2484 return ctx->log_ret;
2485 }
2486
2487 index1 = log_transid % 2;
2488 if (atomic_read(&root->log_commit[index1])) {
2489 wait_log_commit(trans, root, log_transid);
2490 mutex_unlock(&root->log_mutex);
2491 return ctx->log_ret;
2492 }
2493 ASSERT(log_transid == root->log_transid);
2494 atomic_set(&root->log_commit[index1], 1);
2495
2496
2497 if (atomic_read(&root->log_commit[(index1 + 1) % 2]))
2498 wait_log_commit(trans, root, log_transid - 1);
2499
2500 while (1) {
2501 int batch = atomic_read(&root->log_batch);
2502
2503 if (!btrfs_test_opt(root, SSD) &&
2504 test_bit(BTRFS_ROOT_MULTI_LOG_TASKS, &root->state)) {
2505 mutex_unlock(&root->log_mutex);
2506 schedule_timeout_uninterruptible(1);
2507 mutex_lock(&root->log_mutex);
2508 }
2509 wait_for_writer(trans, root);
2510 if (batch == atomic_read(&root->log_batch))
2511 break;
2512 }
2513
2514
2515 if (btrfs_need_log_full_commit(root->fs_info, trans)) {
2516 ret = -EAGAIN;
2517 btrfs_free_logged_extents(log, log_transid);
2518 mutex_unlock(&root->log_mutex);
2519 goto out;
2520 }
2521
2522 if (log_transid % 2 == 0)
2523 mark = EXTENT_DIRTY;
2524 else
2525 mark = EXTENT_NEW;
2526
2527
2528
2529
2530 blk_start_plug(&plug);
2531 ret = btrfs_write_marked_extents(log, &log->dirty_log_pages, mark);
2532 if (ret) {
2533 blk_finish_plug(&plug);
2534 btrfs_abort_transaction(trans, root, ret);
2535 btrfs_free_logged_extents(log, log_transid);
2536 btrfs_set_log_full_commit(root->fs_info, trans);
2537 mutex_unlock(&root->log_mutex);
2538 goto out;
2539 }
2540
2541 btrfs_set_root_node(&log->root_item, log->node);
2542
2543 root->log_transid++;
2544 log->log_transid = root->log_transid;
2545 root->log_start_pid = 0;
2546
2547
2548
2549
2550
2551 mutex_unlock(&root->log_mutex);
2552
2553 btrfs_init_log_ctx(&root_log_ctx);
2554
2555 mutex_lock(&log_root_tree->log_mutex);
2556 atomic_inc(&log_root_tree->log_batch);
2557 atomic_inc(&log_root_tree->log_writers);
2558
2559 index2 = log_root_tree->log_transid % 2;
2560 list_add_tail(&root_log_ctx.list, &log_root_tree->log_ctxs[index2]);
2561 root_log_ctx.log_transid = log_root_tree->log_transid;
2562
2563 mutex_unlock(&log_root_tree->log_mutex);
2564
2565 ret = update_log_root(trans, log);
2566
2567 mutex_lock(&log_root_tree->log_mutex);
2568 if (atomic_dec_and_test(&log_root_tree->log_writers)) {
2569 smp_mb();
2570 if (waitqueue_active(&log_root_tree->log_writer_wait))
2571 wake_up(&log_root_tree->log_writer_wait);
2572 }
2573
2574 if (ret) {
2575 if (!list_empty(&root_log_ctx.list))
2576 list_del_init(&root_log_ctx.list);
2577
2578 blk_finish_plug(&plug);
2579 btrfs_set_log_full_commit(root->fs_info, trans);
2580
2581 if (ret != -ENOSPC) {
2582 btrfs_abort_transaction(trans, root, ret);
2583 mutex_unlock(&log_root_tree->log_mutex);
2584 goto out;
2585 }
2586 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2587 btrfs_free_logged_extents(log, log_transid);
2588 mutex_unlock(&log_root_tree->log_mutex);
2589 ret = -EAGAIN;
2590 goto out;
2591 }
2592
2593 if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) {
2594 blk_finish_plug(&plug);
2595 mutex_unlock(&log_root_tree->log_mutex);
2596 ret = root_log_ctx.log_ret;
2597 goto out;
2598 }
2599
2600 index2 = root_log_ctx.log_transid % 2;
2601 if (atomic_read(&log_root_tree->log_commit[index2])) {
2602 blk_finish_plug(&plug);
2603 ret = btrfs_wait_marked_extents(log, &log->dirty_log_pages,
2604 mark);
2605 btrfs_wait_logged_extents(trans, log, log_transid);
2606 wait_log_commit(trans, log_root_tree,
2607 root_log_ctx.log_transid);
2608 mutex_unlock(&log_root_tree->log_mutex);
2609 if (!ret)
2610 ret = root_log_ctx.log_ret;
2611 goto out;
2612 }
2613 ASSERT(root_log_ctx.log_transid == log_root_tree->log_transid);
2614 atomic_set(&log_root_tree->log_commit[index2], 1);
2615
2616 if (atomic_read(&log_root_tree->log_commit[(index2 + 1) % 2])) {
2617 wait_log_commit(trans, log_root_tree,
2618 root_log_ctx.log_transid - 1);
2619 }
2620
2621 wait_for_writer(trans, log_root_tree);
2622
2623
2624
2625
2626
2627 if (btrfs_need_log_full_commit(root->fs_info, trans)) {
2628 blk_finish_plug(&plug);
2629 btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2630 btrfs_free_logged_extents(log, log_transid);
2631 mutex_unlock(&log_root_tree->log_mutex);
2632 ret = -EAGAIN;
2633 goto out_wake_log_root;
2634 }
2635
2636 ret = btrfs_write_marked_extents(log_root_tree,
2637 &log_root_tree->dirty_log_pages,
2638 EXTENT_DIRTY | EXTENT_NEW);
2639 blk_finish_plug(&plug);
2640 if (ret) {
2641 btrfs_set_log_full_commit(root->fs_info, trans);
2642 btrfs_abort_transaction(trans, root, ret);
2643 btrfs_free_logged_extents(log, log_transid);
2644 mutex_unlock(&log_root_tree->log_mutex);
2645 goto out_wake_log_root;
2646 }
2647 ret = btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark);
2648 if (!ret)
2649 ret = btrfs_wait_marked_extents(log_root_tree,
2650 &log_root_tree->dirty_log_pages,
2651 EXTENT_NEW | EXTENT_DIRTY);
2652 if (ret) {
2653 btrfs_set_log_full_commit(root->fs_info, trans);
2654 btrfs_free_logged_extents(log, log_transid);
2655 mutex_unlock(&log_root_tree->log_mutex);
2656 goto out_wake_log_root;
2657 }
2658 btrfs_wait_logged_extents(trans, log, log_transid);
2659
2660 btrfs_set_super_log_root(root->fs_info->super_for_commit,
2661 log_root_tree->node->start);
2662 btrfs_set_super_log_root_level(root->fs_info->super_for_commit,
2663 btrfs_header_level(log_root_tree->node));
2664
2665 log_root_tree->log_transid++;
2666 mutex_unlock(&log_root_tree->log_mutex);
2667
2668
2669
2670
2671
2672
2673
2674
2675 ret = write_ctree_super(trans, root->fs_info->tree_root, 1);
2676 if (ret) {
2677 btrfs_set_log_full_commit(root->fs_info, trans);
2678 btrfs_abort_transaction(trans, root, ret);
2679 goto out_wake_log_root;
2680 }
2681
2682 mutex_lock(&root->log_mutex);
2683 if (root->last_log_commit < log_transid)
2684 root->last_log_commit = log_transid;
2685 mutex_unlock(&root->log_mutex);
2686
2687out_wake_log_root:
2688
2689
2690
2691
2692 btrfs_remove_all_log_ctxs(log_root_tree, index2, ret);
2693
2694 mutex_lock(&log_root_tree->log_mutex);
2695 log_root_tree->log_transid_committed++;
2696 atomic_set(&log_root_tree->log_commit[index2], 0);
2697 mutex_unlock(&log_root_tree->log_mutex);
2698
2699 if (waitqueue_active(&log_root_tree->log_commit_wait[index2]))
2700 wake_up(&log_root_tree->log_commit_wait[index2]);
2701out:
2702
2703 btrfs_remove_all_log_ctxs(root, index1, ret);
2704
2705 mutex_lock(&root->log_mutex);
2706 root->log_transid_committed++;
2707 atomic_set(&root->log_commit[index1], 0);
2708 mutex_unlock(&root->log_mutex);
2709
2710 if (waitqueue_active(&root->log_commit_wait[index1]))
2711 wake_up(&root->log_commit_wait[index1]);
2712 return ret;
2713}
2714
2715static void free_log_tree(struct btrfs_trans_handle *trans,
2716 struct btrfs_root *log)
2717{
2718 int ret;
2719 u64 start;
2720 u64 end;
2721 struct walk_control wc = {
2722 .free = 1,
2723 .process_func = process_one_buffer
2724 };
2725
2726 ret = walk_log_tree(trans, log, &wc);
2727
2728 if (ret)
2729 btrfs_abort_transaction(trans, log, ret);
2730
2731 while (1) {
2732 ret = find_first_extent_bit(&log->dirty_log_pages,
2733 0, &start, &end, EXTENT_DIRTY | EXTENT_NEW,
2734 NULL);
2735 if (ret)
2736 break;
2737
2738 clear_extent_bits(&log->dirty_log_pages, start, end,
2739 EXTENT_DIRTY | EXTENT_NEW, GFP_NOFS);
2740 }
2741
2742
2743
2744
2745
2746
2747 btrfs_free_logged_extents(log, 0);
2748 btrfs_free_logged_extents(log, 1);
2749
2750 free_extent_buffer(log->node);
2751 kfree(log);
2752}
2753
2754
2755
2756
2757
2758int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root)
2759{
2760 if (root->log_root) {
2761 free_log_tree(trans, root->log_root);
2762 root->log_root = NULL;
2763 }
2764 return 0;
2765}
2766
2767int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
2768 struct btrfs_fs_info *fs_info)
2769{
2770 if (fs_info->log_root_tree) {
2771 free_log_tree(trans, fs_info->log_root_tree);
2772 fs_info->log_root_tree = NULL;
2773 }
2774 return 0;
2775}
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,
2799 struct btrfs_root *root,
2800 const char *name, int name_len,
2801 struct inode *dir, u64 index)
2802{
2803 struct btrfs_root *log;
2804 struct btrfs_dir_item *di;
2805 struct btrfs_path *path;
2806 int ret;
2807 int err = 0;
2808 int bytes_del = 0;
2809 u64 dir_ino = btrfs_ino(dir);
2810
2811 if (BTRFS_I(dir)->logged_trans < trans->transid)
2812 return 0;
2813
2814 ret = join_running_log_trans(root);
2815 if (ret)
2816 return 0;
2817
2818 mutex_lock(&BTRFS_I(dir)->log_mutex);
2819
2820 log = root->log_root;
2821 path = btrfs_alloc_path();
2822 if (!path) {
2823 err = -ENOMEM;
2824 goto out_unlock;
2825 }
2826
2827 di = btrfs_lookup_dir_item(trans, log, path, dir_ino,
2828 name, name_len, -1);
2829 if (IS_ERR(di)) {
2830 err = PTR_ERR(di);
2831 goto fail;
2832 }
2833 if (di) {
2834 ret = btrfs_delete_one_dir_name(trans, log, path, di);
2835 bytes_del += name_len;
2836 if (ret) {
2837 err = ret;
2838 goto fail;
2839 }
2840 }
2841 btrfs_release_path(path);
2842 di = btrfs_lookup_dir_index_item(trans, log, path, dir_ino,
2843 index, name, name_len, -1);
2844 if (IS_ERR(di)) {
2845 err = PTR_ERR(di);
2846 goto fail;
2847 }
2848 if (di) {
2849 ret = btrfs_delete_one_dir_name(trans, log, path, di);
2850 bytes_del += name_len;
2851 if (ret) {
2852 err = ret;
2853 goto fail;
2854 }
2855 }
2856
2857
2858
2859
2860 if (bytes_del) {
2861 struct btrfs_key key;
2862
2863 key.objectid = dir_ino;
2864 key.offset = 0;
2865 key.type = BTRFS_INODE_ITEM_KEY;
2866 btrfs_release_path(path);
2867
2868 ret = btrfs_search_slot(trans, log, &key, path, 0, 1);
2869 if (ret < 0) {
2870 err = ret;
2871 goto fail;
2872 }
2873 if (ret == 0) {
2874 struct btrfs_inode_item *item;
2875 u64 i_size;
2876
2877 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
2878 struct btrfs_inode_item);
2879 i_size = btrfs_inode_size(path->nodes[0], item);
2880 if (i_size > bytes_del)
2881 i_size -= bytes_del;
2882 else
2883 i_size = 0;
2884 btrfs_set_inode_size(path->nodes[0], item, i_size);
2885 btrfs_mark_buffer_dirty(path->nodes[0]);
2886 } else
2887 ret = 0;
2888 btrfs_release_path(path);
2889 }
2890fail:
2891 btrfs_free_path(path);
2892out_unlock:
2893 mutex_unlock(&BTRFS_I(dir)->log_mutex);
2894 if (ret == -ENOSPC) {
2895 btrfs_set_log_full_commit(root->fs_info, trans);
2896 ret = 0;
2897 } else if (ret < 0)
2898 btrfs_abort_transaction(trans, root, ret);
2899
2900 btrfs_end_log_trans(root);
2901
2902 return err;
2903}
2904
2905
2906int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans,
2907 struct btrfs_root *root,
2908 const char *name, int name_len,
2909 struct inode *inode, u64 dirid)
2910{
2911 struct btrfs_root *log;
2912 u64 index;
2913 int ret;
2914
2915 if (BTRFS_I(inode)->logged_trans < trans->transid)
2916 return 0;
2917
2918 ret = join_running_log_trans(root);
2919 if (ret)
2920 return 0;
2921 log = root->log_root;
2922 mutex_lock(&BTRFS_I(inode)->log_mutex);
2923
2924 ret = btrfs_del_inode_ref(trans, log, name, name_len, btrfs_ino(inode),
2925 dirid, &index);
2926 mutex_unlock(&BTRFS_I(inode)->log_mutex);
2927 if (ret == -ENOSPC) {
2928 btrfs_set_log_full_commit(root->fs_info, trans);
2929 ret = 0;
2930 } else if (ret < 0 && ret != -ENOENT)
2931 btrfs_abort_transaction(trans, root, ret);
2932 btrfs_end_log_trans(root);
2933
2934 return ret;
2935}
2936
2937
2938
2939
2940
2941
2942static noinline int insert_dir_log_key(struct btrfs_trans_handle *trans,
2943 struct btrfs_root *log,
2944 struct btrfs_path *path,
2945 int key_type, u64 dirid,
2946 u64 first_offset, u64 last_offset)
2947{
2948 int ret;
2949 struct btrfs_key key;
2950 struct btrfs_dir_log_item *item;
2951
2952 key.objectid = dirid;
2953 key.offset = first_offset;
2954 if (key_type == BTRFS_DIR_ITEM_KEY)
2955 key.type = BTRFS_DIR_LOG_ITEM_KEY;
2956 else
2957 key.type = BTRFS_DIR_LOG_INDEX_KEY;
2958 ret = btrfs_insert_empty_item(trans, log, path, &key, sizeof(*item));
2959 if (ret)
2960 return ret;
2961
2962 item = btrfs_item_ptr(path->nodes[0], path->slots[0],
2963 struct btrfs_dir_log_item);
2964 btrfs_set_dir_log_end(path->nodes[0], item, last_offset);
2965 btrfs_mark_buffer_dirty(path->nodes[0]);
2966 btrfs_release_path(path);
2967 return 0;
2968}
2969
2970
2971
2972
2973
2974
2975static noinline int log_dir_items(struct btrfs_trans_handle *trans,
2976 struct btrfs_root *root, struct inode *inode,
2977 struct btrfs_path *path,
2978 struct btrfs_path *dst_path, int key_type,
2979 u64 min_offset, u64 *last_offset_ret)
2980{
2981 struct btrfs_key min_key;
2982 struct btrfs_root *log = root->log_root;
2983 struct extent_buffer *src;
2984 int err = 0;
2985 int ret;
2986 int i;
2987 int nritems;
2988 u64 first_offset = min_offset;
2989 u64 last_offset = (u64)-1;
2990 u64 ino = btrfs_ino(inode);
2991
2992 log = root->log_root;
2993
2994 min_key.objectid = ino;
2995 min_key.type = key_type;
2996 min_key.offset = min_offset;
2997
2998 ret = btrfs_search_forward(root, &min_key, path, trans->transid);
2999
3000
3001
3002
3003
3004 if (ret != 0 || min_key.objectid != ino || min_key.type != key_type) {
3005 min_key.objectid = ino;
3006 min_key.type = key_type;
3007 min_key.offset = (u64)-1;
3008 btrfs_release_path(path);
3009 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
3010 if (ret < 0) {
3011 btrfs_release_path(path);
3012 return ret;
3013 }
3014 ret = btrfs_previous_item(root, path, ino, key_type);
3015
3016
3017
3018
3019
3020
3021 if (ret == 0) {
3022 struct btrfs_key tmp;
3023 btrfs_item_key_to_cpu(path->nodes[0], &tmp,
3024 path->slots[0]);
3025 if (key_type == tmp.type)
3026 first_offset = max(min_offset, tmp.offset) + 1;
3027 }
3028 goto done;
3029 }
3030
3031
3032 ret = btrfs_previous_item(root, path, ino, key_type);
3033 if (ret == 0) {
3034 struct btrfs_key tmp;
3035 btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]);
3036 if (key_type == tmp.type) {
3037 first_offset = tmp.offset;
3038 ret = overwrite_item(trans, log, dst_path,
3039 path->nodes[0], path->slots[0],
3040 &tmp);
3041 if (ret) {
3042 err = ret;
3043 goto done;
3044 }
3045 }
3046 }
3047 btrfs_release_path(path);
3048
3049
3050 ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
3051 if (WARN_ON(ret != 0))
3052 goto done;
3053
3054
3055
3056
3057
3058 while (1) {
3059 struct btrfs_key tmp;
3060 src = path->nodes[0];
3061 nritems = btrfs_header_nritems(src);
3062 for (i = path->slots[0]; i < nritems; i++) {
3063 btrfs_item_key_to_cpu(src, &min_key, i);
3064
3065 if (min_key.objectid != ino || min_key.type != key_type)
3066 goto done;
3067 ret = overwrite_item(trans, log, dst_path, src, i,
3068 &min_key);
3069 if (ret) {
3070 err = ret;
3071 goto done;
3072 }
3073 }
3074 path->slots[0] = nritems;
3075
3076
3077
3078
3079
3080 ret = btrfs_next_leaf(root, path);
3081 if (ret == 1) {
3082 last_offset = (u64)-1;
3083 goto done;
3084 }
3085 btrfs_item_key_to_cpu(path->nodes[0], &tmp, path->slots[0]);
3086 if (tmp.objectid != ino || tmp.type != key_type) {
3087 last_offset = (u64)-1;
3088 goto done;
3089 }
3090 if (btrfs_header_generation(path->nodes[0]) != trans->transid) {
3091 ret = overwrite_item(trans, log, dst_path,
3092 path->nodes[0], path->slots[0],
3093 &tmp);
3094 if (ret)
3095 err = ret;
3096 else
3097 last_offset = tmp.offset;
3098 goto done;
3099 }
3100 }
3101done:
3102 btrfs_release_path(path);
3103 btrfs_release_path(dst_path);
3104
3105 if (err == 0) {
3106 *last_offset_ret = last_offset;
3107
3108
3109
3110
3111 ret = insert_dir_log_key(trans, log, path, key_type,
3112 ino, first_offset, last_offset);
3113 if (ret)
3114 err = ret;
3115 }
3116 return err;
3117}
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131static noinline int log_directory_changes(struct btrfs_trans_handle *trans,
3132 struct btrfs_root *root, struct inode *inode,
3133 struct btrfs_path *path,
3134 struct btrfs_path *dst_path)
3135{
3136 u64 min_key;
3137 u64 max_key;
3138 int ret;
3139 int key_type = BTRFS_DIR_ITEM_KEY;
3140
3141again:
3142 min_key = 0;
3143 max_key = 0;
3144 while (1) {
3145 ret = log_dir_items(trans, root, inode, path,
3146 dst_path, key_type, min_key,
3147 &max_key);
3148 if (ret)
3149 return ret;
3150 if (max_key == (u64)-1)
3151 break;
3152 min_key = max_key + 1;
3153 }
3154
3155 if (key_type == BTRFS_DIR_ITEM_KEY) {
3156 key_type = BTRFS_DIR_INDEX_KEY;
3157 goto again;
3158 }
3159 return 0;
3160}
3161
3162
3163
3164
3165
3166
3167
3168static int drop_objectid_items(struct btrfs_trans_handle *trans,
3169 struct btrfs_root *log,
3170 struct btrfs_path *path,
3171 u64 objectid, int max_key_type)
3172{
3173 int ret;
3174 struct btrfs_key key;
3175 struct btrfs_key found_key;
3176 int start_slot;
3177
3178 key.objectid = objectid;
3179 key.type = max_key_type;
3180 key.offset = (u64)-1;
3181
3182 while (1) {
3183 ret = btrfs_search_slot(trans, log, &key, path, -1, 1);
3184 BUG_ON(ret == 0);
3185 if (ret < 0)
3186 break;
3187
3188 if (path->slots[0] == 0)
3189 break;
3190
3191 path->slots[0]--;
3192 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
3193 path->slots[0]);
3194
3195 if (found_key.objectid != objectid)
3196 break;
3197
3198 found_key.offset = 0;
3199 found_key.type = 0;
3200 ret = btrfs_bin_search(path->nodes[0], &found_key, 0,
3201 &start_slot);
3202
3203 ret = btrfs_del_items(trans, log, path, start_slot,
3204 path->slots[0] - start_slot + 1);
3205
3206
3207
3208
3209 if (ret || start_slot != 0)
3210 break;
3211 btrfs_release_path(path);
3212 }
3213 btrfs_release_path(path);
3214 if (ret > 0)
3215 ret = 0;
3216 return ret;
3217}
3218
3219static void fill_inode_item(struct btrfs_trans_handle *trans,
3220 struct extent_buffer *leaf,
3221 struct btrfs_inode_item *item,
3222 struct inode *inode, int log_inode_only)
3223{
3224 struct btrfs_map_token token;
3225
3226 btrfs_init_map_token(&token);
3227
3228 if (log_inode_only) {
3229
3230
3231
3232
3233
3234 btrfs_set_token_inode_generation(leaf, item, 0, &token);
3235 btrfs_set_token_inode_size(leaf, item, 0, &token);
3236 } else {
3237 btrfs_set_token_inode_generation(leaf, item,
3238 BTRFS_I(inode)->generation,
3239 &token);
3240 btrfs_set_token_inode_size(leaf, item, inode->i_size, &token);
3241 }
3242
3243 btrfs_set_token_inode_uid(leaf, item, i_uid_read(inode), &token);
3244 btrfs_set_token_inode_gid(leaf, item, i_gid_read(inode), &token);
3245 btrfs_set_token_inode_mode(leaf, item, inode->i_mode, &token);
3246 btrfs_set_token_inode_nlink(leaf, item, inode->i_nlink, &token);
3247
3248 btrfs_set_token_timespec_sec(leaf, btrfs_inode_atime(item),
3249 inode->i_atime.tv_sec, &token);
3250 btrfs_set_token_timespec_nsec(leaf, btrfs_inode_atime(item),
3251 inode->i_atime.tv_nsec, &token);
3252
3253 btrfs_set_token_timespec_sec(leaf, btrfs_inode_mtime(item),
3254 inode->i_mtime.tv_sec, &token);
3255 btrfs_set_token_timespec_nsec(leaf, btrfs_inode_mtime(item),
3256 inode->i_mtime.tv_nsec, &token);
3257
3258 btrfs_set_token_timespec_sec(leaf, btrfs_inode_ctime(item),
3259 inode->i_ctime.tv_sec, &token);
3260 btrfs_set_token_timespec_nsec(leaf, btrfs_inode_ctime(item),
3261 inode->i_ctime.tv_nsec, &token);
3262
3263 btrfs_set_token_inode_nbytes(leaf, item, inode_get_bytes(inode),
3264 &token);
3265
3266 btrfs_set_token_inode_sequence(leaf, item, inode->i_version, &token);
3267 btrfs_set_token_inode_transid(leaf, item, trans->transid, &token);
3268 btrfs_set_token_inode_rdev(leaf, item, inode->i_rdev, &token);
3269 btrfs_set_token_inode_flags(leaf, item, BTRFS_I(inode)->flags, &token);
3270 btrfs_set_token_inode_block_group(leaf, item, 0, &token);
3271}
3272
3273static int log_inode_item(struct btrfs_trans_handle *trans,
3274 struct btrfs_root *log, struct btrfs_path *path,
3275 struct inode *inode)
3276{
3277 struct btrfs_inode_item *inode_item;
3278 int ret;
3279
3280 ret = btrfs_insert_empty_item(trans, log, path,
3281 &BTRFS_I(inode)->location,
3282 sizeof(*inode_item));
3283 if (ret && ret != -EEXIST)
3284 return ret;
3285 inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0],
3286 struct btrfs_inode_item);
3287 fill_inode_item(trans, path->nodes[0], inode_item, inode, 0);
3288 btrfs_release_path(path);
3289 return 0;
3290}
3291
3292static noinline int copy_items(struct btrfs_trans_handle *trans,
3293 struct inode *inode,
3294 struct btrfs_path *dst_path,
3295 struct btrfs_path *src_path, u64 *last_extent,
3296 int start_slot, int nr, int inode_only)
3297{
3298 unsigned long src_offset;
3299 unsigned long dst_offset;
3300 struct btrfs_root *log = BTRFS_I(inode)->root->log_root;
3301 struct btrfs_file_extent_item *extent;
3302 struct btrfs_inode_item *inode_item;
3303 struct extent_buffer *src = src_path->nodes[0];
3304 struct btrfs_key first_key, last_key, key;
3305 int ret;
3306 struct btrfs_key *ins_keys;
3307 u32 *ins_sizes;
3308 char *ins_data;
3309 int i;
3310 struct list_head ordered_sums;
3311 int skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
3312 bool has_extents = false;
3313 bool need_find_last_extent = true;
3314 bool done = false;
3315
3316 INIT_LIST_HEAD(&ordered_sums);
3317
3318 ins_data = kmalloc(nr * sizeof(struct btrfs_key) +
3319 nr * sizeof(u32), GFP_NOFS);
3320 if (!ins_data)
3321 return -ENOMEM;
3322
3323 first_key.objectid = (u64)-1;
3324
3325 ins_sizes = (u32 *)ins_data;
3326 ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32));
3327
3328 for (i = 0; i < nr; i++) {
3329 ins_sizes[i] = btrfs_item_size_nr(src, i + start_slot);
3330 btrfs_item_key_to_cpu(src, ins_keys + i, i + start_slot);
3331 }
3332 ret = btrfs_insert_empty_items(trans, log, dst_path,
3333 ins_keys, ins_sizes, nr);
3334 if (ret) {
3335 kfree(ins_data);
3336 return ret;
3337 }
3338
3339 for (i = 0; i < nr; i++, dst_path->slots[0]++) {
3340 dst_offset = btrfs_item_ptr_offset(dst_path->nodes[0],
3341 dst_path->slots[0]);
3342
3343 src_offset = btrfs_item_ptr_offset(src, start_slot + i);
3344
3345 if ((i == (nr - 1)))
3346 last_key = ins_keys[i];
3347
3348 if (ins_keys[i].type == BTRFS_INODE_ITEM_KEY) {
3349 inode_item = btrfs_item_ptr(dst_path->nodes[0],
3350 dst_path->slots[0],
3351 struct btrfs_inode_item);
3352 fill_inode_item(trans, dst_path->nodes[0], inode_item,
3353 inode, inode_only == LOG_INODE_EXISTS);
3354 } else {
3355 copy_extent_buffer(dst_path->nodes[0], src, dst_offset,
3356 src_offset, ins_sizes[i]);
3357 }
3358
3359
3360
3361
3362
3363
3364
3365 if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY) {
3366 has_extents = true;
3367 if (first_key.objectid == (u64)-1)
3368 first_key = ins_keys[i];
3369 } else {
3370 need_find_last_extent = false;
3371 }
3372
3373
3374
3375
3376
3377 if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY &&
3378 !skip_csum) {
3379 int found_type;
3380 extent = btrfs_item_ptr(src, start_slot + i,
3381 struct btrfs_file_extent_item);
3382
3383 if (btrfs_file_extent_generation(src, extent) < trans->transid)
3384 continue;
3385
3386 found_type = btrfs_file_extent_type(src, extent);
3387 if (found_type == BTRFS_FILE_EXTENT_REG) {
3388 u64 ds, dl, cs, cl;
3389 ds = btrfs_file_extent_disk_bytenr(src,
3390 extent);
3391
3392 if (ds == 0)
3393 continue;
3394
3395 dl = btrfs_file_extent_disk_num_bytes(src,
3396 extent);
3397 cs = btrfs_file_extent_offset(src, extent);
3398 cl = btrfs_file_extent_num_bytes(src,
3399 extent);
3400 if (btrfs_file_extent_compression(src,
3401 extent)) {
3402 cs = 0;
3403 cl = dl;
3404 }
3405
3406 ret = btrfs_lookup_csums_range(
3407 log->fs_info->csum_root,
3408 ds + cs, ds + cs + cl - 1,
3409 &ordered_sums, 0);
3410 if (ret) {
3411 btrfs_release_path(dst_path);
3412 kfree(ins_data);
3413 return ret;
3414 }
3415 }
3416 }
3417 }
3418
3419 btrfs_mark_buffer_dirty(dst_path->nodes[0]);
3420 btrfs_release_path(dst_path);
3421 kfree(ins_data);
3422
3423
3424
3425
3426
3427 ret = 0;
3428 while (!list_empty(&ordered_sums)) {
3429 struct btrfs_ordered_sum *sums = list_entry(ordered_sums.next,
3430 struct btrfs_ordered_sum,
3431 list);
3432 if (!ret)
3433 ret = btrfs_csum_file_blocks(trans, log, sums);
3434 list_del(&sums->list);
3435 kfree(sums);
3436 }
3437
3438 if (!has_extents)
3439 return ret;
3440
3441 if (need_find_last_extent && *last_extent == first_key.offset) {
3442
3443
3444
3445
3446
3447
3448 need_find_last_extent = false;
3449 }
3450
3451
3452
3453
3454
3455
3456
3457 if (need_find_last_extent) {
3458 u64 len;
3459
3460 ret = btrfs_prev_leaf(BTRFS_I(inode)->root, src_path);
3461 if (ret < 0)
3462 return ret;
3463 if (ret)
3464 goto fill_holes;
3465 if (src_path->slots[0])
3466 src_path->slots[0]--;
3467 src = src_path->nodes[0];
3468 btrfs_item_key_to_cpu(src, &key, src_path->slots[0]);
3469 if (key.objectid != btrfs_ino(inode) ||
3470 key.type != BTRFS_EXTENT_DATA_KEY)
3471 goto fill_holes;
3472 extent = btrfs_item_ptr(src, src_path->slots[0],
3473 struct btrfs_file_extent_item);
3474 if (btrfs_file_extent_type(src, extent) ==
3475 BTRFS_FILE_EXTENT_INLINE) {
3476 len = btrfs_file_extent_inline_len(src,
3477 src_path->slots[0],
3478 extent);
3479 *last_extent = ALIGN(key.offset + len,
3480 log->sectorsize);
3481 } else {
3482 len = btrfs_file_extent_num_bytes(src, extent);
3483 *last_extent = key.offset + len;
3484 }
3485 }
3486fill_holes:
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499 if (need_find_last_extent) {
3500
3501 btrfs_release_path(src_path);
3502 ret = btrfs_search_slot(NULL, BTRFS_I(inode)->root, &first_key,
3503 src_path, 0, 0);
3504 if (ret < 0)
3505 return ret;
3506 ASSERT(ret == 0);
3507 src = src_path->nodes[0];
3508 i = src_path->slots[0];
3509 } else {
3510 i = start_slot;
3511 }
3512
3513
3514
3515
3516
3517
3518 while (!done) {
3519 u64 offset, len;
3520 u64 extent_end;
3521
3522 if (i >= btrfs_header_nritems(src_path->nodes[0])) {
3523 ret = btrfs_next_leaf(BTRFS_I(inode)->root, src_path);
3524 if (ret < 0)
3525 return ret;
3526 ASSERT(ret == 0);
3527 src = src_path->nodes[0];
3528 i = 0;
3529 }
3530
3531 btrfs_item_key_to_cpu(src, &key, i);
3532 if (!btrfs_comp_cpu_keys(&key, &last_key))
3533 done = true;
3534 if (key.objectid != btrfs_ino(inode) ||
3535 key.type != BTRFS_EXTENT_DATA_KEY) {
3536 i++;
3537 continue;
3538 }
3539 extent = btrfs_item_ptr(src, i, struct btrfs_file_extent_item);
3540 if (btrfs_file_extent_type(src, extent) ==
3541 BTRFS_FILE_EXTENT_INLINE) {
3542 len = btrfs_file_extent_inline_len(src, i, extent);
3543 extent_end = ALIGN(key.offset + len, log->sectorsize);
3544 } else {
3545 len = btrfs_file_extent_num_bytes(src, extent);
3546 extent_end = key.offset + len;
3547 }
3548 i++;
3549
3550 if (*last_extent == key.offset) {
3551 *last_extent = extent_end;
3552 continue;
3553 }
3554 offset = *last_extent;
3555 len = key.offset - *last_extent;
3556 ret = btrfs_insert_file_extent(trans, log, btrfs_ino(inode),
3557 offset, 0, 0, len, 0, len, 0,
3558 0, 0);
3559 if (ret)
3560 break;
3561 *last_extent = extent_end;
3562 }
3563
3564
3565
3566
3567 if (!ret && need_find_last_extent)
3568 ret = 1;
3569 return ret;
3570}
3571
3572static int extent_cmp(void *priv, struct list_head *a, struct list_head *b)
3573{
3574 struct extent_map *em1, *em2;
3575
3576 em1 = list_entry(a, struct extent_map, list);
3577 em2 = list_entry(b, struct extent_map, list);
3578
3579 if (em1->start < em2->start)
3580 return -1;
3581 else if (em1->start > em2->start)
3582 return 1;
3583 return 0;
3584}
3585
3586static int wait_ordered_extents(struct btrfs_trans_handle *trans,
3587 struct inode *inode,
3588 struct btrfs_root *root,
3589 const struct extent_map *em,
3590 const struct list_head *logged_list,
3591 bool *ordered_io_error)
3592{
3593 struct btrfs_ordered_extent *ordered;
3594 struct btrfs_root *log = root->log_root;
3595 u64 mod_start = em->mod_start;
3596 u64 mod_len = em->mod_len;
3597 const bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
3598 u64 csum_offset;
3599 u64 csum_len;
3600 LIST_HEAD(ordered_sums);
3601 int ret = 0;
3602
3603 *ordered_io_error = false;
3604
3605 if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags) ||
3606 em->block_start == EXTENT_MAP_HOLE)
3607 return 0;
3608
3609
3610
3611
3612
3613
3614 list_for_each_entry(ordered, logged_list, log_list) {
3615 struct btrfs_ordered_sum *sum;
3616
3617 if (!mod_len)
3618 break;
3619
3620 if (ordered->file_offset + ordered->len <= mod_start ||
3621 mod_start + mod_len <= ordered->file_offset)
3622 continue;
3623
3624 if (!test_bit(BTRFS_ORDERED_IO_DONE, &ordered->flags) &&
3625 !test_bit(BTRFS_ORDERED_IOERR, &ordered->flags) &&
3626 !test_bit(BTRFS_ORDERED_DIRECT, &ordered->flags)) {
3627 const u64 start = ordered->file_offset;
3628 const u64 end = ordered->file_offset + ordered->len - 1;
3629
3630 WARN_ON(ordered->inode != inode);
3631 filemap_fdatawrite_range(inode->i_mapping, start, end);
3632 }
3633
3634 wait_event(ordered->wait,
3635 (test_bit(BTRFS_ORDERED_IO_DONE, &ordered->flags) ||
3636 test_bit(BTRFS_ORDERED_IOERR, &ordered->flags)));
3637
3638 if (test_bit(BTRFS_ORDERED_IOERR, &ordered->flags)) {
3639
3640
3641
3642
3643
3644 btrfs_inode_check_errors(inode);
3645 *ordered_io_error = true;
3646 break;
3647 }
3648
3649
3650
3651
3652
3653 if (ordered->file_offset > mod_start) {
3654 if (ordered->file_offset + ordered->len >=
3655 mod_start + mod_len)
3656 mod_len = ordered->file_offset - mod_start;
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667 } else {
3668 if (ordered->file_offset + ordered->len <
3669 mod_start + mod_len) {
3670 mod_len = (mod_start + mod_len) -
3671 (ordered->file_offset + ordered->len);
3672 mod_start = ordered->file_offset +
3673 ordered->len;
3674 } else {
3675 mod_len = 0;
3676 }
3677 }
3678
3679 if (skip_csum)
3680 continue;
3681
3682
3683
3684
3685
3686 if (test_and_set_bit(BTRFS_ORDERED_LOGGED_CSUM,
3687 &ordered->flags))
3688 continue;
3689
3690 if (ordered->csum_bytes_left) {
3691 btrfs_start_ordered_extent(inode, ordered, 0);
3692 wait_event(ordered->wait,
3693 ordered->csum_bytes_left == 0);
3694 }
3695
3696 list_for_each_entry(sum, &ordered->list, list) {
3697 ret = btrfs_csum_file_blocks(trans, log, sum);
3698 if (ret)
3699 break;
3700 }
3701 }
3702
3703 if (*ordered_io_error || !mod_len || ret || skip_csum)
3704 return ret;
3705
3706 if (em->compress_type) {
3707 csum_offset = 0;
3708 csum_len = max(em->block_len, em->orig_block_len);
3709 } else {
3710 csum_offset = mod_start - em->start;
3711 csum_len = mod_len;
3712 }
3713
3714
3715 ret = btrfs_lookup_csums_range(log->fs_info->csum_root,
3716 em->block_start + csum_offset,
3717 em->block_start + csum_offset +
3718 csum_len - 1, &ordered_sums, 0);
3719 if (ret)
3720 return ret;
3721
3722 while (!list_empty(&ordered_sums)) {
3723 struct btrfs_ordered_sum *sums = list_entry(ordered_sums.next,
3724 struct btrfs_ordered_sum,
3725 list);
3726 if (!ret)
3727 ret = btrfs_csum_file_blocks(trans, log, sums);
3728 list_del(&sums->list);
3729 kfree(sums);
3730 }
3731
3732 return ret;
3733}
3734
3735static int log_one_extent(struct btrfs_trans_handle *trans,
3736 struct inode *inode, struct btrfs_root *root,
3737 const struct extent_map *em,
3738 struct btrfs_path *path,
3739 const struct list_head *logged_list,
3740 struct btrfs_log_ctx *ctx)
3741{
3742 struct btrfs_root *log = root->log_root;
3743 struct btrfs_file_extent_item *fi;
3744 struct extent_buffer *leaf;
3745 struct btrfs_map_token token;
3746 struct btrfs_key key;
3747 u64 extent_offset = em->start - em->orig_start;
3748 u64 block_len;
3749 int ret;
3750 int extent_inserted = 0;
3751 bool ordered_io_err = false;
3752
3753 ret = wait_ordered_extents(trans, inode, root, em, logged_list,
3754 &ordered_io_err);
3755 if (ret)
3756 return ret;
3757
3758 if (ordered_io_err) {
3759 ctx->io_err = -EIO;
3760 return 0;
3761 }
3762
3763 btrfs_init_map_token(&token);
3764
3765 ret = __btrfs_drop_extents(trans, log, inode, path, em->start,
3766 em->start + em->len, NULL, 0, 1,
3767 sizeof(*fi), &extent_inserted);
3768 if (ret)
3769 return ret;
3770
3771 if (!extent_inserted) {
3772 key.objectid = btrfs_ino(inode);
3773 key.type = BTRFS_EXTENT_DATA_KEY;
3774 key.offset = em->start;
3775
3776 ret = btrfs_insert_empty_item(trans, log, path, &key,
3777 sizeof(*fi));
3778 if (ret)
3779 return ret;
3780 }
3781 leaf = path->nodes[0];
3782 fi = btrfs_item_ptr(leaf, path->slots[0],
3783 struct btrfs_file_extent_item);
3784
3785 btrfs_set_token_file_extent_generation(leaf, fi, trans->transid,
3786 &token);
3787 if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
3788 btrfs_set_token_file_extent_type(leaf, fi,
3789 BTRFS_FILE_EXTENT_PREALLOC,
3790 &token);
3791 else
3792 btrfs_set_token_file_extent_type(leaf, fi,
3793 BTRFS_FILE_EXTENT_REG,
3794 &token);
3795
3796 block_len = max(em->block_len, em->orig_block_len);
3797 if (em->compress_type != BTRFS_COMPRESS_NONE) {
3798 btrfs_set_token_file_extent_disk_bytenr(leaf, fi,
3799 em->block_start,
3800 &token);
3801 btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, block_len,
3802 &token);
3803 } else if (em->block_start < EXTENT_MAP_LAST_BYTE) {
3804 btrfs_set_token_file_extent_disk_bytenr(leaf, fi,
3805 em->block_start -
3806 extent_offset, &token);
3807 btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, block_len,
3808 &token);
3809 } else {
3810 btrfs_set_token_file_extent_disk_bytenr(leaf, fi, 0, &token);
3811 btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, 0,
3812 &token);
3813 }
3814
3815 btrfs_set_token_file_extent_offset(leaf, fi, extent_offset, &token);
3816 btrfs_set_token_file_extent_num_bytes(leaf, fi, em->len, &token);
3817 btrfs_set_token_file_extent_ram_bytes(leaf, fi, em->ram_bytes, &token);
3818 btrfs_set_token_file_extent_compression(leaf, fi, em->compress_type,
3819 &token);
3820 btrfs_set_token_file_extent_encryption(leaf, fi, 0, &token);
3821 btrfs_set_token_file_extent_other_encoding(leaf, fi, 0, &token);
3822 btrfs_mark_buffer_dirty(leaf);
3823
3824 btrfs_release_path(path);
3825
3826 return ret;
3827}
3828
3829static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
3830 struct btrfs_root *root,
3831 struct inode *inode,
3832 struct btrfs_path *path,
3833 struct list_head *logged_list,
3834 struct btrfs_log_ctx *ctx)
3835{
3836 struct extent_map *em, *n;
3837 struct list_head extents;
3838 struct extent_map_tree *tree = &BTRFS_I(inode)->extent_tree;
3839 u64 test_gen;
3840 int ret = 0;
3841 int num = 0;
3842
3843 INIT_LIST_HEAD(&extents);
3844
3845 write_lock(&tree->lock);
3846 test_gen = root->fs_info->last_trans_committed;
3847
3848 list_for_each_entry_safe(em, n, &tree->modified_extents, list) {
3849 list_del_init(&em->list);
3850
3851
3852
3853
3854
3855
3856
3857 if (++num > 32768) {
3858 list_del_init(&tree->modified_extents);
3859 ret = -EFBIG;
3860 goto process;
3861 }
3862
3863 if (em->generation <= test_gen)
3864 continue;
3865
3866 atomic_inc(&em->refs);
3867 set_bit(EXTENT_FLAG_LOGGING, &em->flags);
3868 list_add_tail(&em->list, &extents);
3869 num++;
3870 }
3871
3872 list_sort(NULL, &extents, extent_cmp);
3873
3874process:
3875 while (!list_empty(&extents)) {
3876 em = list_entry(extents.next, struct extent_map, list);
3877
3878 list_del_init(&em->list);
3879
3880
3881
3882
3883
3884 if (ret) {
3885 clear_em_logging(tree, em);
3886 free_extent_map(em);
3887 continue;
3888 }
3889
3890 write_unlock(&tree->lock);
3891
3892 ret = log_one_extent(trans, inode, root, em, path, logged_list,
3893 ctx);
3894 write_lock(&tree->lock);
3895 clear_em_logging(tree, em);
3896 free_extent_map(em);
3897 }
3898 WARN_ON(!list_empty(&extents));
3899 write_unlock(&tree->lock);
3900
3901 btrfs_release_path(path);
3902 return ret;
3903}
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919static int btrfs_log_inode(struct btrfs_trans_handle *trans,
3920 struct btrfs_root *root, struct inode *inode,
3921 int inode_only,
3922 const loff_t start,
3923 const loff_t end,
3924 struct btrfs_log_ctx *ctx)
3925{
3926 struct btrfs_path *path;
3927 struct btrfs_path *dst_path;
3928 struct btrfs_key min_key;
3929 struct btrfs_key max_key;
3930 struct btrfs_root *log = root->log_root;
3931 struct extent_buffer *src = NULL;
3932 LIST_HEAD(logged_list);
3933 u64 last_extent = 0;
3934 int err = 0;
3935 int ret;
3936 int nritems;
3937 int ins_start_slot = 0;
3938 int ins_nr;
3939 bool fast_search = false;
3940 u64 ino = btrfs_ino(inode);
3941 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
3942
3943 path = btrfs_alloc_path();
3944 if (!path)
3945 return -ENOMEM;
3946 dst_path = btrfs_alloc_path();
3947 if (!dst_path) {
3948 btrfs_free_path(path);
3949 return -ENOMEM;
3950 }
3951
3952 min_key.objectid = ino;
3953 min_key.type = BTRFS_INODE_ITEM_KEY;
3954 min_key.offset = 0;
3955
3956 max_key.objectid = ino;
3957
3958
3959
3960 if (S_ISDIR(inode->i_mode) ||
3961 (!test_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
3962 &BTRFS_I(inode)->runtime_flags) &&
3963 inode_only == LOG_INODE_EXISTS))
3964 max_key.type = BTRFS_XATTR_ITEM_KEY;
3965 else
3966 max_key.type = (u8)-1;
3967 max_key.offset = (u64)-1;
3968
3969
3970 if (S_ISDIR(inode->i_mode) ||
3971 BTRFS_I(inode)->generation > root->fs_info->last_trans_committed) {
3972 ret = btrfs_commit_inode_delayed_items(trans, inode);
3973 if (ret) {
3974 btrfs_free_path(path);
3975 btrfs_free_path(dst_path);
3976 return ret;
3977 }
3978 }
3979
3980 mutex_lock(&BTRFS_I(inode)->log_mutex);
3981
3982 btrfs_get_logged_extents(inode, &logged_list, start, end);
3983
3984
3985
3986
3987
3988 if (S_ISDIR(inode->i_mode)) {
3989 int max_key_type = BTRFS_DIR_LOG_INDEX_KEY;
3990
3991 if (inode_only == LOG_INODE_EXISTS)
3992 max_key_type = BTRFS_XATTR_ITEM_KEY;
3993 ret = drop_objectid_items(trans, log, path, ino, max_key_type);
3994 } else {
3995 if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
3996 &BTRFS_I(inode)->runtime_flags)) {
3997 clear_bit(BTRFS_INODE_COPY_EVERYTHING,
3998 &BTRFS_I(inode)->runtime_flags);
3999 ret = btrfs_truncate_inode_items(trans, log,
4000 inode, 0, 0);
4001 } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
4002 &BTRFS_I(inode)->runtime_flags) ||
4003 inode_only == LOG_INODE_EXISTS) {
4004 if (inode_only == LOG_INODE_ALL)
4005 fast_search = true;
4006 max_key.type = BTRFS_XATTR_ITEM_KEY;
4007 ret = drop_objectid_items(trans, log, path, ino,
4008 max_key.type);
4009 } else {
4010 if (inode_only == LOG_INODE_ALL)
4011 fast_search = true;
4012 ret = log_inode_item(trans, log, dst_path, inode);
4013 if (ret) {
4014 err = ret;
4015 goto out_unlock;
4016 }
4017 goto log_extents;
4018 }
4019
4020 }
4021 if (ret) {
4022 err = ret;
4023 goto out_unlock;
4024 }
4025
4026 while (1) {
4027 ins_nr = 0;
4028 ret = btrfs_search_forward(root, &min_key,
4029 path, trans->transid);
4030 if (ret != 0)
4031 break;
4032again:
4033
4034 if (min_key.objectid != ino)
4035 break;
4036 if (min_key.type > max_key.type)
4037 break;
4038
4039 src = path->nodes[0];
4040 if (ins_nr && ins_start_slot + ins_nr == path->slots[0]) {
4041 ins_nr++;
4042 goto next_slot;
4043 } else if (!ins_nr) {
4044 ins_start_slot = path->slots[0];
4045 ins_nr = 1;
4046 goto next_slot;
4047 }
4048
4049 ret = copy_items(trans, inode, dst_path, path, &last_extent,
4050 ins_start_slot, ins_nr, inode_only);
4051 if (ret < 0) {
4052 err = ret;
4053 goto out_unlock;
4054 }
4055 if (ret) {
4056 ins_nr = 0;
4057 btrfs_release_path(path);
4058 continue;
4059 }
4060 ins_nr = 1;
4061 ins_start_slot = path->slots[0];
4062next_slot:
4063
4064 nritems = btrfs_header_nritems(path->nodes[0]);
4065 path->slots[0]++;
4066 if (path->slots[0] < nritems) {
4067 btrfs_item_key_to_cpu(path->nodes[0], &min_key,
4068 path->slots[0]);
4069 goto again;
4070 }
4071 if (ins_nr) {
4072 ret = copy_items(trans, inode, dst_path, path,
4073 &last_extent, ins_start_slot,
4074 ins_nr, inode_only);
4075 if (ret < 0) {
4076 err = ret;
4077 goto out_unlock;
4078 }
4079 ret = 0;
4080 ins_nr = 0;
4081 }
4082 btrfs_release_path(path);
4083
4084 if (min_key.offset < (u64)-1) {
4085 min_key.offset++;
4086 } else if (min_key.type < max_key.type) {
4087 min_key.type++;
4088 min_key.offset = 0;
4089 } else {
4090 break;
4091 }
4092 }
4093 if (ins_nr) {
4094 ret = copy_items(trans, inode, dst_path, path, &last_extent,
4095 ins_start_slot, ins_nr, inode_only);
4096 if (ret < 0) {
4097 err = ret;
4098 goto out_unlock;
4099 }
4100 ret = 0;
4101 ins_nr = 0;
4102 }
4103
4104log_extents:
4105 btrfs_release_path(path);
4106 btrfs_release_path(dst_path);
4107 if (fast_search) {
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118 err = btrfs_inode_check_errors(inode);
4119 if (err) {
4120 ctx->io_err = err;
4121 goto out_unlock;
4122 }
4123 ret = btrfs_log_changed_extents(trans, root, inode, dst_path,
4124 &logged_list, ctx);
4125 if (ret) {
4126 err = ret;
4127 goto out_unlock;
4128 }
4129 } else if (inode_only == LOG_INODE_ALL) {
4130 struct extent_map *em, *n;
4131
4132 write_lock(&em_tree->lock);
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151 list_for_each_entry_safe(em, n, &em_tree->modified_extents,
4152 list) {
4153 const u64 mod_end = em->mod_start + em->mod_len - 1;
4154
4155 if (em->mod_start >= start && mod_end <= end)
4156 list_del_init(&em->list);
4157 }
4158 write_unlock(&em_tree->lock);
4159 }
4160
4161 if (inode_only == LOG_INODE_ALL && S_ISDIR(inode->i_mode)) {
4162 ret = log_directory_changes(trans, root, inode, path, dst_path);
4163 if (ret) {
4164 err = ret;
4165 goto out_unlock;
4166 }
4167 }
4168
4169 BTRFS_I(inode)->logged_trans = trans->transid;
4170 BTRFS_I(inode)->last_log_commit = BTRFS_I(inode)->last_sub_trans;
4171out_unlock:
4172 if (unlikely(err))
4173 btrfs_put_logged_extents(&logged_list);
4174 else
4175 btrfs_submit_logged_extents(&logged_list, log);
4176 mutex_unlock(&BTRFS_I(inode)->log_mutex);
4177
4178 btrfs_free_path(path);
4179 btrfs_free_path(dst_path);
4180 return err;
4181}
4182
4183
4184
4185
4186
4187
4188
4189static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans,
4190 struct inode *inode,
4191 struct dentry *parent,
4192 struct super_block *sb,
4193 u64 last_committed)
4194{
4195 int ret = 0;
4196 struct btrfs_root *root;
4197 struct dentry *old_parent = NULL;
4198 struct inode *orig_inode = inode;
4199
4200
4201
4202
4203
4204
4205
4206 if (S_ISREG(inode->i_mode) &&
4207 BTRFS_I(inode)->generation <= last_committed &&
4208 BTRFS_I(inode)->last_unlink_trans <= last_committed)
4209 goto out;
4210
4211 if (!S_ISDIR(inode->i_mode)) {
4212 if (!parent || !parent->d_inode || sb != parent->d_inode->i_sb)
4213 goto out;
4214 inode = parent->d_inode;
4215 }
4216
4217 while (1) {
4218
4219
4220
4221
4222
4223
4224 if (inode != orig_inode)
4225 BTRFS_I(inode)->logged_trans = trans->transid;
4226 smp_mb();
4227
4228 if (BTRFS_I(inode)->last_unlink_trans > last_committed) {
4229 root = BTRFS_I(inode)->root;
4230
4231
4232
4233
4234
4235 btrfs_set_log_full_commit(root->fs_info, trans);
4236 ret = 1;
4237 break;
4238 }
4239
4240 if (!parent || !parent->d_inode || sb != parent->d_inode->i_sb)
4241 break;
4242
4243 if (IS_ROOT(parent))
4244 break;
4245
4246 parent = dget_parent(parent);
4247 dput(old_parent);
4248 old_parent = parent;
4249 inode = parent->d_inode;
4250
4251 }
4252 dput(old_parent);
4253out:
4254 return ret;
4255}
4256
4257
4258
4259
4260
4261
4262
4263static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
4264 struct btrfs_root *root, struct inode *inode,
4265 struct dentry *parent,
4266 const loff_t start,
4267 const loff_t end,
4268 int exists_only,
4269 struct btrfs_log_ctx *ctx)
4270{
4271 int inode_only = exists_only ? LOG_INODE_EXISTS : LOG_INODE_ALL;
4272 struct super_block *sb;
4273 struct dentry *old_parent = NULL;
4274 int ret = 0;
4275 u64 last_committed = root->fs_info->last_trans_committed;
4276
4277 sb = inode->i_sb;
4278
4279 if (btrfs_test_opt(root, NOTREELOG)) {
4280 ret = 1;
4281 goto end_no_trans;
4282 }
4283
4284
4285
4286
4287
4288 if (root->fs_info->last_trans_log_full_commit >
4289 root->fs_info->last_trans_committed) {
4290 ret = 1;
4291 goto end_no_trans;
4292 }
4293
4294 if (root != BTRFS_I(inode)->root ||
4295 btrfs_root_refs(&root->root_item) == 0) {
4296 ret = 1;
4297 goto end_no_trans;
4298 }
4299
4300 ret = check_parent_dirs_for_sync(trans, inode, parent,
4301 sb, last_committed);
4302 if (ret)
4303 goto end_no_trans;
4304
4305 if (btrfs_inode_in_log(inode, trans->transid)) {
4306 ret = BTRFS_NO_LOG_SYNC;
4307 goto end_no_trans;
4308 }
4309
4310 ret = start_log_trans(trans, root, ctx);
4311 if (ret)
4312 goto end_no_trans;
4313
4314 ret = btrfs_log_inode(trans, root, inode, inode_only, start, end, ctx);
4315 if (ret)
4316 goto end_trans;
4317
4318
4319
4320
4321
4322
4323
4324 if (S_ISREG(inode->i_mode) &&
4325 BTRFS_I(inode)->generation <= last_committed &&
4326 BTRFS_I(inode)->last_unlink_trans <= last_committed) {
4327 ret = 0;
4328 goto end_trans;
4329 }
4330
4331 inode_only = LOG_INODE_EXISTS;
4332 while (1) {
4333 if (!parent || !parent->d_inode || sb != parent->d_inode->i_sb)
4334 break;
4335
4336 inode = parent->d_inode;
4337 if (root != BTRFS_I(inode)->root)
4338 break;
4339
4340 if (BTRFS_I(inode)->generation >
4341 root->fs_info->last_trans_committed) {
4342 ret = btrfs_log_inode(trans, root, inode, inode_only,
4343 0, LLONG_MAX, ctx);
4344 if (ret)
4345 goto end_trans;
4346 }
4347 if (IS_ROOT(parent))
4348 break;
4349
4350 parent = dget_parent(parent);
4351 dput(old_parent);
4352 old_parent = parent;
4353 }
4354 ret = 0;
4355end_trans:
4356 dput(old_parent);
4357 if (ret < 0) {
4358 btrfs_set_log_full_commit(root->fs_info, trans);
4359 ret = 1;
4360 }
4361
4362 if (ret)
4363 btrfs_remove_log_ctx(root, ctx);
4364 btrfs_end_log_trans(root);
4365end_no_trans:
4366 return ret;
4367}
4368
4369
4370
4371
4372
4373
4374
4375int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans,
4376 struct btrfs_root *root, struct dentry *dentry,
4377 const loff_t start,
4378 const loff_t end,
4379 struct btrfs_log_ctx *ctx)
4380{
4381 struct dentry *parent = dget_parent(dentry);
4382 int ret;
4383
4384 ret = btrfs_log_inode_parent(trans, root, dentry->d_inode, parent,
4385 start, end, 0, ctx);
4386 dput(parent);
4387
4388 return ret;
4389}
4390
4391
4392
4393
4394
4395int btrfs_recover_log_trees(struct btrfs_root *log_root_tree)
4396{
4397 int ret;
4398 struct btrfs_path *path;
4399 struct btrfs_trans_handle *trans;
4400 struct btrfs_key key;
4401 struct btrfs_key found_key;
4402 struct btrfs_key tmp_key;
4403 struct btrfs_root *log;
4404 struct btrfs_fs_info *fs_info = log_root_tree->fs_info;
4405 struct walk_control wc = {
4406 .process_func = process_one_buffer,
4407 .stage = 0,
4408 };
4409
4410 path = btrfs_alloc_path();
4411 if (!path)
4412 return -ENOMEM;
4413
4414 fs_info->log_root_recovering = 1;
4415
4416 trans = btrfs_start_transaction(fs_info->tree_root, 0);
4417 if (IS_ERR(trans)) {
4418 ret = PTR_ERR(trans);
4419 goto error;
4420 }
4421
4422 wc.trans = trans;
4423 wc.pin = 1;
4424
4425 ret = walk_log_tree(trans, log_root_tree, &wc);
4426 if (ret) {
4427 btrfs_error(fs_info, ret, "Failed to pin buffers while "
4428 "recovering log root tree.");
4429 goto error;
4430 }
4431
4432again:
4433 key.objectid = BTRFS_TREE_LOG_OBJECTID;
4434 key.offset = (u64)-1;
4435 key.type = BTRFS_ROOT_ITEM_KEY;
4436
4437 while (1) {
4438 ret = btrfs_search_slot(NULL, log_root_tree, &key, path, 0, 0);
4439
4440 if (ret < 0) {
4441 btrfs_error(fs_info, ret,
4442 "Couldn't find tree log root.");
4443 goto error;
4444 }
4445 if (ret > 0) {
4446 if (path->slots[0] == 0)
4447 break;
4448 path->slots[0]--;
4449 }
4450 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
4451 path->slots[0]);
4452 btrfs_release_path(path);
4453 if (found_key.objectid != BTRFS_TREE_LOG_OBJECTID)
4454 break;
4455
4456 log = btrfs_read_fs_root(log_root_tree, &found_key);
4457 if (IS_ERR(log)) {
4458 ret = PTR_ERR(log);
4459 btrfs_error(fs_info, ret,
4460 "Couldn't read tree log root.");
4461 goto error;
4462 }
4463
4464 tmp_key.objectid = found_key.offset;
4465 tmp_key.type = BTRFS_ROOT_ITEM_KEY;
4466 tmp_key.offset = (u64)-1;
4467
4468 wc.replay_dest = btrfs_read_fs_root_no_name(fs_info, &tmp_key);
4469 if (IS_ERR(wc.replay_dest)) {
4470 ret = PTR_ERR(wc.replay_dest);
4471 free_extent_buffer(log->node);
4472 free_extent_buffer(log->commit_root);
4473 kfree(log);
4474 btrfs_error(fs_info, ret, "Couldn't read target root "
4475 "for tree log recovery.");
4476 goto error;
4477 }
4478
4479 wc.replay_dest->log_root = log;
4480 btrfs_record_root_in_trans(trans, wc.replay_dest);
4481 ret = walk_log_tree(trans, log, &wc);
4482
4483 if (!ret && wc.stage == LOG_WALK_REPLAY_ALL) {
4484 ret = fixup_inode_link_counts(trans, wc.replay_dest,
4485 path);
4486 }
4487
4488 key.offset = found_key.offset - 1;
4489 wc.replay_dest->log_root = NULL;
4490 free_extent_buffer(log->node);
4491 free_extent_buffer(log->commit_root);
4492 kfree(log);
4493
4494 if (ret)
4495 goto error;
4496
4497 if (found_key.offset == 0)
4498 break;
4499 }
4500 btrfs_release_path(path);
4501
4502
4503 if (wc.pin) {
4504 wc.pin = 0;
4505 wc.process_func = replay_one_buffer;
4506 wc.stage = LOG_WALK_REPLAY_INODES;
4507 goto again;
4508 }
4509
4510 if (wc.stage < LOG_WALK_REPLAY_ALL) {
4511 wc.stage++;
4512 goto again;
4513 }
4514
4515 btrfs_free_path(path);
4516
4517
4518 ret = btrfs_commit_transaction(trans, fs_info->tree_root);
4519 if (ret)
4520 return ret;
4521
4522 free_extent_buffer(log_root_tree->node);
4523 log_root_tree->log_root = NULL;
4524 fs_info->log_root_recovering = 0;
4525 kfree(log_root_tree);
4526
4527 return 0;
4528error:
4529 if (wc.trans)
4530 btrfs_end_transaction(wc.trans, fs_info->tree_root);
4531 btrfs_free_path(path);
4532 return ret;
4533}
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans,
4544 struct inode *dir, struct inode *inode,
4545 int for_rename)
4546{
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557 if (S_ISREG(inode->i_mode))
4558 BTRFS_I(inode)->last_unlink_trans = trans->transid;
4559
4560
4561
4562
4563
4564 smp_mb();
4565 if (BTRFS_I(dir)->logged_trans == trans->transid)
4566 return;
4567
4568
4569
4570
4571
4572 if (BTRFS_I(inode)->logged_trans == trans->transid)
4573 return;
4574
4575
4576
4577
4578
4579
4580
4581
4582 if (for_rename)
4583 goto record;
4584
4585
4586 return;
4587
4588record:
4589 BTRFS_I(dir)->last_unlink_trans = trans->transid;
4590}
4591
4592
4593
4594
4595
4596
4597
4598
4599int btrfs_log_new_name(struct btrfs_trans_handle *trans,
4600 struct inode *inode, struct inode *old_dir,
4601 struct dentry *parent)
4602{
4603 struct btrfs_root * root = BTRFS_I(inode)->root;
4604
4605
4606
4607
4608
4609 if (S_ISREG(inode->i_mode))
4610 BTRFS_I(inode)->last_unlink_trans = trans->transid;
4611
4612
4613
4614
4615
4616 if (BTRFS_I(inode)->logged_trans <=
4617 root->fs_info->last_trans_committed &&
4618 (!old_dir || BTRFS_I(old_dir)->logged_trans <=
4619 root->fs_info->last_trans_committed))
4620 return 0;
4621
4622 return btrfs_log_inode_parent(trans, root, inode, parent, 0,
4623 LLONG_MAX, 1, NULL);
4624}
4625
4626