blob: 080b12d65b0cbe64eb18f116366a6aa32eaac286 [file] [log] [blame]
Alexander Block31db9f72012-07-25 23:19:24 +02001/*
2 * Copyright (C) 2012 Alexander Block. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public
6 * License v2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public
14 * License along with this program; if not, write to the
15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 * Boston, MA 021110-1307, USA.
17 */
18
19#include <linux/bsearch.h>
20#include <linux/fs.h>
21#include <linux/file.h>
22#include <linux/sort.h>
23#include <linux/mount.h>
24#include <linux/xattr.h>
25#include <linux/posix_acl_xattr.h>
26#include <linux/radix-tree.h>
Stephen Rothwella1857eb2012-07-27 10:11:13 +100027#include <linux/vmalloc.h>
Andy Shevchenkoed848852013-08-21 10:32:13 +030028#include <linux/string.h>
Alexander Block31db9f72012-07-25 23:19:24 +020029
30#include "send.h"
31#include "backref.h"
Filipe David Borba Manana0b947af2014-01-29 21:06:04 +000032#include "hash.h"
Alexander Block31db9f72012-07-25 23:19:24 +020033#include "locking.h"
34#include "disk-io.h"
35#include "btrfs_inode.h"
36#include "transaction.h"
Anand Jainebb87652016-03-10 17:26:59 +080037#include "compression.h"
Marcos Paulo de Souza9e36fae2020-05-10 23:15:07 -030038#include "xattr.h"
Alexander Block31db9f72012-07-25 23:19:24 +020039
Alexander Block31db9f72012-07-25 23:19:24 +020040/*
Filipe Mananab6af12a2019-10-30 12:23:01 +000041 * Maximum number of references an extent can have in order for us to attempt to
42 * issue clone operations instead of write operations. This currently exists to
43 * avoid hitting limitations of the backreference walking code (taking a lot of
44 * time and using too much memory for extents with large number of references).
45 */
46#define SEND_MAX_EXTENT_REFS 64
47
48/*
Alexander Block31db9f72012-07-25 23:19:24 +020049 * A fs_path is a helper to dynamically build path names with unknown size.
50 * It reallocates the internal buffer on demand.
51 * It allows fast adding of path elements on the right side (normal path) and
52 * fast adding to the left side (reversed path). A reversed path can also be
53 * unreversed if needed.
54 */
55struct fs_path {
56 union {
57 struct {
58 char *start;
59 char *end;
Alexander Block31db9f72012-07-25 23:19:24 +020060
61 char *buf;
David Sterba1f5a7ff2014-02-03 19:23:47 +010062 unsigned short buf_len:15;
63 unsigned short reversed:1;
Alexander Block31db9f72012-07-25 23:19:24 +020064 char inline_buf[];
65 };
David Sterbaace01052014-02-05 16:17:34 +010066 /*
67 * Average path length does not exceed 200 bytes, we'll have
68 * better packing in the slab and higher chance to satisfy
69 * a allocation later during send.
70 */
71 char pad[256];
Alexander Block31db9f72012-07-25 23:19:24 +020072 };
73};
74#define FS_PATH_INLINE_SIZE \
75 (sizeof(struct fs_path) - offsetof(struct fs_path, inline_buf))
76
77
78/* reused for each extent */
79struct clone_root {
80 struct btrfs_root *root;
81 u64 ino;
82 u64 offset;
83
84 u64 found_refs;
85};
86
87#define SEND_CTX_MAX_NAME_CACHE_SIZE 128
88#define SEND_CTX_NAME_CACHE_CLEAN_SIZE (SEND_CTX_MAX_NAME_CACHE_SIZE * 2)
89
90struct send_ctx {
91 struct file *send_filp;
92 loff_t send_off;
93 char *send_buf;
94 u32 send_size;
95 u32 send_max_size;
96 u64 total_send_size;
97 u64 cmd_send_size[BTRFS_SEND_C_MAX + 1];
Mark Fashehcb95e7b2013-02-04 20:54:57 +000098 u64 flags; /* 'flags' member of btrfs_ioctl_send_args is u64 */
Alexander Block31db9f72012-07-25 23:19:24 +020099
Alexander Block31db9f72012-07-25 23:19:24 +0200100 struct btrfs_root *send_root;
101 struct btrfs_root *parent_root;
102 struct clone_root *clone_roots;
103 int clone_roots_cnt;
104
105 /* current state of the compare_tree call */
106 struct btrfs_path *left_path;
107 struct btrfs_path *right_path;
108 struct btrfs_key *cmp_key;
109
110 /*
111 * infos of the currently processed inode. In case of deleted inodes,
112 * these are the values from the deleted inode.
113 */
114 u64 cur_ino;
115 u64 cur_inode_gen;
116 int cur_inode_new;
117 int cur_inode_new_gen;
118 int cur_inode_deleted;
Alexander Block31db9f72012-07-25 23:19:24 +0200119 u64 cur_inode_size;
120 u64 cur_inode_mode;
Liu Bo644d1942014-02-27 17:29:01 +0800121 u64 cur_inode_rdev;
Josef Bacik16e75492013-10-22 12:18:51 -0400122 u64 cur_inode_last_extent;
Alexander Block31db9f72012-07-25 23:19:24 +0200123
124 u64 send_progress;
125
126 struct list_head new_refs;
127 struct list_head deleted_refs;
128
129 struct radix_tree_root name_cache;
130 struct list_head name_cache_list;
131 int name_cache_size;
132
Liu Bo2131bcd32014-03-05 10:07:35 +0800133 struct file_ra_state ra;
134
Alexander Block31db9f72012-07-25 23:19:24 +0200135 char *read_buf;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +0000136
137 /*
138 * We process inodes by their increasing order, so if before an
139 * incremental send we reverse the parent/child relationship of
140 * directories such that a directory with a lower inode number was
141 * the parent of a directory with a higher inode number, and the one
142 * becoming the new parent got renamed too, we can't rename/move the
143 * directory with lower inode number when we finish processing it - we
144 * must process the directory with higher inode number first, then
145 * rename/move it and then rename/move the directory with lower inode
146 * number. Example follows.
147 *
148 * Tree state when the first send was performed:
149 *
150 * .
151 * |-- a (ino 257)
152 * |-- b (ino 258)
153 * |
154 * |
155 * |-- c (ino 259)
156 * | |-- d (ino 260)
157 * |
158 * |-- c2 (ino 261)
159 *
160 * Tree state when the second (incremental) send is performed:
161 *
162 * .
163 * |-- a (ino 257)
164 * |-- b (ino 258)
165 * |-- c2 (ino 261)
166 * |-- d2 (ino 260)
167 * |-- cc (ino 259)
168 *
169 * The sequence of steps that lead to the second state was:
170 *
171 * mv /a/b/c/d /a/b/c2/d2
172 * mv /a/b/c /a/b/c2/d2/cc
173 *
174 * "c" has lower inode number, but we can't move it (2nd mv operation)
175 * before we move "d", which has higher inode number.
176 *
177 * So we just memorize which move/rename operations must be performed
178 * later when their respective parent is processed and moved/renamed.
179 */
180
181 /* Indexed by parent directory inode number. */
182 struct rb_root pending_dir_moves;
183
184 /*
185 * Reverse index, indexed by the inode number of a directory that
186 * is waiting for the move/rename of its immediate parent before its
187 * own move/rename can be performed.
188 */
189 struct rb_root waiting_dir_moves;
Filipe Manana9dc44212014-02-19 14:31:44 +0000190
191 /*
192 * A directory that is going to be rm'ed might have a child directory
193 * which is in the pending directory moves index above. In this case,
194 * the directory can only be removed after the move/rename of its child
195 * is performed. Example:
196 *
197 * Parent snapshot:
198 *
199 * . (ino 256)
200 * |-- a/ (ino 257)
201 * |-- b/ (ino 258)
202 * |-- c/ (ino 259)
203 * | |-- x/ (ino 260)
204 * |
205 * |-- y/ (ino 261)
206 *
207 * Send snapshot:
208 *
209 * . (ino 256)
210 * |-- a/ (ino 257)
211 * |-- b/ (ino 258)
212 * |-- YY/ (ino 261)
213 * |-- x/ (ino 260)
214 *
215 * Sequence of steps that lead to the send snapshot:
216 * rm -f /a/b/c/foo.txt
217 * mv /a/b/y /a/b/YY
218 * mv /a/b/c/x /a/b/YY
219 * rmdir /a/b/c
220 *
221 * When the child is processed, its move/rename is delayed until its
222 * parent is processed (as explained above), but all other operations
223 * like update utimes, chown, chgrp, etc, are performed and the paths
224 * that it uses for those operations must use the orphanized name of
225 * its parent (the directory we're going to rm later), so we need to
226 * memorize that name.
227 *
228 * Indexed by the inode number of the directory to be deleted.
229 */
230 struct rb_root orphan_dirs;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +0000231};
232
233struct pending_dir_move {
234 struct rb_node node;
235 struct list_head list;
236 u64 parent_ino;
237 u64 ino;
238 u64 gen;
239 struct list_head update_refs;
240};
241
242struct waiting_dir_move {
243 struct rb_node node;
244 u64 ino;
Filipe Manana9dc44212014-02-19 14:31:44 +0000245 /*
246 * There might be some directory that could not be removed because it
247 * was waiting for this directory inode to be moved first. Therefore
248 * after this directory is moved, we can try to rmdir the ino rmdir_ino.
249 */
250 u64 rmdir_ino;
Filipe Manana8b191a62015-04-09 14:09:14 +0100251 bool orphanized;
Filipe Manana9dc44212014-02-19 14:31:44 +0000252};
253
254struct orphan_dir_info {
255 struct rb_node node;
256 u64 ino;
257 u64 gen;
Alexander Block31db9f72012-07-25 23:19:24 +0200258};
259
260struct name_cache_entry {
261 struct list_head list;
Alexander Block7e0926f2012-07-28 14:20:58 +0200262 /*
263 * radix_tree has only 32bit entries but we need to handle 64bit inums.
264 * We use the lower 32bit of the 64bit inum to store it in the tree. If
265 * more then one inum would fall into the same entry, we use radix_list
266 * to store the additional entries. radix_list is also used to store
267 * entries where two entries have the same inum but different
268 * generations.
269 */
270 struct list_head radix_list;
Alexander Block31db9f72012-07-25 23:19:24 +0200271 u64 ino;
272 u64 gen;
273 u64 parent_ino;
274 u64 parent_gen;
275 int ret;
276 int need_later_update;
277 int name_len;
278 char name[];
279};
280
Filipe Manana95155582016-08-01 01:50:37 +0100281static void inconsistent_snapshot_error(struct send_ctx *sctx,
282 enum btrfs_compare_tree_result result,
283 const char *what)
284{
285 const char *result_string;
286
287 switch (result) {
288 case BTRFS_COMPARE_TREE_NEW:
289 result_string = "new";
290 break;
291 case BTRFS_COMPARE_TREE_DELETED:
292 result_string = "deleted";
293 break;
294 case BTRFS_COMPARE_TREE_CHANGED:
295 result_string = "updated";
296 break;
297 case BTRFS_COMPARE_TREE_SAME:
298 ASSERT(0);
299 result_string = "unchanged";
300 break;
301 default:
302 ASSERT(0);
303 result_string = "unexpected";
304 }
305
306 btrfs_err(sctx->send_root->fs_info,
307 "Send: inconsistent snapshot, found %s %s for inode %llu without updated inode item, send root is %llu, parent root is %llu",
308 result_string, what, sctx->cmp_key->objectid,
309 sctx->send_root->root_key.objectid,
310 (sctx->parent_root ?
311 sctx->parent_root->root_key.objectid : 0));
312}
313
Filipe David Borba Manana9f037402014-01-22 10:00:53 +0000314static int is_waiting_for_move(struct send_ctx *sctx, u64 ino);
315
Filipe Manana9dc44212014-02-19 14:31:44 +0000316static struct waiting_dir_move *
317get_waiting_dir_move(struct send_ctx *sctx, u64 ino);
318
319static int is_waiting_for_rm(struct send_ctx *sctx, u64 dir_ino);
320
Josef Bacik16e75492013-10-22 12:18:51 -0400321static int need_send_hole(struct send_ctx *sctx)
322{
323 return (sctx->parent_root && !sctx->cur_inode_new &&
324 !sctx->cur_inode_new_gen && !sctx->cur_inode_deleted &&
325 S_ISREG(sctx->cur_inode_mode));
326}
327
Alexander Block31db9f72012-07-25 23:19:24 +0200328static void fs_path_reset(struct fs_path *p)
329{
330 if (p->reversed) {
331 p->start = p->buf + p->buf_len - 1;
332 p->end = p->start;
333 *p->start = 0;
334 } else {
335 p->start = p->buf;
336 p->end = p->start;
337 *p->start = 0;
338 }
339}
340
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000341static struct fs_path *fs_path_alloc(void)
Alexander Block31db9f72012-07-25 23:19:24 +0200342{
343 struct fs_path *p;
344
David Sterbae780b0d2016-01-18 18:42:13 +0100345 p = kmalloc(sizeof(*p), GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +0200346 if (!p)
347 return NULL;
348 p->reversed = 0;
Alexander Block31db9f72012-07-25 23:19:24 +0200349 p->buf = p->inline_buf;
350 p->buf_len = FS_PATH_INLINE_SIZE;
351 fs_path_reset(p);
352 return p;
353}
354
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000355static struct fs_path *fs_path_alloc_reversed(void)
Alexander Block31db9f72012-07-25 23:19:24 +0200356{
357 struct fs_path *p;
358
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000359 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +0200360 if (!p)
361 return NULL;
362 p->reversed = 1;
363 fs_path_reset(p);
364 return p;
365}
366
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000367static void fs_path_free(struct fs_path *p)
Alexander Block31db9f72012-07-25 23:19:24 +0200368{
369 if (!p)
370 return;
David Sterbaace01052014-02-05 16:17:34 +0100371 if (p->buf != p->inline_buf)
372 kfree(p->buf);
Alexander Block31db9f72012-07-25 23:19:24 +0200373 kfree(p);
374}
375
376static int fs_path_len(struct fs_path *p)
377{
378 return p->end - p->start;
379}
380
381static int fs_path_ensure_buf(struct fs_path *p, int len)
382{
383 char *tmp_buf;
384 int path_len;
385 int old_buf_len;
386
387 len++;
388
389 if (p->buf_len >= len)
390 return 0;
391
Chris Masoncfd4a532014-04-26 05:02:03 -0700392 if (len > PATH_MAX) {
393 WARN_ON(1);
394 return -ENOMEM;
395 }
396
David Sterba1b2782c2014-02-25 19:32:59 +0100397 path_len = p->end - p->start;
398 old_buf_len = p->buf_len;
399
David Sterbaace01052014-02-05 16:17:34 +0100400 /*
401 * First time the inline_buf does not suffice
402 */
Filipe Manana01a9a8a2014-05-21 17:38:13 +0100403 if (p->buf == p->inline_buf) {
David Sterbae780b0d2016-01-18 18:42:13 +0100404 tmp_buf = kmalloc(len, GFP_KERNEL);
Filipe Manana01a9a8a2014-05-21 17:38:13 +0100405 if (tmp_buf)
406 memcpy(tmp_buf, p->buf, old_buf_len);
407 } else {
David Sterbae780b0d2016-01-18 18:42:13 +0100408 tmp_buf = krealloc(p->buf, len, GFP_KERNEL);
Filipe Manana01a9a8a2014-05-21 17:38:13 +0100409 }
David Sterba9c9ca002014-02-25 19:33:08 +0100410 if (!tmp_buf)
411 return -ENOMEM;
412 p->buf = tmp_buf;
413 /*
414 * The real size of the buffer is bigger, this will let the fast path
415 * happen most of the time
416 */
417 p->buf_len = ksize(p->buf);
David Sterbaace01052014-02-05 16:17:34 +0100418
Alexander Block31db9f72012-07-25 23:19:24 +0200419 if (p->reversed) {
420 tmp_buf = p->buf + old_buf_len - path_len - 1;
421 p->end = p->buf + p->buf_len - 1;
422 p->start = p->end - path_len;
423 memmove(p->start, tmp_buf, path_len + 1);
424 } else {
425 p->start = p->buf;
426 p->end = p->start + path_len;
427 }
428 return 0;
429}
430
David Sterbab23ab572014-02-03 19:23:19 +0100431static int fs_path_prepare_for_add(struct fs_path *p, int name_len,
432 char **prepared)
Alexander Block31db9f72012-07-25 23:19:24 +0200433{
434 int ret;
435 int new_len;
436
437 new_len = p->end - p->start + name_len;
438 if (p->start != p->end)
439 new_len++;
440 ret = fs_path_ensure_buf(p, new_len);
441 if (ret < 0)
442 goto out;
443
444 if (p->reversed) {
445 if (p->start != p->end)
446 *--p->start = '/';
447 p->start -= name_len;
David Sterbab23ab572014-02-03 19:23:19 +0100448 *prepared = p->start;
Alexander Block31db9f72012-07-25 23:19:24 +0200449 } else {
450 if (p->start != p->end)
451 *p->end++ = '/';
David Sterbab23ab572014-02-03 19:23:19 +0100452 *prepared = p->end;
Alexander Block31db9f72012-07-25 23:19:24 +0200453 p->end += name_len;
454 *p->end = 0;
455 }
456
457out:
458 return ret;
459}
460
461static int fs_path_add(struct fs_path *p, const char *name, int name_len)
462{
463 int ret;
David Sterbab23ab572014-02-03 19:23:19 +0100464 char *prepared;
Alexander Block31db9f72012-07-25 23:19:24 +0200465
David Sterbab23ab572014-02-03 19:23:19 +0100466 ret = fs_path_prepare_for_add(p, name_len, &prepared);
Alexander Block31db9f72012-07-25 23:19:24 +0200467 if (ret < 0)
468 goto out;
David Sterbab23ab572014-02-03 19:23:19 +0100469 memcpy(prepared, name, name_len);
Alexander Block31db9f72012-07-25 23:19:24 +0200470
471out:
472 return ret;
473}
474
475static int fs_path_add_path(struct fs_path *p, struct fs_path *p2)
476{
477 int ret;
David Sterbab23ab572014-02-03 19:23:19 +0100478 char *prepared;
Alexander Block31db9f72012-07-25 23:19:24 +0200479
David Sterbab23ab572014-02-03 19:23:19 +0100480 ret = fs_path_prepare_for_add(p, p2->end - p2->start, &prepared);
Alexander Block31db9f72012-07-25 23:19:24 +0200481 if (ret < 0)
482 goto out;
David Sterbab23ab572014-02-03 19:23:19 +0100483 memcpy(prepared, p2->start, p2->end - p2->start);
Alexander Block31db9f72012-07-25 23:19:24 +0200484
485out:
486 return ret;
487}
488
489static int fs_path_add_from_extent_buffer(struct fs_path *p,
490 struct extent_buffer *eb,
491 unsigned long off, int len)
492{
493 int ret;
David Sterbab23ab572014-02-03 19:23:19 +0100494 char *prepared;
Alexander Block31db9f72012-07-25 23:19:24 +0200495
David Sterbab23ab572014-02-03 19:23:19 +0100496 ret = fs_path_prepare_for_add(p, len, &prepared);
Alexander Block31db9f72012-07-25 23:19:24 +0200497 if (ret < 0)
498 goto out;
499
David Sterbab23ab572014-02-03 19:23:19 +0100500 read_extent_buffer(eb, prepared, off, len);
Alexander Block31db9f72012-07-25 23:19:24 +0200501
502out:
503 return ret;
504}
505
Alexander Block31db9f72012-07-25 23:19:24 +0200506static int fs_path_copy(struct fs_path *p, struct fs_path *from)
507{
508 int ret;
509
510 p->reversed = from->reversed;
511 fs_path_reset(p);
512
513 ret = fs_path_add_path(p, from);
514
515 return ret;
516}
517
518
519static void fs_path_unreverse(struct fs_path *p)
520{
521 char *tmp;
522 int len;
523
524 if (!p->reversed)
525 return;
526
527 tmp = p->start;
528 len = p->end - p->start;
529 p->start = p->buf;
530 p->end = p->start + len;
531 memmove(p->start, tmp, len + 1);
532 p->reversed = 0;
533}
534
535static struct btrfs_path *alloc_path_for_send(void)
536{
537 struct btrfs_path *path;
538
539 path = btrfs_alloc_path();
540 if (!path)
541 return NULL;
542 path->search_commit_root = 1;
543 path->skip_locking = 1;
Josef Bacik3f8a18c2014-03-28 17:16:01 -0400544 path->need_commit_sem = 1;
Alexander Block31db9f72012-07-25 23:19:24 +0200545 return path;
546}
547
Eric Sandeen48a3b632013-04-25 20:41:01 +0000548static int write_buf(struct file *filp, const void *buf, u32 len, loff_t *off)
Alexander Block31db9f72012-07-25 23:19:24 +0200549{
550 int ret;
551 mm_segment_t old_fs;
552 u32 pos = 0;
553
554 old_fs = get_fs();
555 set_fs(KERNEL_DS);
556
557 while (pos < len) {
Fabian Frederickd447d0d2014-07-15 21:17:17 +0200558 ret = vfs_write(filp, (__force const char __user *)buf + pos,
559 len - pos, off);
Alexander Block31db9f72012-07-25 23:19:24 +0200560 /* TODO handle that correctly */
561 /*if (ret == -ERESTARTSYS) {
562 continue;
563 }*/
564 if (ret < 0)
565 goto out;
566 if (ret == 0) {
567 ret = -EIO;
568 goto out;
569 }
570 pos += ret;
571 }
572
573 ret = 0;
574
575out:
576 set_fs(old_fs);
577 return ret;
578}
579
580static int tlv_put(struct send_ctx *sctx, u16 attr, const void *data, int len)
581{
582 struct btrfs_tlv_header *hdr;
583 int total_len = sizeof(*hdr) + len;
584 int left = sctx->send_max_size - sctx->send_size;
585
586 if (unlikely(left < total_len))
587 return -EOVERFLOW;
588
589 hdr = (struct btrfs_tlv_header *) (sctx->send_buf + sctx->send_size);
590 hdr->tlv_type = cpu_to_le16(attr);
591 hdr->tlv_len = cpu_to_le16(len);
592 memcpy(hdr + 1, data, len);
593 sctx->send_size += total_len;
594
595 return 0;
596}
597
David Sterba95bc79d2013-12-16 17:34:10 +0100598#define TLV_PUT_DEFINE_INT(bits) \
599 static int tlv_put_u##bits(struct send_ctx *sctx, \
600 u##bits attr, u##bits value) \
601 { \
602 __le##bits __tmp = cpu_to_le##bits(value); \
603 return tlv_put(sctx, attr, &__tmp, sizeof(__tmp)); \
604 }
Alexander Block31db9f72012-07-25 23:19:24 +0200605
David Sterba95bc79d2013-12-16 17:34:10 +0100606TLV_PUT_DEFINE_INT(64)
Alexander Block31db9f72012-07-25 23:19:24 +0200607
608static int tlv_put_string(struct send_ctx *sctx, u16 attr,
609 const char *str, int len)
610{
611 if (len == -1)
612 len = strlen(str);
613 return tlv_put(sctx, attr, str, len);
614}
615
616static int tlv_put_uuid(struct send_ctx *sctx, u16 attr,
617 const u8 *uuid)
618{
619 return tlv_put(sctx, attr, uuid, BTRFS_UUID_SIZE);
620}
621
Alexander Block31db9f72012-07-25 23:19:24 +0200622static int tlv_put_btrfs_timespec(struct send_ctx *sctx, u16 attr,
623 struct extent_buffer *eb,
624 struct btrfs_timespec *ts)
625{
626 struct btrfs_timespec bts;
627 read_extent_buffer(eb, &bts, (unsigned long)ts, sizeof(bts));
628 return tlv_put(sctx, attr, &bts, sizeof(bts));
629}
630
631
632#define TLV_PUT(sctx, attrtype, attrlen, data) \
633 do { \
634 ret = tlv_put(sctx, attrtype, attrlen, data); \
635 if (ret < 0) \
636 goto tlv_put_failure; \
637 } while (0)
638
639#define TLV_PUT_INT(sctx, attrtype, bits, value) \
640 do { \
641 ret = tlv_put_u##bits(sctx, attrtype, value); \
642 if (ret < 0) \
643 goto tlv_put_failure; \
644 } while (0)
645
646#define TLV_PUT_U8(sctx, attrtype, data) TLV_PUT_INT(sctx, attrtype, 8, data)
647#define TLV_PUT_U16(sctx, attrtype, data) TLV_PUT_INT(sctx, attrtype, 16, data)
648#define TLV_PUT_U32(sctx, attrtype, data) TLV_PUT_INT(sctx, attrtype, 32, data)
649#define TLV_PUT_U64(sctx, attrtype, data) TLV_PUT_INT(sctx, attrtype, 64, data)
650#define TLV_PUT_STRING(sctx, attrtype, str, len) \
651 do { \
652 ret = tlv_put_string(sctx, attrtype, str, len); \
653 if (ret < 0) \
654 goto tlv_put_failure; \
655 } while (0)
656#define TLV_PUT_PATH(sctx, attrtype, p) \
657 do { \
658 ret = tlv_put_string(sctx, attrtype, p->start, \
659 p->end - p->start); \
660 if (ret < 0) \
661 goto tlv_put_failure; \
662 } while(0)
663#define TLV_PUT_UUID(sctx, attrtype, uuid) \
664 do { \
665 ret = tlv_put_uuid(sctx, attrtype, uuid); \
666 if (ret < 0) \
667 goto tlv_put_failure; \
668 } while (0)
Alexander Block31db9f72012-07-25 23:19:24 +0200669#define TLV_PUT_BTRFS_TIMESPEC(sctx, attrtype, eb, ts) \
670 do { \
671 ret = tlv_put_btrfs_timespec(sctx, attrtype, eb, ts); \
672 if (ret < 0) \
673 goto tlv_put_failure; \
674 } while (0)
675
676static int send_header(struct send_ctx *sctx)
677{
678 struct btrfs_stream_header hdr;
679
680 strcpy(hdr.magic, BTRFS_SEND_STREAM_MAGIC);
681 hdr.version = cpu_to_le32(BTRFS_SEND_STREAM_VERSION);
682
Anand Jain1bcea352012-09-14 00:04:21 -0600683 return write_buf(sctx->send_filp, &hdr, sizeof(hdr),
684 &sctx->send_off);
Alexander Block31db9f72012-07-25 23:19:24 +0200685}
686
687/*
688 * For each command/item we want to send to userspace, we call this function.
689 */
690static int begin_cmd(struct send_ctx *sctx, int cmd)
691{
692 struct btrfs_cmd_header *hdr;
693
Dulshani Gunawardhanafae7f212013-10-31 10:30:08 +0530694 if (WARN_ON(!sctx->send_buf))
Alexander Block31db9f72012-07-25 23:19:24 +0200695 return -EINVAL;
Alexander Block31db9f72012-07-25 23:19:24 +0200696
697 BUG_ON(sctx->send_size);
698
699 sctx->send_size += sizeof(*hdr);
700 hdr = (struct btrfs_cmd_header *)sctx->send_buf;
701 hdr->cmd = cpu_to_le16(cmd);
702
703 return 0;
704}
705
706static int send_cmd(struct send_ctx *sctx)
707{
708 int ret;
709 struct btrfs_cmd_header *hdr;
710 u32 crc;
711
712 hdr = (struct btrfs_cmd_header *)sctx->send_buf;
713 hdr->len = cpu_to_le32(sctx->send_size - sizeof(*hdr));
714 hdr->crc = 0;
715
Filipe David Borba Manana0b947af2014-01-29 21:06:04 +0000716 crc = btrfs_crc32c(0, (unsigned char *)sctx->send_buf, sctx->send_size);
Alexander Block31db9f72012-07-25 23:19:24 +0200717 hdr->crc = cpu_to_le32(crc);
718
Anand Jain1bcea352012-09-14 00:04:21 -0600719 ret = write_buf(sctx->send_filp, sctx->send_buf, sctx->send_size,
720 &sctx->send_off);
Alexander Block31db9f72012-07-25 23:19:24 +0200721
722 sctx->total_send_size += sctx->send_size;
723 sctx->cmd_send_size[le16_to_cpu(hdr->cmd)] += sctx->send_size;
724 sctx->send_size = 0;
725
726 return ret;
727}
728
729/*
730 * Sends a move instruction to user space
731 */
732static int send_rename(struct send_ctx *sctx,
733 struct fs_path *from, struct fs_path *to)
734{
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400735 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +0200736 int ret;
737
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400738 btrfs_debug(fs_info, "send_rename %s -> %s", from->start, to->start);
Alexander Block31db9f72012-07-25 23:19:24 +0200739
740 ret = begin_cmd(sctx, BTRFS_SEND_C_RENAME);
741 if (ret < 0)
742 goto out;
743
744 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, from);
745 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH_TO, to);
746
747 ret = send_cmd(sctx);
748
749tlv_put_failure:
750out:
751 return ret;
752}
753
754/*
755 * Sends a link instruction to user space
756 */
757static int send_link(struct send_ctx *sctx,
758 struct fs_path *path, struct fs_path *lnk)
759{
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400760 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +0200761 int ret;
762
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400763 btrfs_debug(fs_info, "send_link %s -> %s", path->start, lnk->start);
Alexander Block31db9f72012-07-25 23:19:24 +0200764
765 ret = begin_cmd(sctx, BTRFS_SEND_C_LINK);
766 if (ret < 0)
767 goto out;
768
769 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, path);
770 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH_LINK, lnk);
771
772 ret = send_cmd(sctx);
773
774tlv_put_failure:
775out:
776 return ret;
777}
778
779/*
780 * Sends an unlink instruction to user space
781 */
782static int send_unlink(struct send_ctx *sctx, struct fs_path *path)
783{
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400784 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +0200785 int ret;
786
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400787 btrfs_debug(fs_info, "send_unlink %s", path->start);
Alexander Block31db9f72012-07-25 23:19:24 +0200788
789 ret = begin_cmd(sctx, BTRFS_SEND_C_UNLINK);
790 if (ret < 0)
791 goto out;
792
793 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, path);
794
795 ret = send_cmd(sctx);
796
797tlv_put_failure:
798out:
799 return ret;
800}
801
802/*
803 * Sends a rmdir instruction to user space
804 */
805static int send_rmdir(struct send_ctx *sctx, struct fs_path *path)
806{
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400807 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +0200808 int ret;
809
Jeff Mahoney04ab9562016-09-20 10:05:03 -0400810 btrfs_debug(fs_info, "send_rmdir %s", path->start);
Alexander Block31db9f72012-07-25 23:19:24 +0200811
812 ret = begin_cmd(sctx, BTRFS_SEND_C_RMDIR);
813 if (ret < 0)
814 goto out;
815
816 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, path);
817
818 ret = send_cmd(sctx);
819
820tlv_put_failure:
821out:
822 return ret;
823}
824
825/*
826 * Helper function to retrieve some fields from an inode item.
827 */
Josef Bacik3f8a18c2014-03-28 17:16:01 -0400828static int __get_inode_info(struct btrfs_root *root, struct btrfs_path *path,
829 u64 ino, u64 *size, u64 *gen, u64 *mode, u64 *uid,
830 u64 *gid, u64 *rdev)
Alexander Block31db9f72012-07-25 23:19:24 +0200831{
832 int ret;
833 struct btrfs_inode_item *ii;
834 struct btrfs_key key;
Alexander Block31db9f72012-07-25 23:19:24 +0200835
836 key.objectid = ino;
837 key.type = BTRFS_INODE_ITEM_KEY;
838 key.offset = 0;
839 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
Alexander Block31db9f72012-07-25 23:19:24 +0200840 if (ret) {
Josef Bacik3f8a18c2014-03-28 17:16:01 -0400841 if (ret > 0)
842 ret = -ENOENT;
843 return ret;
Alexander Block31db9f72012-07-25 23:19:24 +0200844 }
845
846 ii = btrfs_item_ptr(path->nodes[0], path->slots[0],
847 struct btrfs_inode_item);
848 if (size)
849 *size = btrfs_inode_size(path->nodes[0], ii);
850 if (gen)
851 *gen = btrfs_inode_generation(path->nodes[0], ii);
852 if (mode)
853 *mode = btrfs_inode_mode(path->nodes[0], ii);
854 if (uid)
855 *uid = btrfs_inode_uid(path->nodes[0], ii);
856 if (gid)
857 *gid = btrfs_inode_gid(path->nodes[0], ii);
Alexander Block85a7b332012-07-26 23:39:10 +0200858 if (rdev)
859 *rdev = btrfs_inode_rdev(path->nodes[0], ii);
Alexander Block31db9f72012-07-25 23:19:24 +0200860
Josef Bacik3f8a18c2014-03-28 17:16:01 -0400861 return ret;
862}
863
864static int get_inode_info(struct btrfs_root *root,
865 u64 ino, u64 *size, u64 *gen,
866 u64 *mode, u64 *uid, u64 *gid,
867 u64 *rdev)
868{
869 struct btrfs_path *path;
870 int ret;
871
872 path = alloc_path_for_send();
873 if (!path)
874 return -ENOMEM;
875 ret = __get_inode_info(root, path, ino, size, gen, mode, uid, gid,
876 rdev);
Alexander Block31db9f72012-07-25 23:19:24 +0200877 btrfs_free_path(path);
878 return ret;
879}
880
881typedef int (*iterate_inode_ref_t)(int num, u64 dir, int index,
882 struct fs_path *p,
883 void *ctx);
884
885/*
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000886 * Helper function to iterate the entries in ONE btrfs_inode_ref or
887 * btrfs_inode_extref.
Alexander Block31db9f72012-07-25 23:19:24 +0200888 * The iterate callback may return a non zero value to stop iteration. This can
889 * be a negative value for error codes or 1 to simply stop it.
890 *
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000891 * path must point to the INODE_REF or INODE_EXTREF when called.
Alexander Block31db9f72012-07-25 23:19:24 +0200892 */
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000893static int iterate_inode_ref(struct btrfs_root *root, struct btrfs_path *path,
Alexander Block31db9f72012-07-25 23:19:24 +0200894 struct btrfs_key *found_key, int resolve,
895 iterate_inode_ref_t iterate, void *ctx)
896{
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000897 struct extent_buffer *eb = path->nodes[0];
Alexander Block31db9f72012-07-25 23:19:24 +0200898 struct btrfs_item *item;
899 struct btrfs_inode_ref *iref;
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000900 struct btrfs_inode_extref *extref;
Alexander Block31db9f72012-07-25 23:19:24 +0200901 struct btrfs_path *tmp_path;
902 struct fs_path *p;
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000903 u32 cur = 0;
Alexander Block31db9f72012-07-25 23:19:24 +0200904 u32 total;
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000905 int slot = path->slots[0];
Alexander Block31db9f72012-07-25 23:19:24 +0200906 u32 name_len;
907 char *start;
908 int ret = 0;
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000909 int num = 0;
Alexander Block31db9f72012-07-25 23:19:24 +0200910 int index;
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000911 u64 dir;
912 unsigned long name_off;
913 unsigned long elem_size;
914 unsigned long ptr;
Alexander Block31db9f72012-07-25 23:19:24 +0200915
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000916 p = fs_path_alloc_reversed();
Alexander Block31db9f72012-07-25 23:19:24 +0200917 if (!p)
918 return -ENOMEM;
919
920 tmp_path = alloc_path_for_send();
921 if (!tmp_path) {
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000922 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +0200923 return -ENOMEM;
924 }
925
Alexander Block31db9f72012-07-25 23:19:24 +0200926
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000927 if (found_key->type == BTRFS_INODE_REF_KEY) {
928 ptr = (unsigned long)btrfs_item_ptr(eb, slot,
929 struct btrfs_inode_ref);
Ross Kirkdd3cc162013-09-16 15:58:09 +0100930 item = btrfs_item_nr(slot);
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000931 total = btrfs_item_size(eb, item);
932 elem_size = sizeof(*iref);
933 } else {
934 ptr = btrfs_item_ptr_offset(eb, slot);
935 total = btrfs_item_size_nr(eb, slot);
936 elem_size = sizeof(*extref);
937 }
938
Alexander Block31db9f72012-07-25 23:19:24 +0200939 while (cur < total) {
940 fs_path_reset(p);
941
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000942 if (found_key->type == BTRFS_INODE_REF_KEY) {
943 iref = (struct btrfs_inode_ref *)(ptr + cur);
944 name_len = btrfs_inode_ref_name_len(eb, iref);
945 name_off = (unsigned long)(iref + 1);
946 index = btrfs_inode_ref_index(eb, iref);
947 dir = found_key->offset;
948 } else {
949 extref = (struct btrfs_inode_extref *)(ptr + cur);
950 name_len = btrfs_inode_extref_name_len(eb, extref);
951 name_off = (unsigned long)&extref->name;
952 index = btrfs_inode_extref_index(eb, extref);
953 dir = btrfs_inode_extref_parent(eb, extref);
954 }
955
Alexander Block31db9f72012-07-25 23:19:24 +0200956 if (resolve) {
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000957 start = btrfs_ref_to_path(root, tmp_path, name_len,
958 name_off, eb, dir,
959 p->buf, p->buf_len);
Alexander Block31db9f72012-07-25 23:19:24 +0200960 if (IS_ERR(start)) {
961 ret = PTR_ERR(start);
962 goto out;
963 }
964 if (start < p->buf) {
965 /* overflow , try again with larger buffer */
966 ret = fs_path_ensure_buf(p,
967 p->buf_len + p->buf - start);
968 if (ret < 0)
969 goto out;
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000970 start = btrfs_ref_to_path(root, tmp_path,
971 name_len, name_off,
972 eb, dir,
973 p->buf, p->buf_len);
Alexander Block31db9f72012-07-25 23:19:24 +0200974 if (IS_ERR(start)) {
975 ret = PTR_ERR(start);
976 goto out;
977 }
978 BUG_ON(start < p->buf);
979 }
980 p->start = start;
981 } else {
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000982 ret = fs_path_add_from_extent_buffer(p, eb, name_off,
983 name_len);
Alexander Block31db9f72012-07-25 23:19:24 +0200984 if (ret < 0)
985 goto out;
986 }
987
Jan Schmidt96b5bd72012-10-15 08:30:45 +0000988 cur += elem_size + name_len;
989 ret = iterate(num, dir, index, p, ctx);
Alexander Block31db9f72012-07-25 23:19:24 +0200990 if (ret)
991 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +0200992 num++;
993 }
994
995out:
996 btrfs_free_path(tmp_path);
Tsutomu Itoh924794c2013-05-08 07:51:52 +0000997 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +0200998 return ret;
999}
1000
1001typedef int (*iterate_dir_item_t)(int num, struct btrfs_key *di_key,
1002 const char *name, int name_len,
1003 const char *data, int data_len,
1004 u8 type, void *ctx);
1005
1006/*
1007 * Helper function to iterate the entries in ONE btrfs_dir_item.
1008 * The iterate callback may return a non zero value to stop iteration. This can
1009 * be a negative value for error codes or 1 to simply stop it.
1010 *
1011 * path must point to the dir item when called.
1012 */
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001013static int iterate_dir_item(struct btrfs_root *root, struct btrfs_path *path,
Alexander Block31db9f72012-07-25 23:19:24 +02001014 struct btrfs_key *found_key,
1015 iterate_dir_item_t iterate, void *ctx)
1016{
1017 int ret = 0;
1018 struct extent_buffer *eb;
1019 struct btrfs_item *item;
1020 struct btrfs_dir_item *di;
Alexander Block31db9f72012-07-25 23:19:24 +02001021 struct btrfs_key di_key;
1022 char *buf = NULL;
Filipe Manana7e3ae332014-05-23 20:15:16 +01001023 int buf_len;
Alexander Block31db9f72012-07-25 23:19:24 +02001024 u32 name_len;
1025 u32 data_len;
1026 u32 cur;
1027 u32 len;
1028 u32 total;
1029 int slot;
1030 int num;
1031 u8 type;
1032
Filipe Manana4395e0c2014-08-20 10:45:45 +01001033 /*
1034 * Start with a small buffer (1 page). If later we end up needing more
1035 * space, which can happen for xattrs on a fs with a leaf size greater
1036 * then the page size, attempt to increase the buffer. Typically xattr
1037 * values are small.
1038 */
1039 buf_len = PATH_MAX;
David Sterbae780b0d2016-01-18 18:42:13 +01001040 buf = kmalloc(buf_len, GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +02001041 if (!buf) {
1042 ret = -ENOMEM;
1043 goto out;
1044 }
1045
Alexander Block31db9f72012-07-25 23:19:24 +02001046 eb = path->nodes[0];
1047 slot = path->slots[0];
Ross Kirkdd3cc162013-09-16 15:58:09 +01001048 item = btrfs_item_nr(slot);
Alexander Block31db9f72012-07-25 23:19:24 +02001049 di = btrfs_item_ptr(eb, slot, struct btrfs_dir_item);
1050 cur = 0;
1051 len = 0;
1052 total = btrfs_item_size(eb, item);
1053
1054 num = 0;
1055 while (cur < total) {
1056 name_len = btrfs_dir_name_len(eb, di);
1057 data_len = btrfs_dir_data_len(eb, di);
1058 type = btrfs_dir_type(eb, di);
1059 btrfs_dir_item_key_to_cpu(eb, di, &di_key);
1060
Filipe Manana7e3ae332014-05-23 20:15:16 +01001061 if (type == BTRFS_FT_XATTR) {
1062 if (name_len > XATTR_NAME_MAX) {
1063 ret = -ENAMETOOLONG;
1064 goto out;
1065 }
Filipe Manana4395e0c2014-08-20 10:45:45 +01001066 if (name_len + data_len > BTRFS_MAX_XATTR_SIZE(root)) {
Filipe Manana7e3ae332014-05-23 20:15:16 +01001067 ret = -E2BIG;
1068 goto out;
1069 }
1070 } else {
1071 /*
1072 * Path too long
1073 */
Filipe Manana4395e0c2014-08-20 10:45:45 +01001074 if (name_len + data_len > PATH_MAX) {
Filipe Manana7e3ae332014-05-23 20:15:16 +01001075 ret = -ENAMETOOLONG;
1076 goto out;
1077 }
Alexander Block31db9f72012-07-25 23:19:24 +02001078 }
1079
Filipe Manana4395e0c2014-08-20 10:45:45 +01001080 if (name_len + data_len > buf_len) {
1081 buf_len = name_len + data_len;
1082 if (is_vmalloc_addr(buf)) {
1083 vfree(buf);
1084 buf = NULL;
1085 } else {
1086 char *tmp = krealloc(buf, buf_len,
David Sterbae780b0d2016-01-18 18:42:13 +01001087 GFP_KERNEL | __GFP_NOWARN);
Filipe Manana4395e0c2014-08-20 10:45:45 +01001088
1089 if (!tmp)
1090 kfree(buf);
1091 buf = tmp;
1092 }
1093 if (!buf) {
1094 buf = vmalloc(buf_len);
1095 if (!buf) {
1096 ret = -ENOMEM;
1097 goto out;
1098 }
1099 }
1100 }
1101
Alexander Block31db9f72012-07-25 23:19:24 +02001102 read_extent_buffer(eb, buf, (unsigned long)(di + 1),
1103 name_len + data_len);
1104
1105 len = sizeof(*di) + name_len + data_len;
1106 di = (struct btrfs_dir_item *)((char *)di + len);
1107 cur += len;
1108
1109 ret = iterate(num, &di_key, buf, name_len, buf + name_len,
1110 data_len, type, ctx);
1111 if (ret < 0)
1112 goto out;
1113 if (ret) {
1114 ret = 0;
1115 goto out;
1116 }
1117
1118 num++;
1119 }
1120
1121out:
Filipe Manana4395e0c2014-08-20 10:45:45 +01001122 kvfree(buf);
Alexander Block31db9f72012-07-25 23:19:24 +02001123 return ret;
1124}
1125
1126static int __copy_first_ref(int num, u64 dir, int index,
1127 struct fs_path *p, void *ctx)
1128{
1129 int ret;
1130 struct fs_path *pt = ctx;
1131
1132 ret = fs_path_copy(pt, p);
1133 if (ret < 0)
1134 return ret;
1135
1136 /* we want the first only */
1137 return 1;
1138}
1139
1140/*
1141 * Retrieve the first path of an inode. If an inode has more then one
1142 * ref/hardlink, this is ignored.
1143 */
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001144static int get_inode_path(struct btrfs_root *root,
Alexander Block31db9f72012-07-25 23:19:24 +02001145 u64 ino, struct fs_path *path)
1146{
1147 int ret;
1148 struct btrfs_key key, found_key;
1149 struct btrfs_path *p;
1150
1151 p = alloc_path_for_send();
1152 if (!p)
1153 return -ENOMEM;
1154
1155 fs_path_reset(path);
1156
1157 key.objectid = ino;
1158 key.type = BTRFS_INODE_REF_KEY;
1159 key.offset = 0;
1160
1161 ret = btrfs_search_slot_for_read(root, &key, p, 1, 0);
1162 if (ret < 0)
1163 goto out;
1164 if (ret) {
1165 ret = 1;
1166 goto out;
1167 }
1168 btrfs_item_key_to_cpu(p->nodes[0], &found_key, p->slots[0]);
1169 if (found_key.objectid != ino ||
Jan Schmidt96b5bd72012-10-15 08:30:45 +00001170 (found_key.type != BTRFS_INODE_REF_KEY &&
1171 found_key.type != BTRFS_INODE_EXTREF_KEY)) {
Alexander Block31db9f72012-07-25 23:19:24 +02001172 ret = -ENOENT;
1173 goto out;
1174 }
1175
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001176 ret = iterate_inode_ref(root, p, &found_key, 1,
1177 __copy_first_ref, path);
Alexander Block31db9f72012-07-25 23:19:24 +02001178 if (ret < 0)
1179 goto out;
1180 ret = 0;
1181
1182out:
1183 btrfs_free_path(p);
1184 return ret;
1185}
1186
1187struct backref_ctx {
1188 struct send_ctx *sctx;
1189
Josef Bacik3f8a18c2014-03-28 17:16:01 -04001190 struct btrfs_path *path;
Alexander Block31db9f72012-07-25 23:19:24 +02001191 /* number of total found references */
1192 u64 found;
1193
1194 /*
1195 * used for clones found in send_root. clones found behind cur_objectid
1196 * and cur_offset are not considered as allowed clones.
1197 */
1198 u64 cur_objectid;
1199 u64 cur_offset;
1200
1201 /* may be truncated in case it's the last extent in a file */
1202 u64 extent_len;
1203
Filipe Manana619d8c42015-05-03 01:56:00 +01001204 /* data offset in the file extent item */
1205 u64 data_offset;
1206
Alexander Block31db9f72012-07-25 23:19:24 +02001207 /* Just to check for bugs in backref resolving */
Alexander Blockee849c02012-07-28 12:42:05 +02001208 int found_itself;
Alexander Block31db9f72012-07-25 23:19:24 +02001209};
1210
1211static int __clone_root_cmp_bsearch(const void *key, const void *elt)
1212{
Jan Schmidt995e01b2012-08-13 02:52:38 -06001213 u64 root = (u64)(uintptr_t)key;
Alexander Block31db9f72012-07-25 23:19:24 +02001214 struct clone_root *cr = (struct clone_root *)elt;
1215
1216 if (root < cr->root->objectid)
1217 return -1;
1218 if (root > cr->root->objectid)
1219 return 1;
1220 return 0;
1221}
1222
1223static int __clone_root_cmp_sort(const void *e1, const void *e2)
1224{
1225 struct clone_root *cr1 = (struct clone_root *)e1;
1226 struct clone_root *cr2 = (struct clone_root *)e2;
1227
1228 if (cr1->root->objectid < cr2->root->objectid)
1229 return -1;
1230 if (cr1->root->objectid > cr2->root->objectid)
1231 return 1;
1232 return 0;
1233}
1234
1235/*
1236 * Called for every backref that is found for the current extent.
Alexander Block766702e2012-07-28 14:11:31 +02001237 * Results are collected in sctx->clone_roots->ino/offset/found_refs
Alexander Block31db9f72012-07-25 23:19:24 +02001238 */
1239static int __iterate_backrefs(u64 ino, u64 offset, u64 root, void *ctx_)
1240{
1241 struct backref_ctx *bctx = ctx_;
1242 struct clone_root *found;
1243 int ret;
1244 u64 i_size;
1245
1246 /* First check if the root is in the list of accepted clone sources */
Jan Schmidt995e01b2012-08-13 02:52:38 -06001247 found = bsearch((void *)(uintptr_t)root, bctx->sctx->clone_roots,
Alexander Block31db9f72012-07-25 23:19:24 +02001248 bctx->sctx->clone_roots_cnt,
1249 sizeof(struct clone_root),
1250 __clone_root_cmp_bsearch);
1251 if (!found)
1252 return 0;
1253
1254 if (found->root == bctx->sctx->send_root &&
1255 ino == bctx->cur_objectid &&
1256 offset == bctx->cur_offset) {
Alexander Blockee849c02012-07-28 12:42:05 +02001257 bctx->found_itself = 1;
Alexander Block31db9f72012-07-25 23:19:24 +02001258 }
1259
1260 /*
Alexander Block766702e2012-07-28 14:11:31 +02001261 * There are inodes that have extents that lie behind its i_size. Don't
Alexander Block31db9f72012-07-25 23:19:24 +02001262 * accept clones from these extents.
1263 */
Josef Bacik3f8a18c2014-03-28 17:16:01 -04001264 ret = __get_inode_info(found->root, bctx->path, ino, &i_size, NULL, NULL,
1265 NULL, NULL, NULL);
1266 btrfs_release_path(bctx->path);
Alexander Block31db9f72012-07-25 23:19:24 +02001267 if (ret < 0)
1268 return ret;
1269
Filipe Manana619d8c42015-05-03 01:56:00 +01001270 if (offset + bctx->data_offset + bctx->extent_len > i_size)
Alexander Block31db9f72012-07-25 23:19:24 +02001271 return 0;
1272
1273 /*
1274 * Make sure we don't consider clones from send_root that are
1275 * behind the current inode/offset.
1276 */
1277 if (found->root == bctx->sctx->send_root) {
1278 /*
1279 * TODO for the moment we don't accept clones from the inode
1280 * that is currently send. We may change this when
1281 * BTRFS_IOC_CLONE_RANGE supports cloning from and to the same
1282 * file.
1283 */
1284 if (ino >= bctx->cur_objectid)
1285 return 0;
Alexander Blocke938c8a2012-07-28 16:33:49 +02001286#if 0
1287 if (ino > bctx->cur_objectid)
Alexander Block31db9f72012-07-25 23:19:24 +02001288 return 0;
Alexander Blocke938c8a2012-07-28 16:33:49 +02001289 if (offset + bctx->extent_len > bctx->cur_offset)
1290 return 0;
1291#endif
Alexander Block31db9f72012-07-25 23:19:24 +02001292 }
1293
1294 bctx->found++;
1295 found->found_refs++;
1296 if (ino < found->ino) {
1297 found->ino = ino;
1298 found->offset = offset;
1299 } else if (found->ino == ino) {
1300 /*
1301 * same extent found more then once in the same file.
1302 */
1303 if (found->offset > offset + bctx->extent_len)
1304 found->offset = offset;
1305 }
1306
1307 return 0;
1308}
1309
1310/*
Alexander Block766702e2012-07-28 14:11:31 +02001311 * Given an inode, offset and extent item, it finds a good clone for a clone
1312 * instruction. Returns -ENOENT when none could be found. The function makes
1313 * sure that the returned clone is usable at the point where sending is at the
1314 * moment. This means, that no clones are accepted which lie behind the current
1315 * inode+offset.
1316 *
Alexander Block31db9f72012-07-25 23:19:24 +02001317 * path must point to the extent item when called.
1318 */
1319static int find_extent_clone(struct send_ctx *sctx,
1320 struct btrfs_path *path,
1321 u64 ino, u64 data_offset,
1322 u64 ino_size,
1323 struct clone_root **found)
1324{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001325 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02001326 int ret;
1327 int extent_type;
1328 u64 logical;
Chris Mason74dd17f2012-08-07 16:25:13 -04001329 u64 disk_byte;
Alexander Block31db9f72012-07-25 23:19:24 +02001330 u64 num_bytes;
1331 u64 extent_item_pos;
Liu Bo69917e42012-09-07 20:01:28 -06001332 u64 flags = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02001333 struct btrfs_file_extent_item *fi;
1334 struct extent_buffer *eb = path->nodes[0];
Alexander Block35075bb2012-07-28 12:44:34 +02001335 struct backref_ctx *backref_ctx = NULL;
Alexander Block31db9f72012-07-25 23:19:24 +02001336 struct clone_root *cur_clone_root;
1337 struct btrfs_key found_key;
1338 struct btrfs_path *tmp_path;
Filipe Mananab6af12a2019-10-30 12:23:01 +00001339 struct btrfs_extent_item *ei;
Chris Mason74dd17f2012-08-07 16:25:13 -04001340 int compressed;
Alexander Block31db9f72012-07-25 23:19:24 +02001341 u32 i;
1342
1343 tmp_path = alloc_path_for_send();
1344 if (!tmp_path)
1345 return -ENOMEM;
1346
Josef Bacik3f8a18c2014-03-28 17:16:01 -04001347 /* We only use this path under the commit sem */
1348 tmp_path->need_commit_sem = 0;
1349
David Sterbae780b0d2016-01-18 18:42:13 +01001350 backref_ctx = kmalloc(sizeof(*backref_ctx), GFP_KERNEL);
Alexander Block35075bb2012-07-28 12:44:34 +02001351 if (!backref_ctx) {
1352 ret = -ENOMEM;
1353 goto out;
1354 }
1355
Josef Bacik3f8a18c2014-03-28 17:16:01 -04001356 backref_ctx->path = tmp_path;
1357
Alexander Block31db9f72012-07-25 23:19:24 +02001358 if (data_offset >= ino_size) {
1359 /*
1360 * There may be extents that lie behind the file's size.
1361 * I at least had this in combination with snapshotting while
1362 * writing large files.
1363 */
1364 ret = 0;
1365 goto out;
1366 }
1367
1368 fi = btrfs_item_ptr(eb, path->slots[0],
1369 struct btrfs_file_extent_item);
1370 extent_type = btrfs_file_extent_type(eb, fi);
1371 if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
1372 ret = -ENOENT;
1373 goto out;
1374 }
Chris Mason74dd17f2012-08-07 16:25:13 -04001375 compressed = btrfs_file_extent_compression(eb, fi);
Alexander Block31db9f72012-07-25 23:19:24 +02001376
1377 num_bytes = btrfs_file_extent_num_bytes(eb, fi);
Chris Mason74dd17f2012-08-07 16:25:13 -04001378 disk_byte = btrfs_file_extent_disk_bytenr(eb, fi);
1379 if (disk_byte == 0) {
Alexander Block31db9f72012-07-25 23:19:24 +02001380 ret = -ENOENT;
1381 goto out;
1382 }
Chris Mason74dd17f2012-08-07 16:25:13 -04001383 logical = disk_byte + btrfs_file_extent_offset(eb, fi);
Alexander Block31db9f72012-07-25 23:19:24 +02001384
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001385 down_read(&fs_info->commit_root_sem);
1386 ret = extent_from_logical(fs_info, disk_byte, tmp_path,
Liu Bo69917e42012-09-07 20:01:28 -06001387 &found_key, &flags);
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001388 up_read(&fs_info->commit_root_sem);
Alexander Block31db9f72012-07-25 23:19:24 +02001389
1390 if (ret < 0)
1391 goto out;
Liu Bo69917e42012-09-07 20:01:28 -06001392 if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
Alexander Block31db9f72012-07-25 23:19:24 +02001393 ret = -EIO;
1394 goto out;
1395 }
1396
Filipe Mananab6af12a2019-10-30 12:23:01 +00001397 ei = btrfs_item_ptr(tmp_path->nodes[0], tmp_path->slots[0],
1398 struct btrfs_extent_item);
1399 /*
1400 * Backreference walking (iterate_extent_inodes() below) is currently
1401 * too expensive when an extent has a large number of references, both
1402 * in time spent and used memory. So for now just fallback to write
1403 * operations instead of clone operations when an extent has more than
1404 * a certain amount of references.
1405 */
1406 if (btrfs_extent_refs(tmp_path->nodes[0], ei) > SEND_MAX_EXTENT_REFS) {
1407 ret = -ENOENT;
1408 goto out;
1409 }
1410 btrfs_release_path(tmp_path);
1411
Alexander Block31db9f72012-07-25 23:19:24 +02001412 /*
1413 * Setup the clone roots.
1414 */
1415 for (i = 0; i < sctx->clone_roots_cnt; i++) {
1416 cur_clone_root = sctx->clone_roots + i;
1417 cur_clone_root->ino = (u64)-1;
1418 cur_clone_root->offset = 0;
1419 cur_clone_root->found_refs = 0;
1420 }
1421
Alexander Block35075bb2012-07-28 12:44:34 +02001422 backref_ctx->sctx = sctx;
1423 backref_ctx->found = 0;
1424 backref_ctx->cur_objectid = ino;
1425 backref_ctx->cur_offset = data_offset;
1426 backref_ctx->found_itself = 0;
1427 backref_ctx->extent_len = num_bytes;
Filipe Manana619d8c42015-05-03 01:56:00 +01001428 /*
1429 * For non-compressed extents iterate_extent_inodes() gives us extent
1430 * offsets that already take into account the data offset, but not for
1431 * compressed extents, since the offset is logical and not relative to
1432 * the physical extent locations. We must take this into account to
1433 * avoid sending clone offsets that go beyond the source file's size,
1434 * which would result in the clone ioctl failing with -EINVAL on the
1435 * receiving end.
1436 */
1437 if (compressed == BTRFS_COMPRESS_NONE)
1438 backref_ctx->data_offset = 0;
1439 else
1440 backref_ctx->data_offset = btrfs_file_extent_offset(eb, fi);
Alexander Block31db9f72012-07-25 23:19:24 +02001441
1442 /*
1443 * The last extent of a file may be too large due to page alignment.
1444 * We need to adjust extent_len in this case so that the checks in
1445 * __iterate_backrefs work.
1446 */
1447 if (data_offset + num_bytes >= ino_size)
Alexander Block35075bb2012-07-28 12:44:34 +02001448 backref_ctx->extent_len = ino_size - data_offset;
Alexander Block31db9f72012-07-25 23:19:24 +02001449
1450 /*
1451 * Now collect all backrefs.
1452 */
Chris Mason74dd17f2012-08-07 16:25:13 -04001453 if (compressed == BTRFS_COMPRESS_NONE)
1454 extent_item_pos = logical - found_key.objectid;
1455 else
1456 extent_item_pos = 0;
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001457 ret = iterate_extent_inodes(fs_info,
Alexander Block31db9f72012-07-25 23:19:24 +02001458 found_key.objectid, extent_item_pos, 1,
Alexander Block35075bb2012-07-28 12:44:34 +02001459 __iterate_backrefs, backref_ctx);
Chris Mason74dd17f2012-08-07 16:25:13 -04001460
Alexander Block31db9f72012-07-25 23:19:24 +02001461 if (ret < 0)
1462 goto out;
1463
Alexander Block35075bb2012-07-28 12:44:34 +02001464 if (!backref_ctx->found_itself) {
Alexander Block31db9f72012-07-25 23:19:24 +02001465 /* found a bug in backref code? */
1466 ret = -EIO;
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001467 btrfs_err(fs_info,
Jeff Mahoney5d163e02016-09-20 10:05:00 -04001468 "did not find backref in send_root. inode=%llu, offset=%llu, disk_byte=%llu found extent=%llu",
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001469 ino, data_offset, disk_byte, found_key.objectid);
Alexander Block31db9f72012-07-25 23:19:24 +02001470 goto out;
1471 }
1472
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001473 btrfs_debug(fs_info,
1474 "find_extent_clone: data_offset=%llu, ino=%llu, num_bytes=%llu, logical=%llu",
1475 data_offset, ino, num_bytes, logical);
Alexander Block31db9f72012-07-25 23:19:24 +02001476
Alexander Block35075bb2012-07-28 12:44:34 +02001477 if (!backref_ctx->found)
Jeff Mahoney04ab9562016-09-20 10:05:03 -04001478 btrfs_debug(fs_info, "no clones found");
Alexander Block31db9f72012-07-25 23:19:24 +02001479
1480 cur_clone_root = NULL;
1481 for (i = 0; i < sctx->clone_roots_cnt; i++) {
1482 if (sctx->clone_roots[i].found_refs) {
1483 if (!cur_clone_root)
1484 cur_clone_root = sctx->clone_roots + i;
1485 else if (sctx->clone_roots[i].root == sctx->send_root)
1486 /* prefer clones from send_root over others */
1487 cur_clone_root = sctx->clone_roots + i;
Alexander Block31db9f72012-07-25 23:19:24 +02001488 }
1489
1490 }
1491
1492 if (cur_clone_root) {
1493 *found = cur_clone_root;
1494 ret = 0;
1495 } else {
1496 ret = -ENOENT;
1497 }
1498
1499out:
1500 btrfs_free_path(tmp_path);
Alexander Block35075bb2012-07-28 12:44:34 +02001501 kfree(backref_ctx);
Alexander Block31db9f72012-07-25 23:19:24 +02001502 return ret;
1503}
1504
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001505static int read_symlink(struct btrfs_root *root,
Alexander Block31db9f72012-07-25 23:19:24 +02001506 u64 ino,
1507 struct fs_path *dest)
1508{
1509 int ret;
1510 struct btrfs_path *path;
1511 struct btrfs_key key;
1512 struct btrfs_file_extent_item *ei;
1513 u8 type;
1514 u8 compression;
1515 unsigned long off;
1516 int len;
1517
1518 path = alloc_path_for_send();
1519 if (!path)
1520 return -ENOMEM;
1521
1522 key.objectid = ino;
1523 key.type = BTRFS_EXTENT_DATA_KEY;
1524 key.offset = 0;
1525 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
1526 if (ret < 0)
1527 goto out;
Filipe Mananaa8797192015-12-31 18:07:59 +00001528 if (ret) {
1529 /*
1530 * An empty symlink inode. Can happen in rare error paths when
1531 * creating a symlink (transaction committed before the inode
1532 * eviction handler removed the symlink inode items and a crash
1533 * happened in between or the subvol was snapshoted in between).
1534 * Print an informative message to dmesg/syslog so that the user
1535 * can delete the symlink.
1536 */
1537 btrfs_err(root->fs_info,
1538 "Found empty symlink inode %llu at root %llu",
1539 ino, root->root_key.objectid);
1540 ret = -EIO;
1541 goto out;
1542 }
Alexander Block31db9f72012-07-25 23:19:24 +02001543
1544 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
1545 struct btrfs_file_extent_item);
1546 type = btrfs_file_extent_type(path->nodes[0], ei);
1547 compression = btrfs_file_extent_compression(path->nodes[0], ei);
1548 BUG_ON(type != BTRFS_FILE_EXTENT_INLINE);
1549 BUG_ON(compression);
1550
1551 off = btrfs_file_extent_inline_start(ei);
Chris Mason514ac8a2014-01-03 21:07:00 -08001552 len = btrfs_file_extent_inline_len(path->nodes[0], path->slots[0], ei);
Alexander Block31db9f72012-07-25 23:19:24 +02001553
1554 ret = fs_path_add_from_extent_buffer(dest, path->nodes[0], off, len);
Alexander Block31db9f72012-07-25 23:19:24 +02001555
1556out:
1557 btrfs_free_path(path);
1558 return ret;
1559}
1560
1561/*
1562 * Helper function to generate a file name that is unique in the root of
1563 * send_root and parent_root. This is used to generate names for orphan inodes.
1564 */
1565static int gen_unique_name(struct send_ctx *sctx,
1566 u64 ino, u64 gen,
1567 struct fs_path *dest)
1568{
1569 int ret = 0;
1570 struct btrfs_path *path;
1571 struct btrfs_dir_item *di;
1572 char tmp[64];
1573 int len;
1574 u64 idx = 0;
1575
1576 path = alloc_path_for_send();
1577 if (!path)
1578 return -ENOMEM;
1579
1580 while (1) {
Filipe David Borba Mananaf74b86d2014-01-21 23:36:38 +00001581 len = snprintf(tmp, sizeof(tmp), "o%llu-%llu-%llu",
Alexander Block31db9f72012-07-25 23:19:24 +02001582 ino, gen, idx);
David Sterba64792f22014-02-03 18:24:09 +01001583 ASSERT(len < sizeof(tmp));
Alexander Block31db9f72012-07-25 23:19:24 +02001584
1585 di = btrfs_lookup_dir_item(NULL, sctx->send_root,
1586 path, BTRFS_FIRST_FREE_OBJECTID,
1587 tmp, strlen(tmp), 0);
1588 btrfs_release_path(path);
1589 if (IS_ERR(di)) {
1590 ret = PTR_ERR(di);
1591 goto out;
1592 }
1593 if (di) {
1594 /* not unique, try again */
1595 idx++;
1596 continue;
1597 }
1598
1599 if (!sctx->parent_root) {
1600 /* unique */
1601 ret = 0;
1602 break;
1603 }
1604
1605 di = btrfs_lookup_dir_item(NULL, sctx->parent_root,
1606 path, BTRFS_FIRST_FREE_OBJECTID,
1607 tmp, strlen(tmp), 0);
1608 btrfs_release_path(path);
1609 if (IS_ERR(di)) {
1610 ret = PTR_ERR(di);
1611 goto out;
1612 }
1613 if (di) {
1614 /* not unique, try again */
1615 idx++;
1616 continue;
1617 }
1618 /* unique */
1619 break;
1620 }
1621
1622 ret = fs_path_add(dest, tmp, strlen(tmp));
1623
1624out:
1625 btrfs_free_path(path);
1626 return ret;
1627}
1628
1629enum inode_state {
1630 inode_state_no_change,
1631 inode_state_will_create,
1632 inode_state_did_create,
1633 inode_state_will_delete,
1634 inode_state_did_delete,
1635};
1636
1637static int get_cur_inode_state(struct send_ctx *sctx, u64 ino, u64 gen)
1638{
1639 int ret;
1640 int left_ret;
1641 int right_ret;
1642 u64 left_gen;
1643 u64 right_gen;
1644
1645 ret = get_inode_info(sctx->send_root, ino, NULL, &left_gen, NULL, NULL,
Alexander Block85a7b332012-07-26 23:39:10 +02001646 NULL, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02001647 if (ret < 0 && ret != -ENOENT)
1648 goto out;
1649 left_ret = ret;
1650
1651 if (!sctx->parent_root) {
1652 right_ret = -ENOENT;
1653 } else {
1654 ret = get_inode_info(sctx->parent_root, ino, NULL, &right_gen,
Alexander Block85a7b332012-07-26 23:39:10 +02001655 NULL, NULL, NULL, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02001656 if (ret < 0 && ret != -ENOENT)
1657 goto out;
1658 right_ret = ret;
1659 }
1660
1661 if (!left_ret && !right_ret) {
Alexander Blocke938c8a2012-07-28 16:33:49 +02001662 if (left_gen == gen && right_gen == gen) {
Alexander Block31db9f72012-07-25 23:19:24 +02001663 ret = inode_state_no_change;
Alexander Blocke938c8a2012-07-28 16:33:49 +02001664 } else if (left_gen == gen) {
Alexander Block31db9f72012-07-25 23:19:24 +02001665 if (ino < sctx->send_progress)
1666 ret = inode_state_did_create;
1667 else
1668 ret = inode_state_will_create;
1669 } else if (right_gen == gen) {
1670 if (ino < sctx->send_progress)
1671 ret = inode_state_did_delete;
1672 else
1673 ret = inode_state_will_delete;
1674 } else {
1675 ret = -ENOENT;
1676 }
1677 } else if (!left_ret) {
1678 if (left_gen == gen) {
1679 if (ino < sctx->send_progress)
1680 ret = inode_state_did_create;
1681 else
1682 ret = inode_state_will_create;
1683 } else {
1684 ret = -ENOENT;
1685 }
1686 } else if (!right_ret) {
1687 if (right_gen == gen) {
1688 if (ino < sctx->send_progress)
1689 ret = inode_state_did_delete;
1690 else
1691 ret = inode_state_will_delete;
1692 } else {
1693 ret = -ENOENT;
1694 }
1695 } else {
1696 ret = -ENOENT;
1697 }
1698
1699out:
1700 return ret;
1701}
1702
1703static int is_inode_existent(struct send_ctx *sctx, u64 ino, u64 gen)
1704{
1705 int ret;
1706
Robbie Koe215b6b2017-01-05 16:24:55 +08001707 if (ino == BTRFS_FIRST_FREE_OBJECTID)
1708 return 1;
1709
Alexander Block31db9f72012-07-25 23:19:24 +02001710 ret = get_cur_inode_state(sctx, ino, gen);
1711 if (ret < 0)
1712 goto out;
1713
1714 if (ret == inode_state_no_change ||
1715 ret == inode_state_did_create ||
1716 ret == inode_state_will_delete)
1717 ret = 1;
1718 else
1719 ret = 0;
1720
1721out:
1722 return ret;
1723}
1724
1725/*
1726 * Helper function to lookup a dir item in a dir.
1727 */
1728static int lookup_dir_item_inode(struct btrfs_root *root,
1729 u64 dir, const char *name, int name_len,
1730 u64 *found_inode,
1731 u8 *found_type)
1732{
1733 int ret = 0;
1734 struct btrfs_dir_item *di;
1735 struct btrfs_key key;
1736 struct btrfs_path *path;
1737
1738 path = alloc_path_for_send();
1739 if (!path)
1740 return -ENOMEM;
1741
1742 di = btrfs_lookup_dir_item(NULL, root, path,
1743 dir, name, name_len, 0);
1744 if (!di) {
1745 ret = -ENOENT;
1746 goto out;
1747 }
1748 if (IS_ERR(di)) {
1749 ret = PTR_ERR(di);
1750 goto out;
1751 }
1752 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &key);
Filipe Manana1af56072014-05-25 04:49:24 +01001753 if (key.type == BTRFS_ROOT_ITEM_KEY) {
1754 ret = -ENOENT;
1755 goto out;
1756 }
Alexander Block31db9f72012-07-25 23:19:24 +02001757 *found_inode = key.objectid;
1758 *found_type = btrfs_dir_type(path->nodes[0], di);
1759
1760out:
1761 btrfs_free_path(path);
1762 return ret;
1763}
1764
Alexander Block766702e2012-07-28 14:11:31 +02001765/*
1766 * Looks up the first btrfs_inode_ref of a given ino. It returns the parent dir,
1767 * generation of the parent dir and the name of the dir entry.
1768 */
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001769static int get_first_ref(struct btrfs_root *root, u64 ino,
Alexander Block31db9f72012-07-25 23:19:24 +02001770 u64 *dir, u64 *dir_gen, struct fs_path *name)
1771{
1772 int ret;
1773 struct btrfs_key key;
1774 struct btrfs_key found_key;
1775 struct btrfs_path *path;
Alexander Block31db9f72012-07-25 23:19:24 +02001776 int len;
Jan Schmidt96b5bd72012-10-15 08:30:45 +00001777 u64 parent_dir;
Alexander Block31db9f72012-07-25 23:19:24 +02001778
1779 path = alloc_path_for_send();
1780 if (!path)
1781 return -ENOMEM;
1782
1783 key.objectid = ino;
1784 key.type = BTRFS_INODE_REF_KEY;
1785 key.offset = 0;
1786
1787 ret = btrfs_search_slot_for_read(root, &key, path, 1, 0);
1788 if (ret < 0)
1789 goto out;
1790 if (!ret)
1791 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
1792 path->slots[0]);
Jan Schmidt96b5bd72012-10-15 08:30:45 +00001793 if (ret || found_key.objectid != ino ||
1794 (found_key.type != BTRFS_INODE_REF_KEY &&
1795 found_key.type != BTRFS_INODE_EXTREF_KEY)) {
Alexander Block31db9f72012-07-25 23:19:24 +02001796 ret = -ENOENT;
1797 goto out;
1798 }
1799
Filipe Manana51a60252014-05-13 22:01:02 +01001800 if (found_key.type == BTRFS_INODE_REF_KEY) {
Jan Schmidt96b5bd72012-10-15 08:30:45 +00001801 struct btrfs_inode_ref *iref;
1802 iref = btrfs_item_ptr(path->nodes[0], path->slots[0],
1803 struct btrfs_inode_ref);
1804 len = btrfs_inode_ref_name_len(path->nodes[0], iref);
1805 ret = fs_path_add_from_extent_buffer(name, path->nodes[0],
1806 (unsigned long)(iref + 1),
1807 len);
1808 parent_dir = found_key.offset;
1809 } else {
1810 struct btrfs_inode_extref *extref;
1811 extref = btrfs_item_ptr(path->nodes[0], path->slots[0],
1812 struct btrfs_inode_extref);
1813 len = btrfs_inode_extref_name_len(path->nodes[0], extref);
1814 ret = fs_path_add_from_extent_buffer(name, path->nodes[0],
1815 (unsigned long)&extref->name, len);
1816 parent_dir = btrfs_inode_extref_parent(path->nodes[0], extref);
1817 }
Alexander Block31db9f72012-07-25 23:19:24 +02001818 if (ret < 0)
1819 goto out;
1820 btrfs_release_path(path);
1821
Filipe Mananab46ab972014-03-21 12:46:54 +00001822 if (dir_gen) {
1823 ret = get_inode_info(root, parent_dir, NULL, dir_gen, NULL,
1824 NULL, NULL, NULL);
1825 if (ret < 0)
1826 goto out;
1827 }
Alexander Block31db9f72012-07-25 23:19:24 +02001828
Jan Schmidt96b5bd72012-10-15 08:30:45 +00001829 *dir = parent_dir;
Alexander Block31db9f72012-07-25 23:19:24 +02001830
1831out:
1832 btrfs_free_path(path);
1833 return ret;
1834}
1835
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001836static int is_first_ref(struct btrfs_root *root,
Alexander Block31db9f72012-07-25 23:19:24 +02001837 u64 ino, u64 dir,
1838 const char *name, int name_len)
1839{
1840 int ret;
1841 struct fs_path *tmp_name;
1842 u64 tmp_dir;
Alexander Block31db9f72012-07-25 23:19:24 +02001843
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001844 tmp_name = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02001845 if (!tmp_name)
1846 return -ENOMEM;
1847
Filipe Mananab46ab972014-03-21 12:46:54 +00001848 ret = get_first_ref(root, ino, &tmp_dir, NULL, tmp_name);
Alexander Block31db9f72012-07-25 23:19:24 +02001849 if (ret < 0)
1850 goto out;
1851
Alexander Blockb9291af2012-07-28 11:07:18 +02001852 if (dir != tmp_dir || name_len != fs_path_len(tmp_name)) {
Alexander Block31db9f72012-07-25 23:19:24 +02001853 ret = 0;
1854 goto out;
1855 }
1856
Alexander Blocke938c8a2012-07-28 16:33:49 +02001857 ret = !memcmp(tmp_name->start, name, name_len);
Alexander Block31db9f72012-07-25 23:19:24 +02001858
1859out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00001860 fs_path_free(tmp_name);
Alexander Block31db9f72012-07-25 23:19:24 +02001861 return ret;
1862}
1863
Alexander Block766702e2012-07-28 14:11:31 +02001864/*
1865 * Used by process_recorded_refs to determine if a new ref would overwrite an
1866 * already existing ref. In case it detects an overwrite, it returns the
1867 * inode/gen in who_ino/who_gen.
1868 * When an overwrite is detected, process_recorded_refs does proper orphanizing
1869 * to make sure later references to the overwritten inode are possible.
1870 * Orphanizing is however only required for the first ref of an inode.
1871 * process_recorded_refs does an additional is_first_ref check to see if
1872 * orphanizing is really required.
1873 */
Alexander Block31db9f72012-07-25 23:19:24 +02001874static int will_overwrite_ref(struct send_ctx *sctx, u64 dir, u64 dir_gen,
1875 const char *name, int name_len,
1876 u64 *who_ino, u64 *who_gen)
1877{
1878 int ret = 0;
Josef Bacikebdad912013-08-06 16:47:48 -04001879 u64 gen;
Alexander Block31db9f72012-07-25 23:19:24 +02001880 u64 other_inode = 0;
1881 u8 other_type = 0;
1882
1883 if (!sctx->parent_root)
1884 goto out;
1885
1886 ret = is_inode_existent(sctx, dir, dir_gen);
1887 if (ret <= 0)
1888 goto out;
1889
Josef Bacikebdad912013-08-06 16:47:48 -04001890 /*
1891 * If we have a parent root we need to verify that the parent dir was
Nicholas D Steeves01327612016-05-19 21:18:45 -04001892 * not deleted and then re-created, if it was then we have no overwrite
Josef Bacikebdad912013-08-06 16:47:48 -04001893 * and we can just unlink this entry.
1894 */
Robbie Koe215b6b2017-01-05 16:24:55 +08001895 if (sctx->parent_root && dir != BTRFS_FIRST_FREE_OBJECTID) {
Josef Bacikebdad912013-08-06 16:47:48 -04001896 ret = get_inode_info(sctx->parent_root, dir, NULL, &gen, NULL,
1897 NULL, NULL, NULL);
1898 if (ret < 0 && ret != -ENOENT)
1899 goto out;
1900 if (ret) {
1901 ret = 0;
1902 goto out;
1903 }
1904 if (gen != dir_gen)
1905 goto out;
1906 }
1907
Alexander Block31db9f72012-07-25 23:19:24 +02001908 ret = lookup_dir_item_inode(sctx->parent_root, dir, name, name_len,
1909 &other_inode, &other_type);
1910 if (ret < 0 && ret != -ENOENT)
1911 goto out;
1912 if (ret) {
1913 ret = 0;
1914 goto out;
1915 }
1916
Alexander Block766702e2012-07-28 14:11:31 +02001917 /*
1918 * Check if the overwritten ref was already processed. If yes, the ref
1919 * was already unlinked/moved, so we can safely assume that we will not
1920 * overwrite anything at this point in time.
1921 */
Robbie Ko801bec32015-06-23 18:39:46 +08001922 if (other_inode > sctx->send_progress ||
1923 is_waiting_for_move(sctx, other_inode)) {
Alexander Block31db9f72012-07-25 23:19:24 +02001924 ret = get_inode_info(sctx->parent_root, other_inode, NULL,
Alexander Block85a7b332012-07-26 23:39:10 +02001925 who_gen, NULL, NULL, NULL, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02001926 if (ret < 0)
1927 goto out;
1928
1929 ret = 1;
1930 *who_ino = other_inode;
1931 } else {
1932 ret = 0;
1933 }
1934
1935out:
1936 return ret;
1937}
1938
Alexander Block766702e2012-07-28 14:11:31 +02001939/*
1940 * Checks if the ref was overwritten by an already processed inode. This is
1941 * used by __get_cur_name_and_parent to find out if the ref was orphanized and
1942 * thus the orphan name needs be used.
1943 * process_recorded_refs also uses it to avoid unlinking of refs that were
1944 * overwritten.
1945 */
Alexander Block31db9f72012-07-25 23:19:24 +02001946static int did_overwrite_ref(struct send_ctx *sctx,
1947 u64 dir, u64 dir_gen,
1948 u64 ino, u64 ino_gen,
1949 const char *name, int name_len)
1950{
1951 int ret = 0;
1952 u64 gen;
1953 u64 ow_inode;
1954 u8 other_type;
1955
1956 if (!sctx->parent_root)
1957 goto out;
1958
1959 ret = is_inode_existent(sctx, dir, dir_gen);
1960 if (ret <= 0)
1961 goto out;
1962
1963 /* check if the ref was overwritten by another ref */
1964 ret = lookup_dir_item_inode(sctx->send_root, dir, name, name_len,
1965 &ow_inode, &other_type);
1966 if (ret < 0 && ret != -ENOENT)
1967 goto out;
1968 if (ret) {
1969 /* was never and will never be overwritten */
1970 ret = 0;
1971 goto out;
1972 }
1973
1974 ret = get_inode_info(sctx->send_root, ow_inode, NULL, &gen, NULL, NULL,
Alexander Block85a7b332012-07-26 23:39:10 +02001975 NULL, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02001976 if (ret < 0)
1977 goto out;
1978
1979 if (ow_inode == ino && gen == ino_gen) {
1980 ret = 0;
1981 goto out;
1982 }
1983
Filipe Manana8b191a62015-04-09 14:09:14 +01001984 /*
1985 * We know that it is or will be overwritten. Check this now.
1986 * The current inode being processed might have been the one that caused
Filipe Mananab786f162015-09-26 15:30:23 +01001987 * inode 'ino' to be orphanized, therefore check if ow_inode matches
1988 * the current inode being processed.
Filipe Manana8b191a62015-04-09 14:09:14 +01001989 */
Filipe Mananab786f162015-09-26 15:30:23 +01001990 if ((ow_inode < sctx->send_progress) ||
1991 (ino != sctx->cur_ino && ow_inode == sctx->cur_ino &&
1992 gen == sctx->cur_inode_gen))
Alexander Block31db9f72012-07-25 23:19:24 +02001993 ret = 1;
1994 else
1995 ret = 0;
1996
1997out:
1998 return ret;
1999}
2000
Alexander Block766702e2012-07-28 14:11:31 +02002001/*
2002 * Same as did_overwrite_ref, but also checks if it is the first ref of an inode
2003 * that got overwritten. This is used by process_recorded_refs to determine
2004 * if it has to use the path as returned by get_cur_path or the orphan name.
2005 */
Alexander Block31db9f72012-07-25 23:19:24 +02002006static int did_overwrite_first_ref(struct send_ctx *sctx, u64 ino, u64 gen)
2007{
2008 int ret = 0;
2009 struct fs_path *name = NULL;
2010 u64 dir;
2011 u64 dir_gen;
2012
2013 if (!sctx->parent_root)
2014 goto out;
2015
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002016 name = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002017 if (!name)
2018 return -ENOMEM;
2019
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002020 ret = get_first_ref(sctx->parent_root, ino, &dir, &dir_gen, name);
Alexander Block31db9f72012-07-25 23:19:24 +02002021 if (ret < 0)
2022 goto out;
2023
2024 ret = did_overwrite_ref(sctx, dir, dir_gen, ino, gen,
2025 name->start, fs_path_len(name));
Alexander Block31db9f72012-07-25 23:19:24 +02002026
2027out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002028 fs_path_free(name);
Alexander Block31db9f72012-07-25 23:19:24 +02002029 return ret;
2030}
2031
Alexander Block766702e2012-07-28 14:11:31 +02002032/*
2033 * Insert a name cache entry. On 32bit kernels the radix tree index is 32bit,
2034 * so we need to do some special handling in case we have clashes. This function
2035 * takes care of this with the help of name_cache_entry::radix_list.
Alexander Block5dc67d02012-08-01 12:07:43 +02002036 * In case of error, nce is kfreed.
Alexander Block766702e2012-07-28 14:11:31 +02002037 */
Alexander Block31db9f72012-07-25 23:19:24 +02002038static int name_cache_insert(struct send_ctx *sctx,
2039 struct name_cache_entry *nce)
2040{
2041 int ret = 0;
Alexander Block7e0926f2012-07-28 14:20:58 +02002042 struct list_head *nce_head;
Alexander Block31db9f72012-07-25 23:19:24 +02002043
Alexander Block7e0926f2012-07-28 14:20:58 +02002044 nce_head = radix_tree_lookup(&sctx->name_cache,
2045 (unsigned long)nce->ino);
2046 if (!nce_head) {
David Sterbae780b0d2016-01-18 18:42:13 +01002047 nce_head = kmalloc(sizeof(*nce_head), GFP_KERNEL);
Tsutomu Itohcfa7a9c2012-12-17 06:38:51 +00002048 if (!nce_head) {
2049 kfree(nce);
Alexander Block31db9f72012-07-25 23:19:24 +02002050 return -ENOMEM;
Tsutomu Itohcfa7a9c2012-12-17 06:38:51 +00002051 }
Alexander Block7e0926f2012-07-28 14:20:58 +02002052 INIT_LIST_HEAD(nce_head);
Alexander Block31db9f72012-07-25 23:19:24 +02002053
Alexander Block7e0926f2012-07-28 14:20:58 +02002054 ret = radix_tree_insert(&sctx->name_cache, nce->ino, nce_head);
Alexander Block5dc67d02012-08-01 12:07:43 +02002055 if (ret < 0) {
2056 kfree(nce_head);
2057 kfree(nce);
Alexander Block31db9f72012-07-25 23:19:24 +02002058 return ret;
Alexander Block5dc67d02012-08-01 12:07:43 +02002059 }
Alexander Block31db9f72012-07-25 23:19:24 +02002060 }
Alexander Block7e0926f2012-07-28 14:20:58 +02002061 list_add_tail(&nce->radix_list, nce_head);
Alexander Block31db9f72012-07-25 23:19:24 +02002062 list_add_tail(&nce->list, &sctx->name_cache_list);
2063 sctx->name_cache_size++;
2064
2065 return ret;
2066}
2067
2068static void name_cache_delete(struct send_ctx *sctx,
2069 struct name_cache_entry *nce)
2070{
Alexander Block7e0926f2012-07-28 14:20:58 +02002071 struct list_head *nce_head;
Alexander Block31db9f72012-07-25 23:19:24 +02002072
Alexander Block7e0926f2012-07-28 14:20:58 +02002073 nce_head = radix_tree_lookup(&sctx->name_cache,
2074 (unsigned long)nce->ino);
David Sterba57fb8912014-02-03 19:24:40 +01002075 if (!nce_head) {
2076 btrfs_err(sctx->send_root->fs_info,
2077 "name_cache_delete lookup failed ino %llu cache size %d, leaking memory",
2078 nce->ino, sctx->name_cache_size);
2079 }
Alexander Block31db9f72012-07-25 23:19:24 +02002080
Alexander Block7e0926f2012-07-28 14:20:58 +02002081 list_del(&nce->radix_list);
Alexander Block31db9f72012-07-25 23:19:24 +02002082 list_del(&nce->list);
Alexander Block31db9f72012-07-25 23:19:24 +02002083 sctx->name_cache_size--;
Alexander Block7e0926f2012-07-28 14:20:58 +02002084
David Sterba57fb8912014-02-03 19:24:40 +01002085 /*
2086 * We may not get to the final release of nce_head if the lookup fails
2087 */
2088 if (nce_head && list_empty(nce_head)) {
Alexander Block7e0926f2012-07-28 14:20:58 +02002089 radix_tree_delete(&sctx->name_cache, (unsigned long)nce->ino);
2090 kfree(nce_head);
2091 }
Alexander Block31db9f72012-07-25 23:19:24 +02002092}
2093
2094static struct name_cache_entry *name_cache_search(struct send_ctx *sctx,
2095 u64 ino, u64 gen)
2096{
Alexander Block7e0926f2012-07-28 14:20:58 +02002097 struct list_head *nce_head;
2098 struct name_cache_entry *cur;
Alexander Block31db9f72012-07-25 23:19:24 +02002099
Alexander Block7e0926f2012-07-28 14:20:58 +02002100 nce_head = radix_tree_lookup(&sctx->name_cache, (unsigned long)ino);
2101 if (!nce_head)
Alexander Block31db9f72012-07-25 23:19:24 +02002102 return NULL;
2103
Alexander Block7e0926f2012-07-28 14:20:58 +02002104 list_for_each_entry(cur, nce_head, radix_list) {
2105 if (cur->ino == ino && cur->gen == gen)
2106 return cur;
2107 }
Alexander Block31db9f72012-07-25 23:19:24 +02002108 return NULL;
2109}
2110
Alexander Block766702e2012-07-28 14:11:31 +02002111/*
2112 * Removes the entry from the list and adds it back to the end. This marks the
2113 * entry as recently used so that name_cache_clean_unused does not remove it.
2114 */
Alexander Block31db9f72012-07-25 23:19:24 +02002115static void name_cache_used(struct send_ctx *sctx, struct name_cache_entry *nce)
2116{
2117 list_del(&nce->list);
2118 list_add_tail(&nce->list, &sctx->name_cache_list);
2119}
2120
Alexander Block766702e2012-07-28 14:11:31 +02002121/*
2122 * Remove some entries from the beginning of name_cache_list.
2123 */
Alexander Block31db9f72012-07-25 23:19:24 +02002124static void name_cache_clean_unused(struct send_ctx *sctx)
2125{
2126 struct name_cache_entry *nce;
2127
2128 if (sctx->name_cache_size < SEND_CTX_NAME_CACHE_CLEAN_SIZE)
2129 return;
2130
2131 while (sctx->name_cache_size > SEND_CTX_MAX_NAME_CACHE_SIZE) {
2132 nce = list_entry(sctx->name_cache_list.next,
2133 struct name_cache_entry, list);
2134 name_cache_delete(sctx, nce);
2135 kfree(nce);
2136 }
2137}
2138
2139static void name_cache_free(struct send_ctx *sctx)
2140{
2141 struct name_cache_entry *nce;
Alexander Block31db9f72012-07-25 23:19:24 +02002142
Alexander Blocke938c8a2012-07-28 16:33:49 +02002143 while (!list_empty(&sctx->name_cache_list)) {
2144 nce = list_entry(sctx->name_cache_list.next,
2145 struct name_cache_entry, list);
Alexander Block31db9f72012-07-25 23:19:24 +02002146 name_cache_delete(sctx, nce);
Alexander Block17589bd2012-07-28 14:13:35 +02002147 kfree(nce);
Alexander Block31db9f72012-07-25 23:19:24 +02002148 }
2149}
2150
Alexander Block766702e2012-07-28 14:11:31 +02002151/*
2152 * Used by get_cur_path for each ref up to the root.
2153 * Returns 0 if it succeeded.
2154 * Returns 1 if the inode is not existent or got overwritten. In that case, the
2155 * name is an orphan name. This instructs get_cur_path to stop iterating. If 1
2156 * is returned, parent_ino/parent_gen are not guaranteed to be valid.
2157 * Returns <0 in case of error.
2158 */
Alexander Block31db9f72012-07-25 23:19:24 +02002159static int __get_cur_name_and_parent(struct send_ctx *sctx,
2160 u64 ino, u64 gen,
2161 u64 *parent_ino,
2162 u64 *parent_gen,
2163 struct fs_path *dest)
2164{
2165 int ret;
2166 int nce_ret;
Alexander Block31db9f72012-07-25 23:19:24 +02002167 struct name_cache_entry *nce = NULL;
2168
Alexander Block766702e2012-07-28 14:11:31 +02002169 /*
2170 * First check if we already did a call to this function with the same
2171 * ino/gen. If yes, check if the cache entry is still up-to-date. If yes
2172 * return the cached result.
2173 */
Alexander Block31db9f72012-07-25 23:19:24 +02002174 nce = name_cache_search(sctx, ino, gen);
2175 if (nce) {
2176 if (ino < sctx->send_progress && nce->need_later_update) {
2177 name_cache_delete(sctx, nce);
2178 kfree(nce);
2179 nce = NULL;
2180 } else {
2181 name_cache_used(sctx, nce);
2182 *parent_ino = nce->parent_ino;
2183 *parent_gen = nce->parent_gen;
2184 ret = fs_path_add(dest, nce->name, nce->name_len);
2185 if (ret < 0)
2186 goto out;
2187 ret = nce->ret;
2188 goto out;
2189 }
2190 }
2191
Alexander Block766702e2012-07-28 14:11:31 +02002192 /*
2193 * If the inode is not existent yet, add the orphan name and return 1.
2194 * This should only happen for the parent dir that we determine in
2195 * __record_new_ref
2196 */
Alexander Block31db9f72012-07-25 23:19:24 +02002197 ret = is_inode_existent(sctx, ino, gen);
2198 if (ret < 0)
2199 goto out;
2200
2201 if (!ret) {
2202 ret = gen_unique_name(sctx, ino, gen, dest);
2203 if (ret < 0)
2204 goto out;
2205 ret = 1;
2206 goto out_cache;
2207 }
2208
Alexander Block766702e2012-07-28 14:11:31 +02002209 /*
2210 * Depending on whether the inode was already processed or not, use
2211 * send_root or parent_root for ref lookup.
2212 */
Filipe Mananabf0d1f42014-02-21 00:01:32 +00002213 if (ino < sctx->send_progress)
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002214 ret = get_first_ref(sctx->send_root, ino,
2215 parent_ino, parent_gen, dest);
Alexander Block31db9f72012-07-25 23:19:24 +02002216 else
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002217 ret = get_first_ref(sctx->parent_root, ino,
2218 parent_ino, parent_gen, dest);
Alexander Block31db9f72012-07-25 23:19:24 +02002219 if (ret < 0)
2220 goto out;
2221
Alexander Block766702e2012-07-28 14:11:31 +02002222 /*
2223 * Check if the ref was overwritten by an inode's ref that was processed
2224 * earlier. If yes, treat as orphan and return 1.
2225 */
Alexander Block31db9f72012-07-25 23:19:24 +02002226 ret = did_overwrite_ref(sctx, *parent_ino, *parent_gen, ino, gen,
2227 dest->start, dest->end - dest->start);
2228 if (ret < 0)
2229 goto out;
2230 if (ret) {
2231 fs_path_reset(dest);
2232 ret = gen_unique_name(sctx, ino, gen, dest);
2233 if (ret < 0)
2234 goto out;
2235 ret = 1;
2236 }
2237
2238out_cache:
Alexander Block766702e2012-07-28 14:11:31 +02002239 /*
2240 * Store the result of the lookup in the name cache.
2241 */
David Sterbae780b0d2016-01-18 18:42:13 +01002242 nce = kmalloc(sizeof(*nce) + fs_path_len(dest) + 1, GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +02002243 if (!nce) {
2244 ret = -ENOMEM;
2245 goto out;
2246 }
2247
2248 nce->ino = ino;
2249 nce->gen = gen;
2250 nce->parent_ino = *parent_ino;
2251 nce->parent_gen = *parent_gen;
2252 nce->name_len = fs_path_len(dest);
2253 nce->ret = ret;
2254 strcpy(nce->name, dest->start);
Alexander Block31db9f72012-07-25 23:19:24 +02002255
2256 if (ino < sctx->send_progress)
2257 nce->need_later_update = 0;
2258 else
2259 nce->need_later_update = 1;
2260
2261 nce_ret = name_cache_insert(sctx, nce);
2262 if (nce_ret < 0)
2263 ret = nce_ret;
2264 name_cache_clean_unused(sctx);
2265
2266out:
Alexander Block31db9f72012-07-25 23:19:24 +02002267 return ret;
2268}
2269
2270/*
2271 * Magic happens here. This function returns the first ref to an inode as it
2272 * would look like while receiving the stream at this point in time.
2273 * We walk the path up to the root. For every inode in between, we check if it
2274 * was already processed/sent. If yes, we continue with the parent as found
2275 * in send_root. If not, we continue with the parent as found in parent_root.
2276 * If we encounter an inode that was deleted at this point in time, we use the
2277 * inodes "orphan" name instead of the real name and stop. Same with new inodes
2278 * that were not created yet and overwritten inodes/refs.
2279 *
2280 * When do we have have orphan inodes:
2281 * 1. When an inode is freshly created and thus no valid refs are available yet
2282 * 2. When a directory lost all it's refs (deleted) but still has dir items
2283 * inside which were not processed yet (pending for move/delete). If anyone
2284 * tried to get the path to the dir items, it would get a path inside that
2285 * orphan directory.
2286 * 3. When an inode is moved around or gets new links, it may overwrite the ref
2287 * of an unprocessed inode. If in that case the first ref would be
2288 * overwritten, the overwritten inode gets "orphanized". Later when we
2289 * process this overwritten inode, it is restored at a new place by moving
2290 * the orphan inode.
2291 *
2292 * sctx->send_progress tells this function at which point in time receiving
2293 * would be.
2294 */
2295static int get_cur_path(struct send_ctx *sctx, u64 ino, u64 gen,
2296 struct fs_path *dest)
2297{
2298 int ret = 0;
2299 struct fs_path *name = NULL;
2300 u64 parent_inode = 0;
2301 u64 parent_gen = 0;
2302 int stop = 0;
2303
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002304 name = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002305 if (!name) {
2306 ret = -ENOMEM;
2307 goto out;
2308 }
2309
2310 dest->reversed = 1;
2311 fs_path_reset(dest);
2312
2313 while (!stop && ino != BTRFS_FIRST_FREE_OBJECTID) {
Filipe Manana8b191a62015-04-09 14:09:14 +01002314 struct waiting_dir_move *wdm;
2315
Alexander Block31db9f72012-07-25 23:19:24 +02002316 fs_path_reset(name);
2317
Filipe Manana9dc44212014-02-19 14:31:44 +00002318 if (is_waiting_for_rm(sctx, ino)) {
2319 ret = gen_unique_name(sctx, ino, gen, name);
2320 if (ret < 0)
2321 goto out;
2322 ret = fs_path_add_path(dest, name);
2323 break;
2324 }
2325
Filipe Manana8b191a62015-04-09 14:09:14 +01002326 wdm = get_waiting_dir_move(sctx, ino);
2327 if (wdm && wdm->orphanized) {
2328 ret = gen_unique_name(sctx, ino, gen, name);
2329 stop = 1;
2330 } else if (wdm) {
Filipe Mananabf0d1f42014-02-21 00:01:32 +00002331 ret = get_first_ref(sctx->parent_root, ino,
2332 &parent_inode, &parent_gen, name);
2333 } else {
2334 ret = __get_cur_name_and_parent(sctx, ino, gen,
2335 &parent_inode,
2336 &parent_gen, name);
2337 if (ret)
2338 stop = 1;
2339 }
2340
Alexander Block31db9f72012-07-25 23:19:24 +02002341 if (ret < 0)
2342 goto out;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00002343
Alexander Block31db9f72012-07-25 23:19:24 +02002344 ret = fs_path_add_path(dest, name);
2345 if (ret < 0)
2346 goto out;
2347
2348 ino = parent_inode;
2349 gen = parent_gen;
2350 }
2351
2352out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002353 fs_path_free(name);
Alexander Block31db9f72012-07-25 23:19:24 +02002354 if (!ret)
2355 fs_path_unreverse(dest);
2356 return ret;
2357}
2358
2359/*
Alexander Block31db9f72012-07-25 23:19:24 +02002360 * Sends a BTRFS_SEND_C_SUBVOL command/item to userspace
2361 */
2362static int send_subvol_begin(struct send_ctx *sctx)
2363{
2364 int ret;
2365 struct btrfs_root *send_root = sctx->send_root;
2366 struct btrfs_root *parent_root = sctx->parent_root;
2367 struct btrfs_path *path;
2368 struct btrfs_key key;
2369 struct btrfs_root_ref *ref;
2370 struct extent_buffer *leaf;
2371 char *name = NULL;
2372 int namelen;
2373
Wang Shilongffcfaf82014-01-15 00:26:43 +08002374 path = btrfs_alloc_path();
Alexander Block31db9f72012-07-25 23:19:24 +02002375 if (!path)
2376 return -ENOMEM;
2377
David Sterbae780b0d2016-01-18 18:42:13 +01002378 name = kmalloc(BTRFS_PATH_NAME_MAX, GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +02002379 if (!name) {
2380 btrfs_free_path(path);
2381 return -ENOMEM;
2382 }
2383
2384 key.objectid = send_root->objectid;
2385 key.type = BTRFS_ROOT_BACKREF_KEY;
2386 key.offset = 0;
2387
2388 ret = btrfs_search_slot_for_read(send_root->fs_info->tree_root,
2389 &key, path, 1, 0);
2390 if (ret < 0)
2391 goto out;
2392 if (ret) {
2393 ret = -ENOENT;
2394 goto out;
2395 }
2396
2397 leaf = path->nodes[0];
2398 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
2399 if (key.type != BTRFS_ROOT_BACKREF_KEY ||
2400 key.objectid != send_root->objectid) {
2401 ret = -ENOENT;
2402 goto out;
2403 }
2404 ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref);
2405 namelen = btrfs_root_ref_name_len(leaf, ref);
2406 read_extent_buffer(leaf, name, (unsigned long)(ref + 1), namelen);
2407 btrfs_release_path(path);
2408
Alexander Block31db9f72012-07-25 23:19:24 +02002409 if (parent_root) {
2410 ret = begin_cmd(sctx, BTRFS_SEND_C_SNAPSHOT);
2411 if (ret < 0)
2412 goto out;
2413 } else {
2414 ret = begin_cmd(sctx, BTRFS_SEND_C_SUBVOL);
2415 if (ret < 0)
2416 goto out;
2417 }
2418
2419 TLV_PUT_STRING(sctx, BTRFS_SEND_A_PATH, name, namelen);
Robin Ruedeb96b1db2015-09-30 21:23:33 +02002420
2421 if (!btrfs_is_empty_uuid(sctx->send_root->root_item.received_uuid))
2422 TLV_PUT_UUID(sctx, BTRFS_SEND_A_UUID,
2423 sctx->send_root->root_item.received_uuid);
2424 else
2425 TLV_PUT_UUID(sctx, BTRFS_SEND_A_UUID,
2426 sctx->send_root->root_item.uuid);
2427
Alexander Block31db9f72012-07-25 23:19:24 +02002428 TLV_PUT_U64(sctx, BTRFS_SEND_A_CTRANSID,
Filipe David Borba Manana5a0f4e22013-12-03 15:55:48 +00002429 le64_to_cpu(sctx->send_root->root_item.ctransid));
Alexander Block31db9f72012-07-25 23:19:24 +02002430 if (parent_root) {
Josef Bacik37b8d272015-06-04 17:17:25 -04002431 if (!btrfs_is_empty_uuid(parent_root->root_item.received_uuid))
2432 TLV_PUT_UUID(sctx, BTRFS_SEND_A_CLONE_UUID,
2433 parent_root->root_item.received_uuid);
2434 else
2435 TLV_PUT_UUID(sctx, BTRFS_SEND_A_CLONE_UUID,
2436 parent_root->root_item.uuid);
Alexander Block31db9f72012-07-25 23:19:24 +02002437 TLV_PUT_U64(sctx, BTRFS_SEND_A_CLONE_CTRANSID,
Filipe David Borba Manana5a0f4e22013-12-03 15:55:48 +00002438 le64_to_cpu(sctx->parent_root->root_item.ctransid));
Alexander Block31db9f72012-07-25 23:19:24 +02002439 }
2440
2441 ret = send_cmd(sctx);
2442
2443tlv_put_failure:
2444out:
2445 btrfs_free_path(path);
2446 kfree(name);
2447 return ret;
2448}
2449
2450static int send_truncate(struct send_ctx *sctx, u64 ino, u64 gen, u64 size)
2451{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002452 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02002453 int ret = 0;
2454 struct fs_path *p;
2455
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002456 btrfs_debug(fs_info, "send_truncate %llu size=%llu", ino, size);
Alexander Block31db9f72012-07-25 23:19:24 +02002457
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002458 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002459 if (!p)
2460 return -ENOMEM;
2461
2462 ret = begin_cmd(sctx, BTRFS_SEND_C_TRUNCATE);
2463 if (ret < 0)
2464 goto out;
2465
2466 ret = get_cur_path(sctx, ino, gen, p);
2467 if (ret < 0)
2468 goto out;
2469 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
2470 TLV_PUT_U64(sctx, BTRFS_SEND_A_SIZE, size);
2471
2472 ret = send_cmd(sctx);
2473
2474tlv_put_failure:
2475out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002476 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02002477 return ret;
2478}
2479
2480static int send_chmod(struct send_ctx *sctx, u64 ino, u64 gen, u64 mode)
2481{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002482 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02002483 int ret = 0;
2484 struct fs_path *p;
2485
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002486 btrfs_debug(fs_info, "send_chmod %llu mode=%llu", ino, mode);
Alexander Block31db9f72012-07-25 23:19:24 +02002487
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002488 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002489 if (!p)
2490 return -ENOMEM;
2491
2492 ret = begin_cmd(sctx, BTRFS_SEND_C_CHMOD);
2493 if (ret < 0)
2494 goto out;
2495
2496 ret = get_cur_path(sctx, ino, gen, p);
2497 if (ret < 0)
2498 goto out;
2499 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
2500 TLV_PUT_U64(sctx, BTRFS_SEND_A_MODE, mode & 07777);
2501
2502 ret = send_cmd(sctx);
2503
2504tlv_put_failure:
2505out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002506 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02002507 return ret;
2508}
2509
2510static int send_chown(struct send_ctx *sctx, u64 ino, u64 gen, u64 uid, u64 gid)
2511{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002512 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02002513 int ret = 0;
2514 struct fs_path *p;
2515
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002516 btrfs_debug(fs_info, "send_chown %llu uid=%llu, gid=%llu",
2517 ino, uid, gid);
Alexander Block31db9f72012-07-25 23:19:24 +02002518
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002519 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002520 if (!p)
2521 return -ENOMEM;
2522
2523 ret = begin_cmd(sctx, BTRFS_SEND_C_CHOWN);
2524 if (ret < 0)
2525 goto out;
2526
2527 ret = get_cur_path(sctx, ino, gen, p);
2528 if (ret < 0)
2529 goto out;
2530 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
2531 TLV_PUT_U64(sctx, BTRFS_SEND_A_UID, uid);
2532 TLV_PUT_U64(sctx, BTRFS_SEND_A_GID, gid);
2533
2534 ret = send_cmd(sctx);
2535
2536tlv_put_failure:
2537out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002538 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02002539 return ret;
2540}
2541
2542static int send_utimes(struct send_ctx *sctx, u64 ino, u64 gen)
2543{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002544 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02002545 int ret = 0;
2546 struct fs_path *p = NULL;
2547 struct btrfs_inode_item *ii;
2548 struct btrfs_path *path = NULL;
2549 struct extent_buffer *eb;
2550 struct btrfs_key key;
2551 int slot;
2552
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002553 btrfs_debug(fs_info, "send_utimes %llu", ino);
Alexander Block31db9f72012-07-25 23:19:24 +02002554
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002555 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002556 if (!p)
2557 return -ENOMEM;
2558
2559 path = alloc_path_for_send();
2560 if (!path) {
2561 ret = -ENOMEM;
2562 goto out;
2563 }
2564
2565 key.objectid = ino;
2566 key.type = BTRFS_INODE_ITEM_KEY;
2567 key.offset = 0;
2568 ret = btrfs_search_slot(NULL, sctx->send_root, &key, path, 0, 0);
Filipe Manana15b253e2016-07-02 05:43:46 +01002569 if (ret > 0)
2570 ret = -ENOENT;
Alexander Block31db9f72012-07-25 23:19:24 +02002571 if (ret < 0)
2572 goto out;
2573
2574 eb = path->nodes[0];
2575 slot = path->slots[0];
2576 ii = btrfs_item_ptr(eb, slot, struct btrfs_inode_item);
2577
2578 ret = begin_cmd(sctx, BTRFS_SEND_C_UTIMES);
2579 if (ret < 0)
2580 goto out;
2581
2582 ret = get_cur_path(sctx, ino, gen, p);
2583 if (ret < 0)
2584 goto out;
2585 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
David Sterbaa937b972014-12-12 17:39:12 +01002586 TLV_PUT_BTRFS_TIMESPEC(sctx, BTRFS_SEND_A_ATIME, eb, &ii->atime);
2587 TLV_PUT_BTRFS_TIMESPEC(sctx, BTRFS_SEND_A_MTIME, eb, &ii->mtime);
2588 TLV_PUT_BTRFS_TIMESPEC(sctx, BTRFS_SEND_A_CTIME, eb, &ii->ctime);
Alexander Block766702e2012-07-28 14:11:31 +02002589 /* TODO Add otime support when the otime patches get into upstream */
Alexander Block31db9f72012-07-25 23:19:24 +02002590
2591 ret = send_cmd(sctx);
2592
2593tlv_put_failure:
2594out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002595 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02002596 btrfs_free_path(path);
2597 return ret;
2598}
2599
2600/*
2601 * Sends a BTRFS_SEND_C_MKXXX or SYMLINK command to user space. We don't have
2602 * a valid path yet because we did not process the refs yet. So, the inode
2603 * is created as orphan.
2604 */
Alexander Block1f4692d2012-07-28 10:42:24 +02002605static int send_create_inode(struct send_ctx *sctx, u64 ino)
Alexander Block31db9f72012-07-25 23:19:24 +02002606{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002607 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02002608 int ret = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02002609 struct fs_path *p;
Alexander Block31db9f72012-07-25 23:19:24 +02002610 int cmd;
Alexander Block1f4692d2012-07-28 10:42:24 +02002611 u64 gen;
Alexander Block31db9f72012-07-25 23:19:24 +02002612 u64 mode;
Alexander Block1f4692d2012-07-28 10:42:24 +02002613 u64 rdev;
Alexander Block31db9f72012-07-25 23:19:24 +02002614
Jeff Mahoney04ab9562016-09-20 10:05:03 -04002615 btrfs_debug(fs_info, "send_create_inode %llu", ino);
Alexander Block31db9f72012-07-25 23:19:24 +02002616
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002617 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002618 if (!p)
2619 return -ENOMEM;
2620
Liu Bo644d1942014-02-27 17:29:01 +08002621 if (ino != sctx->cur_ino) {
2622 ret = get_inode_info(sctx->send_root, ino, NULL, &gen, &mode,
2623 NULL, NULL, &rdev);
2624 if (ret < 0)
2625 goto out;
2626 } else {
2627 gen = sctx->cur_inode_gen;
2628 mode = sctx->cur_inode_mode;
2629 rdev = sctx->cur_inode_rdev;
2630 }
Alexander Block31db9f72012-07-25 23:19:24 +02002631
Alexander Blocke938c8a2012-07-28 16:33:49 +02002632 if (S_ISREG(mode)) {
Alexander Block31db9f72012-07-25 23:19:24 +02002633 cmd = BTRFS_SEND_C_MKFILE;
Alexander Blocke938c8a2012-07-28 16:33:49 +02002634 } else if (S_ISDIR(mode)) {
Alexander Block31db9f72012-07-25 23:19:24 +02002635 cmd = BTRFS_SEND_C_MKDIR;
Alexander Blocke938c8a2012-07-28 16:33:49 +02002636 } else if (S_ISLNK(mode)) {
Alexander Block31db9f72012-07-25 23:19:24 +02002637 cmd = BTRFS_SEND_C_SYMLINK;
Alexander Blocke938c8a2012-07-28 16:33:49 +02002638 } else if (S_ISCHR(mode) || S_ISBLK(mode)) {
Alexander Block31db9f72012-07-25 23:19:24 +02002639 cmd = BTRFS_SEND_C_MKNOD;
Alexander Blocke938c8a2012-07-28 16:33:49 +02002640 } else if (S_ISFIFO(mode)) {
Alexander Block31db9f72012-07-25 23:19:24 +02002641 cmd = BTRFS_SEND_C_MKFIFO;
Alexander Blocke938c8a2012-07-28 16:33:49 +02002642 } else if (S_ISSOCK(mode)) {
Alexander Block31db9f72012-07-25 23:19:24 +02002643 cmd = BTRFS_SEND_C_MKSOCK;
Alexander Blocke938c8a2012-07-28 16:33:49 +02002644 } else {
David Sterbaf14d1042015-10-08 11:37:06 +02002645 btrfs_warn(sctx->send_root->fs_info, "unexpected inode type %o",
Alexander Block31db9f72012-07-25 23:19:24 +02002646 (int)(mode & S_IFMT));
2647 ret = -ENOTSUPP;
2648 goto out;
2649 }
2650
2651 ret = begin_cmd(sctx, cmd);
2652 if (ret < 0)
2653 goto out;
2654
Alexander Block1f4692d2012-07-28 10:42:24 +02002655 ret = gen_unique_name(sctx, ino, gen, p);
Alexander Block31db9f72012-07-25 23:19:24 +02002656 if (ret < 0)
2657 goto out;
2658
2659 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
Alexander Block1f4692d2012-07-28 10:42:24 +02002660 TLV_PUT_U64(sctx, BTRFS_SEND_A_INO, ino);
Alexander Block31db9f72012-07-25 23:19:24 +02002661
2662 if (S_ISLNK(mode)) {
2663 fs_path_reset(p);
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002664 ret = read_symlink(sctx->send_root, ino, p);
Alexander Block31db9f72012-07-25 23:19:24 +02002665 if (ret < 0)
2666 goto out;
2667 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH_LINK, p);
2668 } else if (S_ISCHR(mode) || S_ISBLK(mode) ||
2669 S_ISFIFO(mode) || S_ISSOCK(mode)) {
Arne Jansend79e5042012-10-15 18:28:46 +00002670 TLV_PUT_U64(sctx, BTRFS_SEND_A_RDEV, new_encode_dev(rdev));
2671 TLV_PUT_U64(sctx, BTRFS_SEND_A_MODE, mode);
Alexander Block31db9f72012-07-25 23:19:24 +02002672 }
2673
2674 ret = send_cmd(sctx);
2675 if (ret < 0)
2676 goto out;
2677
2678
2679tlv_put_failure:
2680out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002681 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02002682 return ret;
2683}
2684
Alexander Block1f4692d2012-07-28 10:42:24 +02002685/*
2686 * We need some special handling for inodes that get processed before the parent
2687 * directory got created. See process_recorded_refs for details.
2688 * This function does the check if we already created the dir out of order.
2689 */
2690static int did_create_dir(struct send_ctx *sctx, u64 dir)
2691{
2692 int ret = 0;
2693 struct btrfs_path *path = NULL;
2694 struct btrfs_key key;
2695 struct btrfs_key found_key;
2696 struct btrfs_key di_key;
2697 struct extent_buffer *eb;
2698 struct btrfs_dir_item *di;
2699 int slot;
2700
2701 path = alloc_path_for_send();
2702 if (!path) {
2703 ret = -ENOMEM;
2704 goto out;
2705 }
2706
2707 key.objectid = dir;
2708 key.type = BTRFS_DIR_INDEX_KEY;
2709 key.offset = 0;
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00002710 ret = btrfs_search_slot(NULL, sctx->send_root, &key, path, 0, 0);
2711 if (ret < 0)
2712 goto out;
2713
Alexander Block1f4692d2012-07-28 10:42:24 +02002714 while (1) {
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00002715 eb = path->nodes[0];
2716 slot = path->slots[0];
2717 if (slot >= btrfs_header_nritems(eb)) {
2718 ret = btrfs_next_leaf(sctx->send_root, path);
2719 if (ret < 0) {
2720 goto out;
2721 } else if (ret > 0) {
2722 ret = 0;
2723 break;
2724 }
2725 continue;
Alexander Block1f4692d2012-07-28 10:42:24 +02002726 }
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00002727
2728 btrfs_item_key_to_cpu(eb, &found_key, slot);
2729 if (found_key.objectid != key.objectid ||
Alexander Block1f4692d2012-07-28 10:42:24 +02002730 found_key.type != key.type) {
2731 ret = 0;
2732 goto out;
2733 }
2734
2735 di = btrfs_item_ptr(eb, slot, struct btrfs_dir_item);
2736 btrfs_dir_item_key_to_cpu(eb, di, &di_key);
2737
Josef Bacika0525412013-08-12 10:56:14 -04002738 if (di_key.type != BTRFS_ROOT_ITEM_KEY &&
2739 di_key.objectid < sctx->send_progress) {
Alexander Block1f4692d2012-07-28 10:42:24 +02002740 ret = 1;
2741 goto out;
2742 }
2743
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00002744 path->slots[0]++;
Alexander Block1f4692d2012-07-28 10:42:24 +02002745 }
2746
2747out:
2748 btrfs_free_path(path);
2749 return ret;
2750}
2751
2752/*
2753 * Only creates the inode if it is:
2754 * 1. Not a directory
2755 * 2. Or a directory which was not created already due to out of order
2756 * directories. See did_create_dir and process_recorded_refs for details.
2757 */
2758static int send_create_inode_if_needed(struct send_ctx *sctx)
2759{
2760 int ret;
2761
2762 if (S_ISDIR(sctx->cur_inode_mode)) {
2763 ret = did_create_dir(sctx, sctx->cur_ino);
2764 if (ret < 0)
2765 goto out;
2766 if (ret) {
2767 ret = 0;
2768 goto out;
2769 }
2770 }
2771
2772 ret = send_create_inode(sctx, sctx->cur_ino);
2773 if (ret < 0)
2774 goto out;
2775
2776out:
2777 return ret;
2778}
2779
Alexander Block31db9f72012-07-25 23:19:24 +02002780struct recorded_ref {
2781 struct list_head list;
2782 char *dir_path;
2783 char *name;
2784 struct fs_path *full_path;
2785 u64 dir;
2786 u64 dir_gen;
2787 int dir_path_len;
2788 int name_len;
2789};
2790
2791/*
2792 * We need to process new refs before deleted refs, but compare_tree gives us
2793 * everything mixed. So we first record all refs and later process them.
2794 * This function is a helper to record one ref.
2795 */
Liu Boa4d96d62014-03-03 21:31:03 +08002796static int __record_ref(struct list_head *head, u64 dir,
Alexander Block31db9f72012-07-25 23:19:24 +02002797 u64 dir_gen, struct fs_path *path)
2798{
2799 struct recorded_ref *ref;
Alexander Block31db9f72012-07-25 23:19:24 +02002800
David Sterbae780b0d2016-01-18 18:42:13 +01002801 ref = kmalloc(sizeof(*ref), GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +02002802 if (!ref)
2803 return -ENOMEM;
2804
2805 ref->dir = dir;
2806 ref->dir_gen = dir_gen;
2807 ref->full_path = path;
2808
Andy Shevchenkoed848852013-08-21 10:32:13 +03002809 ref->name = (char *)kbasename(ref->full_path->start);
2810 ref->name_len = ref->full_path->end - ref->name;
2811 ref->dir_path = ref->full_path->start;
2812 if (ref->name == ref->full_path->start)
Alexander Block31db9f72012-07-25 23:19:24 +02002813 ref->dir_path_len = 0;
Andy Shevchenkoed848852013-08-21 10:32:13 +03002814 else
Alexander Block31db9f72012-07-25 23:19:24 +02002815 ref->dir_path_len = ref->full_path->end -
2816 ref->full_path->start - 1 - ref->name_len;
Alexander Block31db9f72012-07-25 23:19:24 +02002817
2818 list_add_tail(&ref->list, head);
2819 return 0;
2820}
2821
Josef Bacikba5e8f22013-08-16 16:52:55 -04002822static int dup_ref(struct recorded_ref *ref, struct list_head *list)
2823{
2824 struct recorded_ref *new;
2825
David Sterbae780b0d2016-01-18 18:42:13 +01002826 new = kmalloc(sizeof(*ref), GFP_KERNEL);
Josef Bacikba5e8f22013-08-16 16:52:55 -04002827 if (!new)
2828 return -ENOMEM;
2829
2830 new->dir = ref->dir;
2831 new->dir_gen = ref->dir_gen;
2832 new->full_path = NULL;
2833 INIT_LIST_HEAD(&new->list);
2834 list_add_tail(&new->list, list);
2835 return 0;
2836}
2837
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002838static void __free_recorded_refs(struct list_head *head)
Alexander Block31db9f72012-07-25 23:19:24 +02002839{
2840 struct recorded_ref *cur;
Alexander Block31db9f72012-07-25 23:19:24 +02002841
Alexander Blocke938c8a2012-07-28 16:33:49 +02002842 while (!list_empty(head)) {
2843 cur = list_entry(head->next, struct recorded_ref, list);
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002844 fs_path_free(cur->full_path);
Alexander Blocke938c8a2012-07-28 16:33:49 +02002845 list_del(&cur->list);
Alexander Block31db9f72012-07-25 23:19:24 +02002846 kfree(cur);
2847 }
Alexander Block31db9f72012-07-25 23:19:24 +02002848}
2849
2850static void free_recorded_refs(struct send_ctx *sctx)
2851{
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002852 __free_recorded_refs(&sctx->new_refs);
2853 __free_recorded_refs(&sctx->deleted_refs);
Alexander Block31db9f72012-07-25 23:19:24 +02002854}
2855
2856/*
Alexander Block766702e2012-07-28 14:11:31 +02002857 * Renames/moves a file/dir to its orphan name. Used when the first
Alexander Block31db9f72012-07-25 23:19:24 +02002858 * ref of an unprocessed inode gets overwritten and for all non empty
2859 * directories.
2860 */
2861static int orphanize_inode(struct send_ctx *sctx, u64 ino, u64 gen,
2862 struct fs_path *path)
2863{
2864 int ret;
2865 struct fs_path *orphan;
2866
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002867 orphan = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02002868 if (!orphan)
2869 return -ENOMEM;
2870
2871 ret = gen_unique_name(sctx, ino, gen, orphan);
2872 if (ret < 0)
2873 goto out;
2874
2875 ret = send_rename(sctx, path, orphan);
2876
2877out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00002878 fs_path_free(orphan);
Alexander Block31db9f72012-07-25 23:19:24 +02002879 return ret;
2880}
2881
Filipe Manana9dc44212014-02-19 14:31:44 +00002882static struct orphan_dir_info *
2883add_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino)
2884{
2885 struct rb_node **p = &sctx->orphan_dirs.rb_node;
2886 struct rb_node *parent = NULL;
2887 struct orphan_dir_info *entry, *odi;
2888
David Sterbae780b0d2016-01-18 18:42:13 +01002889 odi = kmalloc(sizeof(*odi), GFP_KERNEL);
Filipe Manana9dc44212014-02-19 14:31:44 +00002890 if (!odi)
2891 return ERR_PTR(-ENOMEM);
2892 odi->ino = dir_ino;
2893 odi->gen = 0;
2894
2895 while (*p) {
2896 parent = *p;
2897 entry = rb_entry(parent, struct orphan_dir_info, node);
2898 if (dir_ino < entry->ino) {
2899 p = &(*p)->rb_left;
2900 } else if (dir_ino > entry->ino) {
2901 p = &(*p)->rb_right;
2902 } else {
2903 kfree(odi);
2904 return entry;
2905 }
2906 }
2907
2908 rb_link_node(&odi->node, parent, p);
2909 rb_insert_color(&odi->node, &sctx->orphan_dirs);
2910 return odi;
2911}
2912
2913static struct orphan_dir_info *
2914get_orphan_dir_info(struct send_ctx *sctx, u64 dir_ino)
2915{
2916 struct rb_node *n = sctx->orphan_dirs.rb_node;
2917 struct orphan_dir_info *entry;
2918
2919 while (n) {
2920 entry = rb_entry(n, struct orphan_dir_info, node);
2921 if (dir_ino < entry->ino)
2922 n = n->rb_left;
2923 else if (dir_ino > entry->ino)
2924 n = n->rb_right;
2925 else
2926 return entry;
2927 }
2928 return NULL;
2929}
2930
2931static int is_waiting_for_rm(struct send_ctx *sctx, u64 dir_ino)
2932{
2933 struct orphan_dir_info *odi = get_orphan_dir_info(sctx, dir_ino);
2934
2935 return odi != NULL;
2936}
2937
2938static void free_orphan_dir_info(struct send_ctx *sctx,
2939 struct orphan_dir_info *odi)
2940{
2941 if (!odi)
2942 return;
2943 rb_erase(&odi->node, &sctx->orphan_dirs);
2944 kfree(odi);
2945}
2946
Alexander Block31db9f72012-07-25 23:19:24 +02002947/*
2948 * Returns 1 if a directory can be removed at this point in time.
2949 * We check this by iterating all dir items and checking if the inode behind
2950 * the dir item was already processed.
2951 */
Filipe Manana9dc44212014-02-19 14:31:44 +00002952static int can_rmdir(struct send_ctx *sctx, u64 dir, u64 dir_gen,
2953 u64 send_progress)
Alexander Block31db9f72012-07-25 23:19:24 +02002954{
2955 int ret = 0;
2956 struct btrfs_root *root = sctx->parent_root;
2957 struct btrfs_path *path;
2958 struct btrfs_key key;
2959 struct btrfs_key found_key;
2960 struct btrfs_key loc;
2961 struct btrfs_dir_item *di;
2962
Alexander Block6d85ed02012-08-01 14:48:59 +02002963 /*
2964 * Don't try to rmdir the top/root subvolume dir.
2965 */
2966 if (dir == BTRFS_FIRST_FREE_OBJECTID)
2967 return 0;
2968
Alexander Block31db9f72012-07-25 23:19:24 +02002969 path = alloc_path_for_send();
2970 if (!path)
2971 return -ENOMEM;
2972
2973 key.objectid = dir;
2974 key.type = BTRFS_DIR_INDEX_KEY;
2975 key.offset = 0;
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00002976 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
2977 if (ret < 0)
2978 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02002979
2980 while (1) {
Filipe Manana9dc44212014-02-19 14:31:44 +00002981 struct waiting_dir_move *dm;
2982
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00002983 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
2984 ret = btrfs_next_leaf(root, path);
2985 if (ret < 0)
2986 goto out;
2987 else if (ret > 0)
2988 break;
2989 continue;
Alexander Block31db9f72012-07-25 23:19:24 +02002990 }
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00002991 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
2992 path->slots[0]);
2993 if (found_key.objectid != key.objectid ||
2994 found_key.type != key.type)
Alexander Block31db9f72012-07-25 23:19:24 +02002995 break;
Alexander Block31db9f72012-07-25 23:19:24 +02002996
2997 di = btrfs_item_ptr(path->nodes[0], path->slots[0],
2998 struct btrfs_dir_item);
2999 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &loc);
3000
Filipe Manana9dc44212014-02-19 14:31:44 +00003001 dm = get_waiting_dir_move(sctx, loc.objectid);
3002 if (dm) {
3003 struct orphan_dir_info *odi;
3004
3005 odi = add_orphan_dir_info(sctx, dir);
3006 if (IS_ERR(odi)) {
3007 ret = PTR_ERR(odi);
3008 goto out;
3009 }
3010 odi->gen = dir_gen;
3011 dm->rmdir_ino = dir;
3012 ret = 0;
3013 goto out;
3014 }
3015
Alexander Block31db9f72012-07-25 23:19:24 +02003016 if (loc.objectid > send_progress) {
Robbie Ko443f9d22015-06-22 17:08:45 +08003017 struct orphan_dir_info *odi;
3018
3019 odi = get_orphan_dir_info(sctx, dir);
3020 free_orphan_dir_info(sctx, odi);
Alexander Block31db9f72012-07-25 23:19:24 +02003021 ret = 0;
3022 goto out;
3023 }
3024
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00003025 path->slots[0]++;
Alexander Block31db9f72012-07-25 23:19:24 +02003026 }
3027
3028 ret = 1;
3029
3030out:
3031 btrfs_free_path(path);
3032 return ret;
3033}
3034
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003035static int is_waiting_for_move(struct send_ctx *sctx, u64 ino)
3036{
Filipe Manana9dc44212014-02-19 14:31:44 +00003037 struct waiting_dir_move *entry = get_waiting_dir_move(sctx, ino);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003038
Filipe Manana9dc44212014-02-19 14:31:44 +00003039 return entry != NULL;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003040}
3041
Filipe Manana8b191a62015-04-09 14:09:14 +01003042static int add_waiting_dir_move(struct send_ctx *sctx, u64 ino, bool orphanized)
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003043{
3044 struct rb_node **p = &sctx->waiting_dir_moves.rb_node;
3045 struct rb_node *parent = NULL;
3046 struct waiting_dir_move *entry, *dm;
3047
David Sterbae780b0d2016-01-18 18:42:13 +01003048 dm = kmalloc(sizeof(*dm), GFP_KERNEL);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003049 if (!dm)
3050 return -ENOMEM;
3051 dm->ino = ino;
Filipe Manana9dc44212014-02-19 14:31:44 +00003052 dm->rmdir_ino = 0;
Filipe Manana8b191a62015-04-09 14:09:14 +01003053 dm->orphanized = orphanized;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003054
3055 while (*p) {
3056 parent = *p;
3057 entry = rb_entry(parent, struct waiting_dir_move, node);
3058 if (ino < entry->ino) {
3059 p = &(*p)->rb_left;
3060 } else if (ino > entry->ino) {
3061 p = &(*p)->rb_right;
3062 } else {
3063 kfree(dm);
3064 return -EEXIST;
3065 }
3066 }
3067
3068 rb_link_node(&dm->node, parent, p);
3069 rb_insert_color(&dm->node, &sctx->waiting_dir_moves);
3070 return 0;
3071}
3072
Filipe Manana9dc44212014-02-19 14:31:44 +00003073static struct waiting_dir_move *
3074get_waiting_dir_move(struct send_ctx *sctx, u64 ino)
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003075{
3076 struct rb_node *n = sctx->waiting_dir_moves.rb_node;
3077 struct waiting_dir_move *entry;
3078
3079 while (n) {
3080 entry = rb_entry(n, struct waiting_dir_move, node);
Filipe Manana9dc44212014-02-19 14:31:44 +00003081 if (ino < entry->ino)
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003082 n = n->rb_left;
Filipe Manana9dc44212014-02-19 14:31:44 +00003083 else if (ino > entry->ino)
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003084 n = n->rb_right;
Filipe Manana9dc44212014-02-19 14:31:44 +00003085 else
3086 return entry;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003087 }
Filipe Manana9dc44212014-02-19 14:31:44 +00003088 return NULL;
3089}
3090
3091static void free_waiting_dir_move(struct send_ctx *sctx,
3092 struct waiting_dir_move *dm)
3093{
3094 if (!dm)
3095 return;
3096 rb_erase(&dm->node, &sctx->waiting_dir_moves);
3097 kfree(dm);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003098}
3099
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003100static int add_pending_dir_move(struct send_ctx *sctx,
3101 u64 ino,
3102 u64 ino_gen,
Filipe Mananaf9594922014-03-27 20:14:01 +00003103 u64 parent_ino,
3104 struct list_head *new_refs,
Filipe Manana84471e22015-02-28 22:29:22 +00003105 struct list_head *deleted_refs,
3106 const bool is_orphan)
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003107{
3108 struct rb_node **p = &sctx->pending_dir_moves.rb_node;
3109 struct rb_node *parent = NULL;
Chris Mason73b802f2014-03-21 15:30:44 -07003110 struct pending_dir_move *entry = NULL, *pm;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003111 struct recorded_ref *cur;
3112 int exists = 0;
3113 int ret;
3114
David Sterbae780b0d2016-01-18 18:42:13 +01003115 pm = kmalloc(sizeof(*pm), GFP_KERNEL);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003116 if (!pm)
3117 return -ENOMEM;
3118 pm->parent_ino = parent_ino;
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003119 pm->ino = ino;
3120 pm->gen = ino_gen;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003121 INIT_LIST_HEAD(&pm->list);
3122 INIT_LIST_HEAD(&pm->update_refs);
3123 RB_CLEAR_NODE(&pm->node);
3124
3125 while (*p) {
3126 parent = *p;
3127 entry = rb_entry(parent, struct pending_dir_move, node);
3128 if (parent_ino < entry->parent_ino) {
3129 p = &(*p)->rb_left;
3130 } else if (parent_ino > entry->parent_ino) {
3131 p = &(*p)->rb_right;
3132 } else {
3133 exists = 1;
3134 break;
3135 }
3136 }
3137
Filipe Mananaf9594922014-03-27 20:14:01 +00003138 list_for_each_entry(cur, deleted_refs, list) {
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003139 ret = dup_ref(cur, &pm->update_refs);
3140 if (ret < 0)
3141 goto out;
3142 }
Filipe Mananaf9594922014-03-27 20:14:01 +00003143 list_for_each_entry(cur, new_refs, list) {
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003144 ret = dup_ref(cur, &pm->update_refs);
3145 if (ret < 0)
3146 goto out;
3147 }
3148
Filipe Manana8b191a62015-04-09 14:09:14 +01003149 ret = add_waiting_dir_move(sctx, pm->ino, is_orphan);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003150 if (ret)
3151 goto out;
3152
3153 if (exists) {
3154 list_add_tail(&pm->list, &entry->list);
3155 } else {
3156 rb_link_node(&pm->node, parent, p);
3157 rb_insert_color(&pm->node, &sctx->pending_dir_moves);
3158 }
3159 ret = 0;
3160out:
3161 if (ret) {
3162 __free_recorded_refs(&pm->update_refs);
3163 kfree(pm);
3164 }
3165 return ret;
3166}
3167
3168static struct pending_dir_move *get_pending_dir_moves(struct send_ctx *sctx,
3169 u64 parent_ino)
3170{
3171 struct rb_node *n = sctx->pending_dir_moves.rb_node;
3172 struct pending_dir_move *entry;
3173
3174 while (n) {
3175 entry = rb_entry(n, struct pending_dir_move, node);
3176 if (parent_ino < entry->parent_ino)
3177 n = n->rb_left;
3178 else if (parent_ino > entry->parent_ino)
3179 n = n->rb_right;
3180 else
3181 return entry;
3182 }
3183 return NULL;
3184}
3185
Robbie Ko801bec32015-06-23 18:39:46 +08003186static int path_loop(struct send_ctx *sctx, struct fs_path *name,
3187 u64 ino, u64 gen, u64 *ancestor_ino)
3188{
3189 int ret = 0;
3190 u64 parent_inode = 0;
3191 u64 parent_gen = 0;
3192 u64 start_ino = ino;
3193
3194 *ancestor_ino = 0;
3195 while (ino != BTRFS_FIRST_FREE_OBJECTID) {
3196 fs_path_reset(name);
3197
3198 if (is_waiting_for_rm(sctx, ino))
3199 break;
3200 if (is_waiting_for_move(sctx, ino)) {
3201 if (*ancestor_ino == 0)
3202 *ancestor_ino = ino;
3203 ret = get_first_ref(sctx->parent_root, ino,
3204 &parent_inode, &parent_gen, name);
3205 } else {
3206 ret = __get_cur_name_and_parent(sctx, ino, gen,
3207 &parent_inode,
3208 &parent_gen, name);
3209 if (ret > 0) {
3210 ret = 0;
3211 break;
3212 }
3213 }
3214 if (ret < 0)
3215 break;
3216 if (parent_inode == start_ino) {
3217 ret = 1;
3218 if (*ancestor_ino == 0)
3219 *ancestor_ino = ino;
3220 break;
3221 }
3222 ino = parent_inode;
3223 gen = parent_gen;
3224 }
3225 return ret;
3226}
3227
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003228static int apply_dir_move(struct send_ctx *sctx, struct pending_dir_move *pm)
3229{
3230 struct fs_path *from_path = NULL;
3231 struct fs_path *to_path = NULL;
Filipe Manana2b863a12014-02-16 13:43:11 +00003232 struct fs_path *name = NULL;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003233 u64 orig_progress = sctx->send_progress;
3234 struct recorded_ref *cur;
Filipe Manana2b863a12014-02-16 13:43:11 +00003235 u64 parent_ino, parent_gen;
Filipe Manana9dc44212014-02-19 14:31:44 +00003236 struct waiting_dir_move *dm = NULL;
3237 u64 rmdir_ino = 0;
Robbie Ko801bec32015-06-23 18:39:46 +08003238 u64 ancestor;
3239 bool is_orphan;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003240 int ret;
3241
Filipe Manana2b863a12014-02-16 13:43:11 +00003242 name = fs_path_alloc();
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003243 from_path = fs_path_alloc();
Filipe Manana2b863a12014-02-16 13:43:11 +00003244 if (!name || !from_path) {
3245 ret = -ENOMEM;
3246 goto out;
3247 }
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003248
Filipe Manana9dc44212014-02-19 14:31:44 +00003249 dm = get_waiting_dir_move(sctx, pm->ino);
3250 ASSERT(dm);
3251 rmdir_ino = dm->rmdir_ino;
Robbie Ko801bec32015-06-23 18:39:46 +08003252 is_orphan = dm->orphanized;
Filipe Manana9dc44212014-02-19 14:31:44 +00003253 free_waiting_dir_move(sctx, dm);
Filipe Manana2b863a12014-02-16 13:43:11 +00003254
Robbie Ko801bec32015-06-23 18:39:46 +08003255 if (is_orphan) {
Filipe Manana84471e22015-02-28 22:29:22 +00003256 ret = gen_unique_name(sctx, pm->ino,
3257 pm->gen, from_path);
3258 } else {
3259 ret = get_first_ref(sctx->parent_root, pm->ino,
3260 &parent_ino, &parent_gen, name);
3261 if (ret < 0)
3262 goto out;
3263 ret = get_cur_path(sctx, parent_ino, parent_gen,
3264 from_path);
3265 if (ret < 0)
3266 goto out;
3267 ret = fs_path_add_path(from_path, name);
3268 }
Filipe Mananac992ec92014-03-22 17:15:24 +00003269 if (ret < 0)
3270 goto out;
3271
Filipe Mananaf9594922014-03-27 20:14:01 +00003272 sctx->send_progress = sctx->cur_ino + 1;
Robbie Ko801bec32015-06-23 18:39:46 +08003273 ret = path_loop(sctx, name, pm->ino, pm->gen, &ancestor);
Filipe Manana7969e772016-06-17 17:13:36 +01003274 if (ret < 0)
3275 goto out;
Robbie Ko801bec32015-06-23 18:39:46 +08003276 if (ret) {
3277 LIST_HEAD(deleted_refs);
3278 ASSERT(ancestor > BTRFS_FIRST_FREE_OBJECTID);
3279 ret = add_pending_dir_move(sctx, pm->ino, pm->gen, ancestor,
3280 &pm->update_refs, &deleted_refs,
3281 is_orphan);
3282 if (ret < 0)
3283 goto out;
3284 if (rmdir_ino) {
3285 dm = get_waiting_dir_move(sctx, pm->ino);
3286 ASSERT(dm);
3287 dm->rmdir_ino = rmdir_ino;
3288 }
3289 goto out;
3290 }
Filipe Mananac992ec92014-03-22 17:15:24 +00003291 fs_path_reset(name);
3292 to_path = name;
3293 name = NULL;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003294 ret = get_cur_path(sctx, pm->ino, pm->gen, to_path);
3295 if (ret < 0)
3296 goto out;
3297
3298 ret = send_rename(sctx, from_path, to_path);
3299 if (ret < 0)
3300 goto out;
3301
Filipe Manana9dc44212014-02-19 14:31:44 +00003302 if (rmdir_ino) {
3303 struct orphan_dir_info *odi;
3304
3305 odi = get_orphan_dir_info(sctx, rmdir_ino);
3306 if (!odi) {
3307 /* already deleted */
3308 goto finish;
3309 }
Robbie Ko99ea42d2015-06-23 18:39:49 +08003310 ret = can_rmdir(sctx, rmdir_ino, odi->gen, sctx->cur_ino);
Filipe Manana9dc44212014-02-19 14:31:44 +00003311 if (ret < 0)
3312 goto out;
3313 if (!ret)
3314 goto finish;
3315
3316 name = fs_path_alloc();
3317 if (!name) {
3318 ret = -ENOMEM;
3319 goto out;
3320 }
3321 ret = get_cur_path(sctx, rmdir_ino, odi->gen, name);
3322 if (ret < 0)
3323 goto out;
3324 ret = send_rmdir(sctx, name);
3325 if (ret < 0)
3326 goto out;
3327 free_orphan_dir_info(sctx, odi);
3328 }
3329
3330finish:
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003331 ret = send_utimes(sctx, pm->ino, pm->gen);
3332 if (ret < 0)
3333 goto out;
3334
3335 /*
3336 * After rename/move, need to update the utimes of both new parent(s)
3337 * and old parent(s).
3338 */
3339 list_for_each_entry(cur, &pm->update_refs, list) {
Robbie Ko764433a2015-06-23 18:39:50 +08003340 /*
3341 * The parent inode might have been deleted in the send snapshot
3342 */
3343 ret = get_inode_info(sctx->send_root, cur->dir, NULL,
3344 NULL, NULL, NULL, NULL, NULL);
3345 if (ret == -ENOENT) {
3346 ret = 0;
Filipe Manana9dc44212014-02-19 14:31:44 +00003347 continue;
Robbie Ko764433a2015-06-23 18:39:50 +08003348 }
3349 if (ret < 0)
3350 goto out;
3351
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003352 ret = send_utimes(sctx, cur->dir, cur->dir_gen);
3353 if (ret < 0)
3354 goto out;
3355 }
3356
3357out:
Filipe Manana2b863a12014-02-16 13:43:11 +00003358 fs_path_free(name);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003359 fs_path_free(from_path);
3360 fs_path_free(to_path);
3361 sctx->send_progress = orig_progress;
3362
3363 return ret;
3364}
3365
3366static void free_pending_move(struct send_ctx *sctx, struct pending_dir_move *m)
3367{
3368 if (!list_empty(&m->list))
3369 list_del(&m->list);
3370 if (!RB_EMPTY_NODE(&m->node))
3371 rb_erase(&m->node, &sctx->pending_dir_moves);
3372 __free_recorded_refs(&m->update_refs);
3373 kfree(m);
3374}
3375
Robbie Koaeda9162018-11-14 18:32:37 +00003376static void tail_append_pending_moves(struct send_ctx *sctx,
3377 struct pending_dir_move *moves,
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003378 struct list_head *stack)
3379{
3380 if (list_empty(&moves->list)) {
3381 list_add_tail(&moves->list, stack);
3382 } else {
3383 LIST_HEAD(list);
3384 list_splice_init(&moves->list, &list);
3385 list_add_tail(&moves->list, stack);
3386 list_splice_tail(&list, stack);
3387 }
Robbie Koaeda9162018-11-14 18:32:37 +00003388 if (!RB_EMPTY_NODE(&moves->node)) {
3389 rb_erase(&moves->node, &sctx->pending_dir_moves);
3390 RB_CLEAR_NODE(&moves->node);
3391 }
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003392}
3393
3394static int apply_children_dir_moves(struct send_ctx *sctx)
3395{
3396 struct pending_dir_move *pm;
3397 struct list_head stack;
3398 u64 parent_ino = sctx->cur_ino;
3399 int ret = 0;
3400
3401 pm = get_pending_dir_moves(sctx, parent_ino);
3402 if (!pm)
3403 return 0;
3404
3405 INIT_LIST_HEAD(&stack);
Robbie Koaeda9162018-11-14 18:32:37 +00003406 tail_append_pending_moves(sctx, pm, &stack);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003407
3408 while (!list_empty(&stack)) {
3409 pm = list_first_entry(&stack, struct pending_dir_move, list);
3410 parent_ino = pm->ino;
3411 ret = apply_dir_move(sctx, pm);
3412 free_pending_move(sctx, pm);
3413 if (ret)
3414 goto out;
3415 pm = get_pending_dir_moves(sctx, parent_ino);
3416 if (pm)
Robbie Koaeda9162018-11-14 18:32:37 +00003417 tail_append_pending_moves(sctx, pm, &stack);
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003418 }
3419 return 0;
3420
3421out:
3422 while (!list_empty(&stack)) {
3423 pm = list_first_entry(&stack, struct pending_dir_move, list);
3424 free_pending_move(sctx, pm);
3425 }
3426 return ret;
3427}
3428
Filipe Manana84471e22015-02-28 22:29:22 +00003429/*
3430 * We might need to delay a directory rename even when no ancestor directory
3431 * (in the send root) with a higher inode number than ours (sctx->cur_ino) was
3432 * renamed. This happens when we rename a directory to the old name (the name
3433 * in the parent root) of some other unrelated directory that got its rename
3434 * delayed due to some ancestor with higher number that got renamed.
3435 *
3436 * Example:
3437 *
3438 * Parent snapshot:
3439 * . (ino 256)
3440 * |---- a/ (ino 257)
3441 * | |---- file (ino 260)
3442 * |
3443 * |---- b/ (ino 258)
3444 * |---- c/ (ino 259)
3445 *
3446 * Send snapshot:
3447 * . (ino 256)
3448 * |---- a/ (ino 258)
3449 * |---- x/ (ino 259)
3450 * |---- y/ (ino 257)
3451 * |----- file (ino 260)
3452 *
3453 * Here we can not rename 258 from 'b' to 'a' without the rename of inode 257
3454 * from 'a' to 'x/y' happening first, which in turn depends on the rename of
3455 * inode 259 from 'c' to 'x'. So the order of rename commands the send stream
3456 * must issue is:
3457 *
3458 * 1 - rename 259 from 'c' to 'x'
3459 * 2 - rename 257 from 'a' to 'x/y'
3460 * 3 - rename 258 from 'b' to 'a'
3461 *
3462 * Returns 1 if the rename of sctx->cur_ino needs to be delayed, 0 if it can
3463 * be done right away and < 0 on error.
3464 */
3465static int wait_for_dest_dir_move(struct send_ctx *sctx,
3466 struct recorded_ref *parent_ref,
3467 const bool is_orphan)
3468{
3469 struct btrfs_path *path;
3470 struct btrfs_key key;
3471 struct btrfs_key di_key;
3472 struct btrfs_dir_item *di;
3473 u64 left_gen;
3474 u64 right_gen;
3475 int ret = 0;
Robbie Ko801bec32015-06-23 18:39:46 +08003476 struct waiting_dir_move *wdm;
Filipe Manana84471e22015-02-28 22:29:22 +00003477
3478 if (RB_EMPTY_ROOT(&sctx->waiting_dir_moves))
3479 return 0;
3480
3481 path = alloc_path_for_send();
3482 if (!path)
3483 return -ENOMEM;
3484
3485 key.objectid = parent_ref->dir;
3486 key.type = BTRFS_DIR_ITEM_KEY;
3487 key.offset = btrfs_name_hash(parent_ref->name, parent_ref->name_len);
3488
3489 ret = btrfs_search_slot(NULL, sctx->parent_root, &key, path, 0, 0);
3490 if (ret < 0) {
3491 goto out;
3492 } else if (ret > 0) {
3493 ret = 0;
3494 goto out;
3495 }
3496
3497 di = btrfs_match_dir_item_name(sctx->parent_root, path,
3498 parent_ref->name, parent_ref->name_len);
3499 if (!di) {
3500 ret = 0;
3501 goto out;
3502 }
3503 /*
3504 * di_key.objectid has the number of the inode that has a dentry in the
3505 * parent directory with the same name that sctx->cur_ino is being
3506 * renamed to. We need to check if that inode is in the send root as
3507 * well and if it is currently marked as an inode with a pending rename,
3508 * if it is, we need to delay the rename of sctx->cur_ino as well, so
3509 * that it happens after that other inode is renamed.
3510 */
3511 btrfs_dir_item_key_to_cpu(path->nodes[0], di, &di_key);
3512 if (di_key.type != BTRFS_INODE_ITEM_KEY) {
3513 ret = 0;
3514 goto out;
3515 }
3516
3517 ret = get_inode_info(sctx->parent_root, di_key.objectid, NULL,
3518 &left_gen, NULL, NULL, NULL, NULL);
3519 if (ret < 0)
3520 goto out;
3521 ret = get_inode_info(sctx->send_root, di_key.objectid, NULL,
3522 &right_gen, NULL, NULL, NULL, NULL);
3523 if (ret < 0) {
3524 if (ret == -ENOENT)
3525 ret = 0;
3526 goto out;
3527 }
3528
3529 /* Different inode, no need to delay the rename of sctx->cur_ino */
3530 if (right_gen != left_gen) {
3531 ret = 0;
3532 goto out;
3533 }
3534
Robbie Ko801bec32015-06-23 18:39:46 +08003535 wdm = get_waiting_dir_move(sctx, di_key.objectid);
3536 if (wdm && !wdm->orphanized) {
Filipe Manana84471e22015-02-28 22:29:22 +00003537 ret = add_pending_dir_move(sctx,
3538 sctx->cur_ino,
3539 sctx->cur_inode_gen,
3540 di_key.objectid,
3541 &sctx->new_refs,
3542 &sctx->deleted_refs,
3543 is_orphan);
3544 if (!ret)
3545 ret = 1;
3546 }
3547out:
3548 btrfs_free_path(path);
3549 return ret;
3550}
3551
Filipe Manana80aa6022015-03-27 17:50:45 +00003552/*
3553 * Check if ino ino1 is an ancestor of inode ino2 in the given root.
3554 * Return 1 if true, 0 if false and < 0 on error.
3555 */
3556static int is_ancestor(struct btrfs_root *root,
3557 const u64 ino1,
3558 const u64 ino1_gen,
3559 const u64 ino2,
3560 struct fs_path *fs_path)
3561{
3562 u64 ino = ino2;
3563
3564 while (ino > BTRFS_FIRST_FREE_OBJECTID) {
3565 int ret;
3566 u64 parent;
3567 u64 parent_gen;
3568
3569 fs_path_reset(fs_path);
3570 ret = get_first_ref(root, ino, &parent, &parent_gen, fs_path);
3571 if (ret < 0) {
3572 if (ret == -ENOENT && ino == ino2)
3573 ret = 0;
3574 return ret;
3575 }
3576 if (parent == ino1)
3577 return parent_gen == ino1_gen ? 1 : 0;
3578 ino = parent;
3579 }
3580 return 0;
3581}
3582
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003583static int wait_for_parent_move(struct send_ctx *sctx,
Filipe Manana8b191a62015-04-09 14:09:14 +01003584 struct recorded_ref *parent_ref,
3585 const bool is_orphan)
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003586{
Filipe Mananaf9594922014-03-27 20:14:01 +00003587 int ret = 0;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003588 u64 ino = parent_ref->dir;
3589 u64 parent_ino_before, parent_ino_after;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003590 struct fs_path *path_before = NULL;
3591 struct fs_path *path_after = NULL;
3592 int len1, len2;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003593
3594 path_after = fs_path_alloc();
Filipe Mananaf9594922014-03-27 20:14:01 +00003595 path_before = fs_path_alloc();
3596 if (!path_after || !path_before) {
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003597 ret = -ENOMEM;
3598 goto out;
3599 }
3600
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003601 /*
Filipe Mananaf9594922014-03-27 20:14:01 +00003602 * Our current directory inode may not yet be renamed/moved because some
3603 * ancestor (immediate or not) has to be renamed/moved first. So find if
3604 * such ancestor exists and make sure our own rename/move happens after
Filipe Manana80aa6022015-03-27 17:50:45 +00003605 * that ancestor is processed to avoid path build infinite loops (done
3606 * at get_cur_path()).
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003607 */
Filipe Mananaf9594922014-03-27 20:14:01 +00003608 while (ino > BTRFS_FIRST_FREE_OBJECTID) {
3609 if (is_waiting_for_move(sctx, ino)) {
Filipe Manana80aa6022015-03-27 17:50:45 +00003610 /*
3611 * If the current inode is an ancestor of ino in the
3612 * parent root, we need to delay the rename of the
3613 * current inode, otherwise don't delayed the rename
3614 * because we can end up with a circular dependency
3615 * of renames, resulting in some directories never
3616 * getting the respective rename operations issued in
3617 * the send stream or getting into infinite path build
3618 * loops.
3619 */
3620 ret = is_ancestor(sctx->parent_root,
3621 sctx->cur_ino, sctx->cur_inode_gen,
3622 ino, path_before);
Filipe Manana4122ea62016-06-27 16:54:44 +01003623 if (ret)
3624 break;
Filipe Mananaf9594922014-03-27 20:14:01 +00003625 }
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003626
3627 fs_path_reset(path_before);
3628 fs_path_reset(path_after);
3629
3630 ret = get_first_ref(sctx->send_root, ino, &parent_ino_after,
Filipe Mananaf9594922014-03-27 20:14:01 +00003631 NULL, path_after);
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003632 if (ret < 0)
3633 goto out;
3634 ret = get_first_ref(sctx->parent_root, ino, &parent_ino_before,
3635 NULL, path_before);
Filipe Mananaf9594922014-03-27 20:14:01 +00003636 if (ret < 0 && ret != -ENOENT) {
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003637 goto out;
Filipe Mananaf9594922014-03-27 20:14:01 +00003638 } else if (ret == -ENOENT) {
Filipe Mananabf8e8ca2014-10-02 19:17:32 +01003639 ret = 0;
Filipe Mananaf9594922014-03-27 20:14:01 +00003640 break;
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003641 }
3642
3643 len1 = fs_path_len(path_before);
3644 len2 = fs_path_len(path_after);
Filipe Mananaf9594922014-03-27 20:14:01 +00003645 if (ino > sctx->cur_ino &&
3646 (parent_ino_before != parent_ino_after || len1 != len2 ||
3647 memcmp(path_before->start, path_after->start, len1))) {
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003648 ret = 1;
Filipe Mananaf9594922014-03-27 20:14:01 +00003649 break;
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003650 }
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003651 ino = parent_ino_after;
Filipe Mananabfa7e1f2014-03-19 14:20:54 +00003652 }
3653
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003654out:
3655 fs_path_free(path_before);
3656 fs_path_free(path_after);
3657
Filipe Mananaf9594922014-03-27 20:14:01 +00003658 if (ret == 1) {
3659 ret = add_pending_dir_move(sctx,
3660 sctx->cur_ino,
3661 sctx->cur_inode_gen,
3662 ino,
3663 &sctx->new_refs,
Filipe Manana84471e22015-02-28 22:29:22 +00003664 &sctx->deleted_refs,
Filipe Manana8b191a62015-04-09 14:09:14 +01003665 is_orphan);
Filipe Mananaf9594922014-03-27 20:14:01 +00003666 if (!ret)
3667 ret = 1;
3668 }
3669
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003670 return ret;
3671}
3672
Alexander Block31db9f72012-07-25 23:19:24 +02003673/*
3674 * This does all the move/link/unlink/rmdir magic.
3675 */
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00003676static int process_recorded_refs(struct send_ctx *sctx, int *pending_move)
Alexander Block31db9f72012-07-25 23:19:24 +02003677{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04003678 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02003679 int ret = 0;
3680 struct recorded_ref *cur;
Alexander Block1f4692d2012-07-28 10:42:24 +02003681 struct recorded_ref *cur2;
Josef Bacikba5e8f22013-08-16 16:52:55 -04003682 struct list_head check_dirs;
Alexander Block31db9f72012-07-25 23:19:24 +02003683 struct fs_path *valid_path = NULL;
Chris Masonb24baf62012-07-25 19:21:10 -04003684 u64 ow_inode = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02003685 u64 ow_gen;
3686 int did_overwrite = 0;
3687 int is_orphan = 0;
Filipe Manana29d6d302014-02-16 21:01:39 +00003688 u64 last_dir_ino_rm = 0;
Filipe Manana84471e22015-02-28 22:29:22 +00003689 bool can_rename = true;
Alexander Block31db9f72012-07-25 23:19:24 +02003690
Jeff Mahoney04ab9562016-09-20 10:05:03 -04003691 btrfs_debug(fs_info, "process_recorded_refs %llu", sctx->cur_ino);
Alexander Block31db9f72012-07-25 23:19:24 +02003692
Alexander Block6d85ed02012-08-01 14:48:59 +02003693 /*
3694 * This should never happen as the root dir always has the same ref
3695 * which is always '..'
3696 */
3697 BUG_ON(sctx->cur_ino <= BTRFS_FIRST_FREE_OBJECTID);
Josef Bacikba5e8f22013-08-16 16:52:55 -04003698 INIT_LIST_HEAD(&check_dirs);
Alexander Block6d85ed02012-08-01 14:48:59 +02003699
Tsutomu Itoh924794c2013-05-08 07:51:52 +00003700 valid_path = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02003701 if (!valid_path) {
3702 ret = -ENOMEM;
3703 goto out;
3704 }
3705
Alexander Block31db9f72012-07-25 23:19:24 +02003706 /*
3707 * First, check if the first ref of the current inode was overwritten
3708 * before. If yes, we know that the current inode was already orphanized
3709 * and thus use the orphan name. If not, we can use get_cur_path to
3710 * get the path of the first ref as it would like while receiving at
3711 * this point in time.
3712 * New inodes are always orphan at the beginning, so force to use the
3713 * orphan name in this case.
3714 * The first ref is stored in valid_path and will be updated if it
3715 * gets moved around.
3716 */
3717 if (!sctx->cur_inode_new) {
3718 ret = did_overwrite_first_ref(sctx, sctx->cur_ino,
3719 sctx->cur_inode_gen);
3720 if (ret < 0)
3721 goto out;
3722 if (ret)
3723 did_overwrite = 1;
3724 }
3725 if (sctx->cur_inode_new || did_overwrite) {
3726 ret = gen_unique_name(sctx, sctx->cur_ino,
3727 sctx->cur_inode_gen, valid_path);
3728 if (ret < 0)
3729 goto out;
3730 is_orphan = 1;
3731 } else {
3732 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen,
3733 valid_path);
3734 if (ret < 0)
3735 goto out;
3736 }
3737
3738 list_for_each_entry(cur, &sctx->new_refs, list) {
3739 /*
Alexander Block1f4692d2012-07-28 10:42:24 +02003740 * We may have refs where the parent directory does not exist
3741 * yet. This happens if the parent directories inum is higher
3742 * the the current inum. To handle this case, we create the
3743 * parent directory out of order. But we need to check if this
3744 * did already happen before due to other refs in the same dir.
3745 */
3746 ret = get_cur_inode_state(sctx, cur->dir, cur->dir_gen);
3747 if (ret < 0)
3748 goto out;
3749 if (ret == inode_state_will_create) {
3750 ret = 0;
3751 /*
3752 * First check if any of the current inodes refs did
3753 * already create the dir.
3754 */
3755 list_for_each_entry(cur2, &sctx->new_refs, list) {
3756 if (cur == cur2)
3757 break;
3758 if (cur2->dir == cur->dir) {
3759 ret = 1;
3760 break;
3761 }
3762 }
3763
3764 /*
3765 * If that did not happen, check if a previous inode
3766 * did already create the dir.
3767 */
3768 if (!ret)
3769 ret = did_create_dir(sctx, cur->dir);
3770 if (ret < 0)
3771 goto out;
3772 if (!ret) {
3773 ret = send_create_inode(sctx, cur->dir);
3774 if (ret < 0)
3775 goto out;
3776 }
3777 }
3778
3779 /*
Alexander Block31db9f72012-07-25 23:19:24 +02003780 * Check if this new ref would overwrite the first ref of
3781 * another unprocessed inode. If yes, orphanize the
3782 * overwritten inode. If we find an overwritten ref that is
3783 * not the first ref, simply unlink it.
3784 */
3785 ret = will_overwrite_ref(sctx, cur->dir, cur->dir_gen,
3786 cur->name, cur->name_len,
3787 &ow_inode, &ow_gen);
3788 if (ret < 0)
3789 goto out;
3790 if (ret) {
Tsutomu Itoh924794c2013-05-08 07:51:52 +00003791 ret = is_first_ref(sctx->parent_root,
3792 ow_inode, cur->dir, cur->name,
3793 cur->name_len);
Alexander Block31db9f72012-07-25 23:19:24 +02003794 if (ret < 0)
3795 goto out;
3796 if (ret) {
Filipe Manana8996a482015-03-12 15:16:20 +00003797 struct name_cache_entry *nce;
Robbie Ko801bec32015-06-23 18:39:46 +08003798 struct waiting_dir_move *wdm;
Filipe Manana8996a482015-03-12 15:16:20 +00003799
Alexander Block31db9f72012-07-25 23:19:24 +02003800 ret = orphanize_inode(sctx, ow_inode, ow_gen,
3801 cur->full_path);
3802 if (ret < 0)
3803 goto out;
Robbie Ko801bec32015-06-23 18:39:46 +08003804
3805 /*
3806 * If ow_inode has its rename operation delayed
3807 * make sure that its orphanized name is used in
3808 * the source path when performing its rename
3809 * operation.
3810 */
3811 if (is_waiting_for_move(sctx, ow_inode)) {
3812 wdm = get_waiting_dir_move(sctx,
3813 ow_inode);
3814 ASSERT(wdm);
3815 wdm->orphanized = true;
3816 }
3817
Filipe Manana8996a482015-03-12 15:16:20 +00003818 /*
3819 * Make sure we clear our orphanized inode's
3820 * name from the name cache. This is because the
3821 * inode ow_inode might be an ancestor of some
3822 * other inode that will be orphanized as well
3823 * later and has an inode number greater than
3824 * sctx->send_progress. We need to prevent
3825 * future name lookups from using the old name
3826 * and get instead the orphan name.
3827 */
3828 nce = name_cache_search(sctx, ow_inode, ow_gen);
3829 if (nce) {
3830 name_cache_delete(sctx, nce);
3831 kfree(nce);
3832 }
Robbie Ko801bec32015-06-23 18:39:46 +08003833
3834 /*
3835 * ow_inode might currently be an ancestor of
3836 * cur_ino, therefore compute valid_path (the
3837 * current path of cur_ino) again because it
3838 * might contain the pre-orphanization name of
3839 * ow_inode, which is no longer valid.
3840 */
3841 fs_path_reset(valid_path);
3842 ret = get_cur_path(sctx, sctx->cur_ino,
3843 sctx->cur_inode_gen, valid_path);
3844 if (ret < 0)
3845 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02003846 } else {
3847 ret = send_unlink(sctx, cur->full_path);
3848 if (ret < 0)
3849 goto out;
3850 }
3851 }
3852
Filipe Manana84471e22015-02-28 22:29:22 +00003853 if (S_ISDIR(sctx->cur_inode_mode) && sctx->parent_root) {
3854 ret = wait_for_dest_dir_move(sctx, cur, is_orphan);
3855 if (ret < 0)
3856 goto out;
3857 if (ret == 1) {
3858 can_rename = false;
3859 *pending_move = 1;
3860 }
3861 }
3862
Filipe Manana8b191a62015-04-09 14:09:14 +01003863 if (S_ISDIR(sctx->cur_inode_mode) && sctx->parent_root &&
3864 can_rename) {
3865 ret = wait_for_parent_move(sctx, cur, is_orphan);
3866 if (ret < 0)
3867 goto out;
3868 if (ret == 1) {
3869 can_rename = false;
3870 *pending_move = 1;
3871 }
3872 }
3873
Alexander Block31db9f72012-07-25 23:19:24 +02003874 /*
3875 * link/move the ref to the new place. If we have an orphan
3876 * inode, move it and update valid_path. If not, link or move
3877 * it depending on the inode mode.
3878 */
Filipe Manana84471e22015-02-28 22:29:22 +00003879 if (is_orphan && can_rename) {
Alexander Block31db9f72012-07-25 23:19:24 +02003880 ret = send_rename(sctx, valid_path, cur->full_path);
3881 if (ret < 0)
3882 goto out;
3883 is_orphan = 0;
3884 ret = fs_path_copy(valid_path, cur->full_path);
3885 if (ret < 0)
3886 goto out;
Filipe Manana84471e22015-02-28 22:29:22 +00003887 } else if (can_rename) {
Alexander Block31db9f72012-07-25 23:19:24 +02003888 if (S_ISDIR(sctx->cur_inode_mode)) {
3889 /*
3890 * Dirs can't be linked, so move it. For moved
3891 * dirs, we always have one new and one deleted
3892 * ref. The deleted ref is ignored later.
3893 */
Filipe Manana8b191a62015-04-09 14:09:14 +01003894 ret = send_rename(sctx, valid_path,
3895 cur->full_path);
3896 if (!ret)
3897 ret = fs_path_copy(valid_path,
3898 cur->full_path);
Alexander Block31db9f72012-07-25 23:19:24 +02003899 if (ret < 0)
3900 goto out;
3901 } else {
3902 ret = send_link(sctx, cur->full_path,
3903 valid_path);
3904 if (ret < 0)
3905 goto out;
3906 }
3907 }
Josef Bacikba5e8f22013-08-16 16:52:55 -04003908 ret = dup_ref(cur, &check_dirs);
Alexander Block31db9f72012-07-25 23:19:24 +02003909 if (ret < 0)
3910 goto out;
3911 }
3912
3913 if (S_ISDIR(sctx->cur_inode_mode) && sctx->cur_inode_deleted) {
3914 /*
3915 * Check if we can already rmdir the directory. If not,
3916 * orphanize it. For every dir item inside that gets deleted
3917 * later, we do this check again and rmdir it then if possible.
3918 * See the use of check_dirs for more details.
3919 */
Filipe Manana9dc44212014-02-19 14:31:44 +00003920 ret = can_rmdir(sctx, sctx->cur_ino, sctx->cur_inode_gen,
3921 sctx->cur_ino);
Alexander Block31db9f72012-07-25 23:19:24 +02003922 if (ret < 0)
3923 goto out;
3924 if (ret) {
3925 ret = send_rmdir(sctx, valid_path);
3926 if (ret < 0)
3927 goto out;
3928 } else if (!is_orphan) {
3929 ret = orphanize_inode(sctx, sctx->cur_ino,
3930 sctx->cur_inode_gen, valid_path);
3931 if (ret < 0)
3932 goto out;
3933 is_orphan = 1;
3934 }
3935
3936 list_for_each_entry(cur, &sctx->deleted_refs, list) {
Josef Bacikba5e8f22013-08-16 16:52:55 -04003937 ret = dup_ref(cur, &check_dirs);
Alexander Block31db9f72012-07-25 23:19:24 +02003938 if (ret < 0)
3939 goto out;
3940 }
Alexander Blockccf16262012-07-28 11:46:29 +02003941 } else if (S_ISDIR(sctx->cur_inode_mode) &&
3942 !list_empty(&sctx->deleted_refs)) {
3943 /*
3944 * We have a moved dir. Add the old parent to check_dirs
3945 */
3946 cur = list_entry(sctx->deleted_refs.next, struct recorded_ref,
3947 list);
Josef Bacikba5e8f22013-08-16 16:52:55 -04003948 ret = dup_ref(cur, &check_dirs);
Alexander Blockccf16262012-07-28 11:46:29 +02003949 if (ret < 0)
3950 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02003951 } else if (!S_ISDIR(sctx->cur_inode_mode)) {
3952 /*
3953 * We have a non dir inode. Go through all deleted refs and
3954 * unlink them if they were not already overwritten by other
3955 * inodes.
3956 */
3957 list_for_each_entry(cur, &sctx->deleted_refs, list) {
3958 ret = did_overwrite_ref(sctx, cur->dir, cur->dir_gen,
3959 sctx->cur_ino, sctx->cur_inode_gen,
3960 cur->name, cur->name_len);
3961 if (ret < 0)
3962 goto out;
3963 if (!ret) {
Alexander Block1f4692d2012-07-28 10:42:24 +02003964 ret = send_unlink(sctx, cur->full_path);
3965 if (ret < 0)
3966 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02003967 }
Josef Bacikba5e8f22013-08-16 16:52:55 -04003968 ret = dup_ref(cur, &check_dirs);
Alexander Block31db9f72012-07-25 23:19:24 +02003969 if (ret < 0)
3970 goto out;
3971 }
Alexander Block31db9f72012-07-25 23:19:24 +02003972 /*
3973 * If the inode is still orphan, unlink the orphan. This may
3974 * happen when a previous inode did overwrite the first ref
3975 * of this inode and no new refs were added for the current
Alexander Block766702e2012-07-28 14:11:31 +02003976 * inode. Unlinking does not mean that the inode is deleted in
3977 * all cases. There may still be links to this inode in other
3978 * places.
Alexander Block31db9f72012-07-25 23:19:24 +02003979 */
Alexander Block1f4692d2012-07-28 10:42:24 +02003980 if (is_orphan) {
Alexander Block31db9f72012-07-25 23:19:24 +02003981 ret = send_unlink(sctx, valid_path);
3982 if (ret < 0)
3983 goto out;
3984 }
3985 }
3986
3987 /*
3988 * We did collect all parent dirs where cur_inode was once located. We
3989 * now go through all these dirs and check if they are pending for
3990 * deletion and if it's finally possible to perform the rmdir now.
3991 * We also update the inode stats of the parent dirs here.
3992 */
Josef Bacikba5e8f22013-08-16 16:52:55 -04003993 list_for_each_entry(cur, &check_dirs, list) {
Alexander Block766702e2012-07-28 14:11:31 +02003994 /*
3995 * In case we had refs into dirs that were not processed yet,
3996 * we don't need to do the utime and rmdir logic for these dirs.
3997 * The dir will be processed later.
3998 */
Josef Bacikba5e8f22013-08-16 16:52:55 -04003999 if (cur->dir > sctx->cur_ino)
Alexander Block31db9f72012-07-25 23:19:24 +02004000 continue;
4001
Josef Bacikba5e8f22013-08-16 16:52:55 -04004002 ret = get_cur_inode_state(sctx, cur->dir, cur->dir_gen);
Alexander Block31db9f72012-07-25 23:19:24 +02004003 if (ret < 0)
4004 goto out;
4005
4006 if (ret == inode_state_did_create ||
4007 ret == inode_state_no_change) {
4008 /* TODO delayed utimes */
Josef Bacikba5e8f22013-08-16 16:52:55 -04004009 ret = send_utimes(sctx, cur->dir, cur->dir_gen);
Alexander Block31db9f72012-07-25 23:19:24 +02004010 if (ret < 0)
4011 goto out;
Filipe Manana29d6d302014-02-16 21:01:39 +00004012 } else if (ret == inode_state_did_delete &&
4013 cur->dir != last_dir_ino_rm) {
Filipe Manana9dc44212014-02-19 14:31:44 +00004014 ret = can_rmdir(sctx, cur->dir, cur->dir_gen,
4015 sctx->cur_ino);
Alexander Block31db9f72012-07-25 23:19:24 +02004016 if (ret < 0)
4017 goto out;
4018 if (ret) {
Josef Bacikba5e8f22013-08-16 16:52:55 -04004019 ret = get_cur_path(sctx, cur->dir,
4020 cur->dir_gen, valid_path);
Alexander Block31db9f72012-07-25 23:19:24 +02004021 if (ret < 0)
4022 goto out;
4023 ret = send_rmdir(sctx, valid_path);
4024 if (ret < 0)
4025 goto out;
Filipe Manana29d6d302014-02-16 21:01:39 +00004026 last_dir_ino_rm = cur->dir;
Alexander Block31db9f72012-07-25 23:19:24 +02004027 }
4028 }
4029 }
4030
Alexander Block31db9f72012-07-25 23:19:24 +02004031 ret = 0;
4032
4033out:
Josef Bacikba5e8f22013-08-16 16:52:55 -04004034 __free_recorded_refs(&check_dirs);
Alexander Block31db9f72012-07-25 23:19:24 +02004035 free_recorded_refs(sctx);
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004036 fs_path_free(valid_path);
Alexander Block31db9f72012-07-25 23:19:24 +02004037 return ret;
4038}
4039
Liu Boa4d96d62014-03-03 21:31:03 +08004040static int record_ref(struct btrfs_root *root, int num, u64 dir, int index,
4041 struct fs_path *name, void *ctx, struct list_head *refs)
Alexander Block31db9f72012-07-25 23:19:24 +02004042{
4043 int ret = 0;
4044 struct send_ctx *sctx = ctx;
4045 struct fs_path *p;
4046 u64 gen;
4047
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004048 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02004049 if (!p)
4050 return -ENOMEM;
4051
Liu Boa4d96d62014-03-03 21:31:03 +08004052 ret = get_inode_info(root, dir, NULL, &gen, NULL, NULL,
Alexander Block85a7b332012-07-26 23:39:10 +02004053 NULL, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02004054 if (ret < 0)
4055 goto out;
4056
Alexander Block31db9f72012-07-25 23:19:24 +02004057 ret = get_cur_path(sctx, dir, gen, p);
4058 if (ret < 0)
4059 goto out;
4060 ret = fs_path_add_path(p, name);
4061 if (ret < 0)
4062 goto out;
4063
Liu Boa4d96d62014-03-03 21:31:03 +08004064 ret = __record_ref(refs, dir, gen, p);
Alexander Block31db9f72012-07-25 23:19:24 +02004065
4066out:
4067 if (ret)
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004068 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02004069 return ret;
4070}
4071
Liu Boa4d96d62014-03-03 21:31:03 +08004072static int __record_new_ref(int num, u64 dir, int index,
4073 struct fs_path *name,
4074 void *ctx)
4075{
4076 struct send_ctx *sctx = ctx;
4077 return record_ref(sctx->send_root, num, dir, index, name,
4078 ctx, &sctx->new_refs);
4079}
4080
4081
Alexander Block31db9f72012-07-25 23:19:24 +02004082static int __record_deleted_ref(int num, u64 dir, int index,
4083 struct fs_path *name,
4084 void *ctx)
4085{
Alexander Block31db9f72012-07-25 23:19:24 +02004086 struct send_ctx *sctx = ctx;
Liu Boa4d96d62014-03-03 21:31:03 +08004087 return record_ref(sctx->parent_root, num, dir, index, name,
4088 ctx, &sctx->deleted_refs);
Alexander Block31db9f72012-07-25 23:19:24 +02004089}
4090
4091static int record_new_ref(struct send_ctx *sctx)
4092{
4093 int ret;
4094
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004095 ret = iterate_inode_ref(sctx->send_root, sctx->left_path,
4096 sctx->cmp_key, 0, __record_new_ref, sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004097 if (ret < 0)
4098 goto out;
4099 ret = 0;
4100
4101out:
4102 return ret;
4103}
4104
4105static int record_deleted_ref(struct send_ctx *sctx)
4106{
4107 int ret;
4108
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004109 ret = iterate_inode_ref(sctx->parent_root, sctx->right_path,
4110 sctx->cmp_key, 0, __record_deleted_ref, sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004111 if (ret < 0)
4112 goto out;
4113 ret = 0;
4114
4115out:
4116 return ret;
4117}
4118
4119struct find_ref_ctx {
4120 u64 dir;
Josef Bacikba5e8f22013-08-16 16:52:55 -04004121 u64 dir_gen;
4122 struct btrfs_root *root;
Alexander Block31db9f72012-07-25 23:19:24 +02004123 struct fs_path *name;
4124 int found_idx;
4125};
4126
4127static int __find_iref(int num, u64 dir, int index,
4128 struct fs_path *name,
4129 void *ctx_)
4130{
4131 struct find_ref_ctx *ctx = ctx_;
Josef Bacikba5e8f22013-08-16 16:52:55 -04004132 u64 dir_gen;
4133 int ret;
Alexander Block31db9f72012-07-25 23:19:24 +02004134
4135 if (dir == ctx->dir && fs_path_len(name) == fs_path_len(ctx->name) &&
4136 strncmp(name->start, ctx->name->start, fs_path_len(name)) == 0) {
Josef Bacikba5e8f22013-08-16 16:52:55 -04004137 /*
4138 * To avoid doing extra lookups we'll only do this if everything
4139 * else matches.
4140 */
4141 ret = get_inode_info(ctx->root, dir, NULL, &dir_gen, NULL,
4142 NULL, NULL, NULL);
4143 if (ret)
4144 return ret;
4145 if (dir_gen != ctx->dir_gen)
4146 return 0;
Alexander Block31db9f72012-07-25 23:19:24 +02004147 ctx->found_idx = num;
4148 return 1;
4149 }
4150 return 0;
4151}
4152
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004153static int find_iref(struct btrfs_root *root,
Alexander Block31db9f72012-07-25 23:19:24 +02004154 struct btrfs_path *path,
4155 struct btrfs_key *key,
Josef Bacikba5e8f22013-08-16 16:52:55 -04004156 u64 dir, u64 dir_gen, struct fs_path *name)
Alexander Block31db9f72012-07-25 23:19:24 +02004157{
4158 int ret;
4159 struct find_ref_ctx ctx;
4160
4161 ctx.dir = dir;
4162 ctx.name = name;
Josef Bacikba5e8f22013-08-16 16:52:55 -04004163 ctx.dir_gen = dir_gen;
Alexander Block31db9f72012-07-25 23:19:24 +02004164 ctx.found_idx = -1;
Josef Bacikba5e8f22013-08-16 16:52:55 -04004165 ctx.root = root;
Alexander Block31db9f72012-07-25 23:19:24 +02004166
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004167 ret = iterate_inode_ref(root, path, key, 0, __find_iref, &ctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004168 if (ret < 0)
4169 return ret;
4170
4171 if (ctx.found_idx == -1)
4172 return -ENOENT;
4173
4174 return ctx.found_idx;
4175}
4176
4177static int __record_changed_new_ref(int num, u64 dir, int index,
4178 struct fs_path *name,
4179 void *ctx)
4180{
Josef Bacikba5e8f22013-08-16 16:52:55 -04004181 u64 dir_gen;
Alexander Block31db9f72012-07-25 23:19:24 +02004182 int ret;
4183 struct send_ctx *sctx = ctx;
4184
Josef Bacikba5e8f22013-08-16 16:52:55 -04004185 ret = get_inode_info(sctx->send_root, dir, NULL, &dir_gen, NULL,
4186 NULL, NULL, NULL);
4187 if (ret)
4188 return ret;
4189
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004190 ret = find_iref(sctx->parent_root, sctx->right_path,
Josef Bacikba5e8f22013-08-16 16:52:55 -04004191 sctx->cmp_key, dir, dir_gen, name);
Alexander Block31db9f72012-07-25 23:19:24 +02004192 if (ret == -ENOENT)
4193 ret = __record_new_ref(num, dir, index, name, sctx);
4194 else if (ret > 0)
4195 ret = 0;
4196
4197 return ret;
4198}
4199
4200static int __record_changed_deleted_ref(int num, u64 dir, int index,
4201 struct fs_path *name,
4202 void *ctx)
4203{
Josef Bacikba5e8f22013-08-16 16:52:55 -04004204 u64 dir_gen;
Alexander Block31db9f72012-07-25 23:19:24 +02004205 int ret;
4206 struct send_ctx *sctx = ctx;
4207
Josef Bacikba5e8f22013-08-16 16:52:55 -04004208 ret = get_inode_info(sctx->parent_root, dir, NULL, &dir_gen, NULL,
4209 NULL, NULL, NULL);
4210 if (ret)
4211 return ret;
4212
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004213 ret = find_iref(sctx->send_root, sctx->left_path, sctx->cmp_key,
Josef Bacikba5e8f22013-08-16 16:52:55 -04004214 dir, dir_gen, name);
Alexander Block31db9f72012-07-25 23:19:24 +02004215 if (ret == -ENOENT)
4216 ret = __record_deleted_ref(num, dir, index, name, sctx);
4217 else if (ret > 0)
4218 ret = 0;
4219
4220 return ret;
4221}
4222
4223static int record_changed_ref(struct send_ctx *sctx)
4224{
4225 int ret = 0;
4226
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004227 ret = iterate_inode_ref(sctx->send_root, sctx->left_path,
Alexander Block31db9f72012-07-25 23:19:24 +02004228 sctx->cmp_key, 0, __record_changed_new_ref, sctx);
4229 if (ret < 0)
4230 goto out;
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004231 ret = iterate_inode_ref(sctx->parent_root, sctx->right_path,
Alexander Block31db9f72012-07-25 23:19:24 +02004232 sctx->cmp_key, 0, __record_changed_deleted_ref, sctx);
4233 if (ret < 0)
4234 goto out;
4235 ret = 0;
4236
4237out:
4238 return ret;
4239}
4240
4241/*
4242 * Record and process all refs at once. Needed when an inode changes the
4243 * generation number, which means that it was deleted and recreated.
4244 */
4245static int process_all_refs(struct send_ctx *sctx,
4246 enum btrfs_compare_tree_result cmd)
4247{
4248 int ret;
4249 struct btrfs_root *root;
4250 struct btrfs_path *path;
4251 struct btrfs_key key;
4252 struct btrfs_key found_key;
4253 struct extent_buffer *eb;
4254 int slot;
4255 iterate_inode_ref_t cb;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00004256 int pending_move = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02004257
4258 path = alloc_path_for_send();
4259 if (!path)
4260 return -ENOMEM;
4261
4262 if (cmd == BTRFS_COMPARE_TREE_NEW) {
4263 root = sctx->send_root;
4264 cb = __record_new_ref;
4265 } else if (cmd == BTRFS_COMPARE_TREE_DELETED) {
4266 root = sctx->parent_root;
4267 cb = __record_deleted_ref;
4268 } else {
David Sterba4d1a63b2014-02-03 19:24:19 +01004269 btrfs_err(sctx->send_root->fs_info,
4270 "Wrong command %d in process_all_refs", cmd);
4271 ret = -EINVAL;
4272 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02004273 }
4274
4275 key.objectid = sctx->cmp_key->objectid;
4276 key.type = BTRFS_INODE_REF_KEY;
4277 key.offset = 0;
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004278 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
4279 if (ret < 0)
4280 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02004281
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004282 while (1) {
Alexander Block31db9f72012-07-25 23:19:24 +02004283 eb = path->nodes[0];
4284 slot = path->slots[0];
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004285 if (slot >= btrfs_header_nritems(eb)) {
4286 ret = btrfs_next_leaf(root, path);
4287 if (ret < 0)
4288 goto out;
4289 else if (ret > 0)
4290 break;
4291 continue;
4292 }
4293
Alexander Block31db9f72012-07-25 23:19:24 +02004294 btrfs_item_key_to_cpu(eb, &found_key, slot);
4295
4296 if (found_key.objectid != key.objectid ||
Jan Schmidt96b5bd72012-10-15 08:30:45 +00004297 (found_key.type != BTRFS_INODE_REF_KEY &&
4298 found_key.type != BTRFS_INODE_EXTREF_KEY))
Alexander Block31db9f72012-07-25 23:19:24 +02004299 break;
Alexander Block31db9f72012-07-25 23:19:24 +02004300
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004301 ret = iterate_inode_ref(root, path, &found_key, 0, cb, sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004302 if (ret < 0)
4303 goto out;
4304
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004305 path->slots[0]++;
Alexander Block31db9f72012-07-25 23:19:24 +02004306 }
Alexander Blocke938c8a2012-07-28 16:33:49 +02004307 btrfs_release_path(path);
Alexander Block31db9f72012-07-25 23:19:24 +02004308
Josef Bacik3dc09ec2016-08-24 11:57:52 -04004309 /*
4310 * We don't actually care about pending_move as we are simply
4311 * re-creating this inode and will be rename'ing it into place once we
4312 * rename the parent directory.
4313 */
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00004314 ret = process_recorded_refs(sctx, &pending_move);
Alexander Block31db9f72012-07-25 23:19:24 +02004315out:
4316 btrfs_free_path(path);
4317 return ret;
4318}
4319
4320static int send_set_xattr(struct send_ctx *sctx,
4321 struct fs_path *path,
4322 const char *name, int name_len,
4323 const char *data, int data_len)
4324{
4325 int ret = 0;
4326
4327 ret = begin_cmd(sctx, BTRFS_SEND_C_SET_XATTR);
4328 if (ret < 0)
4329 goto out;
4330
4331 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, path);
4332 TLV_PUT_STRING(sctx, BTRFS_SEND_A_XATTR_NAME, name, name_len);
4333 TLV_PUT(sctx, BTRFS_SEND_A_XATTR_DATA, data, data_len);
4334
4335 ret = send_cmd(sctx);
4336
4337tlv_put_failure:
4338out:
4339 return ret;
4340}
4341
4342static int send_remove_xattr(struct send_ctx *sctx,
4343 struct fs_path *path,
4344 const char *name, int name_len)
4345{
4346 int ret = 0;
4347
4348 ret = begin_cmd(sctx, BTRFS_SEND_C_REMOVE_XATTR);
4349 if (ret < 0)
4350 goto out;
4351
4352 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, path);
4353 TLV_PUT_STRING(sctx, BTRFS_SEND_A_XATTR_NAME, name, name_len);
4354
4355 ret = send_cmd(sctx);
4356
4357tlv_put_failure:
4358out:
4359 return ret;
4360}
4361
4362static int __process_new_xattr(int num, struct btrfs_key *di_key,
4363 const char *name, int name_len,
4364 const char *data, int data_len,
4365 u8 type, void *ctx)
4366{
4367 int ret;
4368 struct send_ctx *sctx = ctx;
4369 struct fs_path *p;
Andreas Gruenbacher2211d5b2016-09-27 13:03:22 +02004370 struct posix_acl_xattr_header dummy_acl;
Alexander Block31db9f72012-07-25 23:19:24 +02004371
Marcos Paulo de Souza9e36fae2020-05-10 23:15:07 -03004372 /* Capabilities are emitted by finish_inode_if_needed */
4373 if (!strncmp(name, XATTR_NAME_CAPS, name_len))
4374 return 0;
4375
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004376 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02004377 if (!p)
4378 return -ENOMEM;
4379
4380 /*
Nicholas D Steeves01327612016-05-19 21:18:45 -04004381 * This hack is needed because empty acls are stored as zero byte
Alexander Block31db9f72012-07-25 23:19:24 +02004382 * data in xattrs. Problem with that is, that receiving these zero byte
Nicholas D Steeves01327612016-05-19 21:18:45 -04004383 * acls will fail later. To fix this, we send a dummy acl list that
Alexander Block31db9f72012-07-25 23:19:24 +02004384 * only contains the version number and no entries.
4385 */
4386 if (!strncmp(name, XATTR_NAME_POSIX_ACL_ACCESS, name_len) ||
4387 !strncmp(name, XATTR_NAME_POSIX_ACL_DEFAULT, name_len)) {
4388 if (data_len == 0) {
4389 dummy_acl.a_version =
4390 cpu_to_le32(POSIX_ACL_XATTR_VERSION);
4391 data = (char *)&dummy_acl;
4392 data_len = sizeof(dummy_acl);
4393 }
4394 }
4395
4396 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p);
4397 if (ret < 0)
4398 goto out;
4399
4400 ret = send_set_xattr(sctx, p, name, name_len, data, data_len);
4401
4402out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004403 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02004404 return ret;
4405}
4406
4407static int __process_deleted_xattr(int num, struct btrfs_key *di_key,
4408 const char *name, int name_len,
4409 const char *data, int data_len,
4410 u8 type, void *ctx)
4411{
4412 int ret;
4413 struct send_ctx *sctx = ctx;
4414 struct fs_path *p;
4415
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004416 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02004417 if (!p)
4418 return -ENOMEM;
4419
4420 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p);
4421 if (ret < 0)
4422 goto out;
4423
4424 ret = send_remove_xattr(sctx, p, name, name_len);
4425
4426out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004427 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02004428 return ret;
4429}
4430
4431static int process_new_xattr(struct send_ctx *sctx)
4432{
4433 int ret = 0;
4434
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004435 ret = iterate_dir_item(sctx->send_root, sctx->left_path,
4436 sctx->cmp_key, __process_new_xattr, sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004437
4438 return ret;
4439}
4440
4441static int process_deleted_xattr(struct send_ctx *sctx)
4442{
Masahiro Yamadae2c89902016-09-13 04:35:52 +09004443 return iterate_dir_item(sctx->parent_root, sctx->right_path,
4444 sctx->cmp_key, __process_deleted_xattr, sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004445}
4446
4447struct find_xattr_ctx {
4448 const char *name;
4449 int name_len;
4450 int found_idx;
4451 char *found_data;
4452 int found_data_len;
4453};
4454
4455static int __find_xattr(int num, struct btrfs_key *di_key,
4456 const char *name, int name_len,
4457 const char *data, int data_len,
4458 u8 type, void *vctx)
4459{
4460 struct find_xattr_ctx *ctx = vctx;
4461
4462 if (name_len == ctx->name_len &&
4463 strncmp(name, ctx->name, name_len) == 0) {
4464 ctx->found_idx = num;
4465 ctx->found_data_len = data_len;
David Sterbae780b0d2016-01-18 18:42:13 +01004466 ctx->found_data = kmemdup(data, data_len, GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +02004467 if (!ctx->found_data)
4468 return -ENOMEM;
Alexander Block31db9f72012-07-25 23:19:24 +02004469 return 1;
4470 }
4471 return 0;
4472}
4473
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004474static int find_xattr(struct btrfs_root *root,
Alexander Block31db9f72012-07-25 23:19:24 +02004475 struct btrfs_path *path,
4476 struct btrfs_key *key,
4477 const char *name, int name_len,
4478 char **data, int *data_len)
4479{
4480 int ret;
4481 struct find_xattr_ctx ctx;
4482
4483 ctx.name = name;
4484 ctx.name_len = name_len;
4485 ctx.found_idx = -1;
4486 ctx.found_data = NULL;
4487 ctx.found_data_len = 0;
4488
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004489 ret = iterate_dir_item(root, path, key, __find_xattr, &ctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004490 if (ret < 0)
4491 return ret;
4492
4493 if (ctx.found_idx == -1)
4494 return -ENOENT;
4495 if (data) {
4496 *data = ctx.found_data;
4497 *data_len = ctx.found_data_len;
4498 } else {
4499 kfree(ctx.found_data);
4500 }
4501 return ctx.found_idx;
4502}
4503
4504
4505static int __process_changed_new_xattr(int num, struct btrfs_key *di_key,
4506 const char *name, int name_len,
4507 const char *data, int data_len,
4508 u8 type, void *ctx)
4509{
4510 int ret;
4511 struct send_ctx *sctx = ctx;
4512 char *found_data = NULL;
4513 int found_data_len = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02004514
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004515 ret = find_xattr(sctx->parent_root, sctx->right_path,
4516 sctx->cmp_key, name, name_len, &found_data,
4517 &found_data_len);
Alexander Block31db9f72012-07-25 23:19:24 +02004518 if (ret == -ENOENT) {
4519 ret = __process_new_xattr(num, di_key, name, name_len, data,
4520 data_len, type, ctx);
4521 } else if (ret >= 0) {
4522 if (data_len != found_data_len ||
4523 memcmp(data, found_data, data_len)) {
4524 ret = __process_new_xattr(num, di_key, name, name_len,
4525 data, data_len, type, ctx);
4526 } else {
4527 ret = 0;
4528 }
4529 }
4530
4531 kfree(found_data);
Alexander Block31db9f72012-07-25 23:19:24 +02004532 return ret;
4533}
4534
4535static int __process_changed_deleted_xattr(int num, struct btrfs_key *di_key,
4536 const char *name, int name_len,
4537 const char *data, int data_len,
4538 u8 type, void *ctx)
4539{
4540 int ret;
4541 struct send_ctx *sctx = ctx;
4542
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004543 ret = find_xattr(sctx->send_root, sctx->left_path, sctx->cmp_key,
4544 name, name_len, NULL, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02004545 if (ret == -ENOENT)
4546 ret = __process_deleted_xattr(num, di_key, name, name_len, data,
4547 data_len, type, ctx);
4548 else if (ret >= 0)
4549 ret = 0;
4550
4551 return ret;
4552}
4553
4554static int process_changed_xattr(struct send_ctx *sctx)
4555{
4556 int ret = 0;
4557
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004558 ret = iterate_dir_item(sctx->send_root, sctx->left_path,
Alexander Block31db9f72012-07-25 23:19:24 +02004559 sctx->cmp_key, __process_changed_new_xattr, sctx);
4560 if (ret < 0)
4561 goto out;
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004562 ret = iterate_dir_item(sctx->parent_root, sctx->right_path,
Alexander Block31db9f72012-07-25 23:19:24 +02004563 sctx->cmp_key, __process_changed_deleted_xattr, sctx);
4564
4565out:
4566 return ret;
4567}
4568
4569static int process_all_new_xattrs(struct send_ctx *sctx)
4570{
4571 int ret;
4572 struct btrfs_root *root;
4573 struct btrfs_path *path;
4574 struct btrfs_key key;
4575 struct btrfs_key found_key;
4576 struct extent_buffer *eb;
4577 int slot;
4578
4579 path = alloc_path_for_send();
4580 if (!path)
4581 return -ENOMEM;
4582
4583 root = sctx->send_root;
4584
4585 key.objectid = sctx->cmp_key->objectid;
4586 key.type = BTRFS_XATTR_ITEM_KEY;
4587 key.offset = 0;
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004588 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
4589 if (ret < 0)
4590 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02004591
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004592 while (1) {
Alexander Block31db9f72012-07-25 23:19:24 +02004593 eb = path->nodes[0];
4594 slot = path->slots[0];
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004595 if (slot >= btrfs_header_nritems(eb)) {
4596 ret = btrfs_next_leaf(root, path);
4597 if (ret < 0) {
4598 goto out;
4599 } else if (ret > 0) {
4600 ret = 0;
4601 break;
4602 }
4603 continue;
4604 }
Alexander Block31db9f72012-07-25 23:19:24 +02004605
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004606 btrfs_item_key_to_cpu(eb, &found_key, slot);
Alexander Block31db9f72012-07-25 23:19:24 +02004607 if (found_key.objectid != key.objectid ||
4608 found_key.type != key.type) {
4609 ret = 0;
4610 goto out;
4611 }
4612
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004613 ret = iterate_dir_item(root, path, &found_key,
4614 __process_new_xattr, sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02004615 if (ret < 0)
4616 goto out;
4617
Filipe David Borba Mananadff6d0a2014-02-05 16:48:56 +00004618 path->slots[0]++;
Alexander Block31db9f72012-07-25 23:19:24 +02004619 }
4620
4621out:
4622 btrfs_free_path(path);
4623 return ret;
4624}
4625
Josef Baciked259092013-10-25 11:36:01 -04004626static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len)
4627{
4628 struct btrfs_root *root = sctx->send_root;
4629 struct btrfs_fs_info *fs_info = root->fs_info;
4630 struct inode *inode;
4631 struct page *page;
4632 char *addr;
4633 struct btrfs_key key;
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03004634 pgoff_t index = offset >> PAGE_SHIFT;
Josef Baciked259092013-10-25 11:36:01 -04004635 pgoff_t last_index;
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03004636 unsigned pg_offset = offset & ~PAGE_MASK;
Josef Baciked259092013-10-25 11:36:01 -04004637 ssize_t ret = 0;
4638
4639 key.objectid = sctx->cur_ino;
4640 key.type = BTRFS_INODE_ITEM_KEY;
4641 key.offset = 0;
4642
4643 inode = btrfs_iget(fs_info->sb, &key, root, NULL);
4644 if (IS_ERR(inode))
4645 return PTR_ERR(inode);
4646
4647 if (offset + len > i_size_read(inode)) {
4648 if (offset > i_size_read(inode))
4649 len = 0;
4650 else
4651 len = offset - i_size_read(inode);
4652 }
4653 if (len == 0)
4654 goto out;
4655
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03004656 last_index = (offset + len - 1) >> PAGE_SHIFT;
Liu Bo2131bcd32014-03-05 10:07:35 +08004657
4658 /* initial readahead */
4659 memset(&sctx->ra, 0, sizeof(struct file_ra_state));
4660 file_ra_state_init(&sctx->ra, inode->i_mapping);
4661 btrfs_force_ra(inode->i_mapping, &sctx->ra, NULL, index,
4662 last_index - index + 1);
4663
Josef Baciked259092013-10-25 11:36:01 -04004664 while (index <= last_index) {
4665 unsigned cur_len = min_t(unsigned, len,
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03004666 PAGE_SIZE - pg_offset);
David Sterbae780b0d2016-01-18 18:42:13 +01004667 page = find_or_create_page(inode->i_mapping, index, GFP_KERNEL);
Josef Baciked259092013-10-25 11:36:01 -04004668 if (!page) {
4669 ret = -ENOMEM;
4670 break;
4671 }
4672
4673 if (!PageUptodate(page)) {
4674 btrfs_readpage(NULL, page);
4675 lock_page(page);
4676 if (!PageUptodate(page)) {
4677 unlock_page(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03004678 put_page(page);
Josef Baciked259092013-10-25 11:36:01 -04004679 ret = -EIO;
4680 break;
4681 }
4682 }
4683
4684 addr = kmap(page);
4685 memcpy(sctx->read_buf + ret, addr + pg_offset, cur_len);
4686 kunmap(page);
4687 unlock_page(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03004688 put_page(page);
Josef Baciked259092013-10-25 11:36:01 -04004689 index++;
4690 pg_offset = 0;
4691 len -= cur_len;
4692 ret += cur_len;
4693 }
4694out:
4695 iput(inode);
4696 return ret;
4697}
4698
Alexander Block31db9f72012-07-25 23:19:24 +02004699/*
4700 * Read some bytes from the current inode/file and send a write command to
4701 * user space.
4702 */
4703static int send_write(struct send_ctx *sctx, u64 offset, u32 len)
4704{
Jeff Mahoney04ab9562016-09-20 10:05:03 -04004705 struct btrfs_fs_info *fs_info = sctx->send_root->fs_info;
Alexander Block31db9f72012-07-25 23:19:24 +02004706 int ret = 0;
4707 struct fs_path *p;
Josef Baciked259092013-10-25 11:36:01 -04004708 ssize_t num_read = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02004709
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004710 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02004711 if (!p)
4712 return -ENOMEM;
4713
Jeff Mahoney04ab9562016-09-20 10:05:03 -04004714 btrfs_debug(fs_info, "send_write offset=%llu, len=%d", offset, len);
Alexander Block31db9f72012-07-25 23:19:24 +02004715
Josef Baciked259092013-10-25 11:36:01 -04004716 num_read = fill_read_buf(sctx, offset, len);
4717 if (num_read <= 0) {
4718 if (num_read < 0)
4719 ret = num_read;
Alexander Block31db9f72012-07-25 23:19:24 +02004720 goto out;
Josef Baciked259092013-10-25 11:36:01 -04004721 }
Alexander Block31db9f72012-07-25 23:19:24 +02004722
4723 ret = begin_cmd(sctx, BTRFS_SEND_C_WRITE);
4724 if (ret < 0)
4725 goto out;
4726
4727 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p);
4728 if (ret < 0)
4729 goto out;
4730
4731 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
4732 TLV_PUT_U64(sctx, BTRFS_SEND_A_FILE_OFFSET, offset);
Alexander Blocke938c8a2012-07-28 16:33:49 +02004733 TLV_PUT(sctx, BTRFS_SEND_A_DATA, sctx->read_buf, num_read);
Alexander Block31db9f72012-07-25 23:19:24 +02004734
4735 ret = send_cmd(sctx);
4736
4737tlv_put_failure:
4738out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004739 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02004740 if (ret < 0)
4741 return ret;
Alexander Blocke938c8a2012-07-28 16:33:49 +02004742 return num_read;
Alexander Block31db9f72012-07-25 23:19:24 +02004743}
4744
4745/*
4746 * Send a clone command to user space.
4747 */
4748static int send_clone(struct send_ctx *sctx,
4749 u64 offset, u32 len,
4750 struct clone_root *clone_root)
4751{
4752 int ret = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02004753 struct fs_path *p;
4754 u64 gen;
4755
Jeff Mahoney04ab9562016-09-20 10:05:03 -04004756 btrfs_debug(sctx->send_root->fs_info,
4757 "send_clone offset=%llu, len=%d, clone_root=%llu, clone_inode=%llu, clone_offset=%llu",
4758 offset, len, clone_root->root->objectid, clone_root->ino,
4759 clone_root->offset);
Alexander Block31db9f72012-07-25 23:19:24 +02004760
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004761 p = fs_path_alloc();
Alexander Block31db9f72012-07-25 23:19:24 +02004762 if (!p)
4763 return -ENOMEM;
4764
4765 ret = begin_cmd(sctx, BTRFS_SEND_C_CLONE);
4766 if (ret < 0)
4767 goto out;
4768
4769 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p);
4770 if (ret < 0)
4771 goto out;
4772
4773 TLV_PUT_U64(sctx, BTRFS_SEND_A_FILE_OFFSET, offset);
4774 TLV_PUT_U64(sctx, BTRFS_SEND_A_CLONE_LEN, len);
4775 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
4776
Alexander Blocke938c8a2012-07-28 16:33:49 +02004777 if (clone_root->root == sctx->send_root) {
Alexander Block31db9f72012-07-25 23:19:24 +02004778 ret = get_inode_info(sctx->send_root, clone_root->ino, NULL,
Alexander Block85a7b332012-07-26 23:39:10 +02004779 &gen, NULL, NULL, NULL, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02004780 if (ret < 0)
4781 goto out;
4782 ret = get_cur_path(sctx, clone_root->ino, gen, p);
4783 } else {
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004784 ret = get_inode_path(clone_root->root, clone_root->ino, p);
Alexander Block31db9f72012-07-25 23:19:24 +02004785 }
4786 if (ret < 0)
4787 goto out;
4788
Josef Bacik37b8d272015-06-04 17:17:25 -04004789 /*
4790 * If the parent we're using has a received_uuid set then use that as
4791 * our clone source as that is what we will look for when doing a
4792 * receive.
4793 *
4794 * This covers the case that we create a snapshot off of a received
4795 * subvolume and then use that as the parent and try to receive on a
4796 * different host.
4797 */
4798 if (!btrfs_is_empty_uuid(clone_root->root->root_item.received_uuid))
4799 TLV_PUT_UUID(sctx, BTRFS_SEND_A_CLONE_UUID,
4800 clone_root->root->root_item.received_uuid);
4801 else
4802 TLV_PUT_UUID(sctx, BTRFS_SEND_A_CLONE_UUID,
4803 clone_root->root->root_item.uuid);
Alexander Block31db9f72012-07-25 23:19:24 +02004804 TLV_PUT_U64(sctx, BTRFS_SEND_A_CLONE_CTRANSID,
Filipe David Borba Manana5a0f4e22013-12-03 15:55:48 +00004805 le64_to_cpu(clone_root->root->root_item.ctransid));
Alexander Block31db9f72012-07-25 23:19:24 +02004806 TLV_PUT_PATH(sctx, BTRFS_SEND_A_CLONE_PATH, p);
4807 TLV_PUT_U64(sctx, BTRFS_SEND_A_CLONE_OFFSET,
4808 clone_root->offset);
4809
4810 ret = send_cmd(sctx);
4811
4812tlv_put_failure:
4813out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004814 fs_path_free(p);
Alexander Block31db9f72012-07-25 23:19:24 +02004815 return ret;
4816}
4817
Mark Fashehcb95e7b2013-02-04 20:54:57 +00004818/*
4819 * Send an update extent command to user space.
4820 */
4821static int send_update_extent(struct send_ctx *sctx,
4822 u64 offset, u32 len)
4823{
4824 int ret = 0;
4825 struct fs_path *p;
4826
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004827 p = fs_path_alloc();
Mark Fashehcb95e7b2013-02-04 20:54:57 +00004828 if (!p)
4829 return -ENOMEM;
4830
4831 ret = begin_cmd(sctx, BTRFS_SEND_C_UPDATE_EXTENT);
4832 if (ret < 0)
4833 goto out;
4834
4835 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p);
4836 if (ret < 0)
4837 goto out;
4838
4839 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
4840 TLV_PUT_U64(sctx, BTRFS_SEND_A_FILE_OFFSET, offset);
4841 TLV_PUT_U64(sctx, BTRFS_SEND_A_SIZE, len);
4842
4843 ret = send_cmd(sctx);
4844
4845tlv_put_failure:
4846out:
Tsutomu Itoh924794c2013-05-08 07:51:52 +00004847 fs_path_free(p);
Mark Fashehcb95e7b2013-02-04 20:54:57 +00004848 return ret;
4849}
4850
Josef Bacik16e75492013-10-22 12:18:51 -04004851static int send_hole(struct send_ctx *sctx, u64 end)
4852{
4853 struct fs_path *p = NULL;
4854 u64 offset = sctx->cur_inode_last_extent;
4855 u64 len;
4856 int ret = 0;
4857
Filipe Mananab672f4b2018-02-06 20:39:20 +00004858 if (sctx->flags & BTRFS_SEND_FLAG_NO_FILE_DATA)
4859 return send_update_extent(sctx, offset, end - offset);
4860
Josef Bacik16e75492013-10-22 12:18:51 -04004861 p = fs_path_alloc();
4862 if (!p)
4863 return -ENOMEM;
Filipe Mananac715e152014-03-31 14:52:14 +01004864 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p);
4865 if (ret < 0)
4866 goto tlv_put_failure;
Josef Bacik16e75492013-10-22 12:18:51 -04004867 memset(sctx->read_buf, 0, BTRFS_SEND_READ_SIZE);
4868 while (offset < end) {
4869 len = min_t(u64, end - offset, BTRFS_SEND_READ_SIZE);
4870
4871 ret = begin_cmd(sctx, BTRFS_SEND_C_WRITE);
4872 if (ret < 0)
4873 break;
Josef Bacik16e75492013-10-22 12:18:51 -04004874 TLV_PUT_PATH(sctx, BTRFS_SEND_A_PATH, p);
4875 TLV_PUT_U64(sctx, BTRFS_SEND_A_FILE_OFFSET, offset);
4876 TLV_PUT(sctx, BTRFS_SEND_A_DATA, sctx->read_buf, len);
4877 ret = send_cmd(sctx);
4878 if (ret < 0)
4879 break;
4880 offset += len;
4881 }
4882tlv_put_failure:
4883 fs_path_free(p);
4884 return ret;
4885}
4886
Filipe Mananad906d492015-10-02 10:47:34 +01004887static int send_extent_data(struct send_ctx *sctx,
4888 const u64 offset,
4889 const u64 len)
4890{
4891 u64 sent = 0;
4892
4893 if (sctx->flags & BTRFS_SEND_FLAG_NO_FILE_DATA)
4894 return send_update_extent(sctx, offset, len);
4895
4896 while (sent < len) {
4897 u64 size = len - sent;
4898 int ret;
4899
4900 if (size > BTRFS_SEND_READ_SIZE)
4901 size = BTRFS_SEND_READ_SIZE;
4902 ret = send_write(sctx, offset + sent, size);
4903 if (ret < 0)
4904 return ret;
4905 if (!ret)
4906 break;
4907 sent += ret;
4908 }
4909 return 0;
4910}
4911
Marcos Paulo de Souza9e36fae2020-05-10 23:15:07 -03004912/*
4913 * Search for a capability xattr related to sctx->cur_ino. If the capability is
4914 * found, call send_set_xattr function to emit it.
4915 *
4916 * Return 0 if there isn't a capability, or when the capability was emitted
4917 * successfully, or < 0 if an error occurred.
4918 */
4919static int send_capabilities(struct send_ctx *sctx)
4920{
4921 struct fs_path *fspath = NULL;
4922 struct btrfs_path *path;
4923 struct btrfs_dir_item *di;
4924 struct extent_buffer *leaf;
4925 unsigned long data_ptr;
4926 char *buf = NULL;
4927 int buf_len;
4928 int ret = 0;
4929
4930 path = alloc_path_for_send();
4931 if (!path)
4932 return -ENOMEM;
4933
4934 di = btrfs_lookup_xattr(NULL, sctx->send_root, path, sctx->cur_ino,
4935 XATTR_NAME_CAPS, strlen(XATTR_NAME_CAPS), 0);
4936 if (!di) {
4937 /* There is no xattr for this inode */
4938 goto out;
4939 } else if (IS_ERR(di)) {
4940 ret = PTR_ERR(di);
4941 goto out;
4942 }
4943
4944 leaf = path->nodes[0];
4945 buf_len = btrfs_dir_data_len(leaf, di);
4946
4947 fspath = fs_path_alloc();
4948 buf = kmalloc(buf_len, GFP_KERNEL);
4949 if (!fspath || !buf) {
4950 ret = -ENOMEM;
4951 goto out;
4952 }
4953
4954 ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, fspath);
4955 if (ret < 0)
4956 goto out;
4957
4958 data_ptr = (unsigned long)(di + 1) + btrfs_dir_name_len(leaf, di);
4959 read_extent_buffer(leaf, buf, data_ptr, buf_len);
4960
4961 ret = send_set_xattr(sctx, fspath, XATTR_NAME_CAPS,
4962 strlen(XATTR_NAME_CAPS), buf, buf_len);
4963out:
4964 kfree(buf);
4965 fs_path_free(fspath);
4966 btrfs_free_path(path);
4967 return ret;
4968}
4969
Filipe Mananad906d492015-10-02 10:47:34 +01004970static int clone_range(struct send_ctx *sctx,
4971 struct clone_root *clone_root,
4972 const u64 disk_byte,
4973 u64 data_offset,
4974 u64 offset,
4975 u64 len)
4976{
4977 struct btrfs_path *path;
4978 struct btrfs_key key;
4979 int ret;
4980
4981 path = alloc_path_for_send();
4982 if (!path)
4983 return -ENOMEM;
4984
4985 /*
4986 * We can't send a clone operation for the entire range if we find
4987 * extent items in the respective range in the source file that
4988 * refer to different extents or if we find holes.
4989 * So check for that and do a mix of clone and regular write/copy
4990 * operations if needed.
4991 *
4992 * Example:
4993 *
4994 * mkfs.btrfs -f /dev/sda
4995 * mount /dev/sda /mnt
4996 * xfs_io -f -c "pwrite -S 0xaa 0K 100K" /mnt/foo
4997 * cp --reflink=always /mnt/foo /mnt/bar
4998 * xfs_io -c "pwrite -S 0xbb 50K 50K" /mnt/foo
4999 * btrfs subvolume snapshot -r /mnt /mnt/snap
5000 *
5001 * If when we send the snapshot and we are processing file bar (which
5002 * has a higher inode number than foo) we blindly send a clone operation
5003 * for the [0, 100K[ range from foo to bar, the receiver ends up getting
5004 * a file bar that matches the content of file foo - iow, doesn't match
5005 * the content from bar in the original filesystem.
5006 */
5007 key.objectid = clone_root->ino;
5008 key.type = BTRFS_EXTENT_DATA_KEY;
5009 key.offset = clone_root->offset;
5010 ret = btrfs_search_slot(NULL, clone_root->root, &key, path, 0, 0);
5011 if (ret < 0)
5012 goto out;
5013 if (ret > 0 && path->slots[0] > 0) {
5014 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0] - 1);
5015 if (key.objectid == clone_root->ino &&
5016 key.type == BTRFS_EXTENT_DATA_KEY)
5017 path->slots[0]--;
5018 }
5019
5020 while (true) {
5021 struct extent_buffer *leaf = path->nodes[0];
5022 int slot = path->slots[0];
5023 struct btrfs_file_extent_item *ei;
5024 u8 type;
5025 u64 ext_len;
5026 u64 clone_len;
5027
5028 if (slot >= btrfs_header_nritems(leaf)) {
5029 ret = btrfs_next_leaf(clone_root->root, path);
5030 if (ret < 0)
5031 goto out;
5032 else if (ret > 0)
5033 break;
5034 continue;
5035 }
5036
5037 btrfs_item_key_to_cpu(leaf, &key, slot);
5038
5039 /*
5040 * We might have an implicit trailing hole (NO_HOLES feature
5041 * enabled). We deal with it after leaving this loop.
5042 */
5043 if (key.objectid != clone_root->ino ||
5044 key.type != BTRFS_EXTENT_DATA_KEY)
5045 break;
5046
5047 ei = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
5048 type = btrfs_file_extent_type(leaf, ei);
5049 if (type == BTRFS_FILE_EXTENT_INLINE) {
5050 ext_len = btrfs_file_extent_inline_len(leaf, slot, ei);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03005051 ext_len = PAGE_ALIGN(ext_len);
Filipe Mananad906d492015-10-02 10:47:34 +01005052 } else {
5053 ext_len = btrfs_file_extent_num_bytes(leaf, ei);
5054 }
5055
5056 if (key.offset + ext_len <= clone_root->offset)
5057 goto next;
5058
5059 if (key.offset > clone_root->offset) {
5060 /* Implicit hole, NO_HOLES feature enabled. */
5061 u64 hole_len = key.offset - clone_root->offset;
5062
5063 if (hole_len > len)
5064 hole_len = len;
5065 ret = send_extent_data(sctx, offset, hole_len);
5066 if (ret < 0)
5067 goto out;
5068
5069 len -= hole_len;
5070 if (len == 0)
5071 break;
5072 offset += hole_len;
5073 clone_root->offset += hole_len;
5074 data_offset += hole_len;
5075 }
5076
5077 if (key.offset >= clone_root->offset + len)
5078 break;
5079
5080 clone_len = min_t(u64, ext_len, len);
5081
5082 if (btrfs_file_extent_disk_bytenr(leaf, ei) == disk_byte &&
5083 btrfs_file_extent_offset(leaf, ei) == data_offset)
5084 ret = send_clone(sctx, offset, clone_len, clone_root);
5085 else
5086 ret = send_extent_data(sctx, offset, clone_len);
5087
5088 if (ret < 0)
5089 goto out;
5090
5091 len -= clone_len;
5092 if (len == 0)
5093 break;
5094 offset += clone_len;
5095 clone_root->offset += clone_len;
5096 data_offset += clone_len;
5097next:
5098 path->slots[0]++;
5099 }
5100
5101 if (len > 0)
5102 ret = send_extent_data(sctx, offset, len);
5103 else
5104 ret = 0;
5105out:
5106 btrfs_free_path(path);
5107 return ret;
5108}
5109
Alexander Block31db9f72012-07-25 23:19:24 +02005110static int send_write_or_clone(struct send_ctx *sctx,
5111 struct btrfs_path *path,
5112 struct btrfs_key *key,
5113 struct clone_root *clone_root)
5114{
5115 int ret = 0;
5116 struct btrfs_file_extent_item *ei;
5117 u64 offset = key->offset;
Alexander Block31db9f72012-07-25 23:19:24 +02005118 u64 len;
Alexander Block31db9f72012-07-25 23:19:24 +02005119 u8 type;
Filipe David Borba Manana28e5dd82014-01-12 02:26:28 +00005120 u64 bs = sctx->send_root->fs_info->sb->s_blocksize;
Alexander Block31db9f72012-07-25 23:19:24 +02005121
5122 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
5123 struct btrfs_file_extent_item);
5124 type = btrfs_file_extent_type(path->nodes[0], ei);
Chris Mason74dd17f2012-08-07 16:25:13 -04005125 if (type == BTRFS_FILE_EXTENT_INLINE) {
Chris Mason514ac8a2014-01-03 21:07:00 -08005126 len = btrfs_file_extent_inline_len(path->nodes[0],
5127 path->slots[0], ei);
Chris Mason74dd17f2012-08-07 16:25:13 -04005128 /*
5129 * it is possible the inline item won't cover the whole page,
5130 * but there may be items after this page. Make
5131 * sure to send the whole thing
5132 */
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03005133 len = PAGE_ALIGN(len);
Chris Mason74dd17f2012-08-07 16:25:13 -04005134 } else {
Alexander Block31db9f72012-07-25 23:19:24 +02005135 len = btrfs_file_extent_num_bytes(path->nodes[0], ei);
Chris Mason74dd17f2012-08-07 16:25:13 -04005136 }
Alexander Block31db9f72012-07-25 23:19:24 +02005137
5138 if (offset + len > sctx->cur_inode_size)
5139 len = sctx->cur_inode_size - offset;
5140 if (len == 0) {
5141 ret = 0;
5142 goto out;
5143 }
5144
Filipe David Borba Manana28e5dd82014-01-12 02:26:28 +00005145 if (clone_root && IS_ALIGNED(offset + len, bs)) {
Filipe Mananad906d492015-10-02 10:47:34 +01005146 u64 disk_byte;
5147 u64 data_offset;
5148
5149 disk_byte = btrfs_file_extent_disk_bytenr(path->nodes[0], ei);
5150 data_offset = btrfs_file_extent_offset(path->nodes[0], ei);
5151 ret = clone_range(sctx, clone_root, disk_byte, data_offset,
5152 offset, len);
Mark Fashehcb95e7b2013-02-04 20:54:57 +00005153 } else {
Filipe Mananad906d492015-10-02 10:47:34 +01005154 ret = send_extent_data(sctx, offset, len);
Alexander Block31db9f72012-07-25 23:19:24 +02005155 }
Alexander Block31db9f72012-07-25 23:19:24 +02005156out:
5157 return ret;
5158}
5159
5160static int is_extent_unchanged(struct send_ctx *sctx,
5161 struct btrfs_path *left_path,
5162 struct btrfs_key *ekey)
5163{
5164 int ret = 0;
5165 struct btrfs_key key;
5166 struct btrfs_path *path = NULL;
5167 struct extent_buffer *eb;
5168 int slot;
5169 struct btrfs_key found_key;
5170 struct btrfs_file_extent_item *ei;
5171 u64 left_disknr;
5172 u64 right_disknr;
5173 u64 left_offset;
5174 u64 right_offset;
5175 u64 left_offset_fixed;
5176 u64 left_len;
5177 u64 right_len;
Chris Mason74dd17f2012-08-07 16:25:13 -04005178 u64 left_gen;
5179 u64 right_gen;
Alexander Block31db9f72012-07-25 23:19:24 +02005180 u8 left_type;
5181 u8 right_type;
5182
5183 path = alloc_path_for_send();
5184 if (!path)
5185 return -ENOMEM;
5186
5187 eb = left_path->nodes[0];
5188 slot = left_path->slots[0];
Alexander Block31db9f72012-07-25 23:19:24 +02005189 ei = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
5190 left_type = btrfs_file_extent_type(eb, ei);
Alexander Block31db9f72012-07-25 23:19:24 +02005191
5192 if (left_type != BTRFS_FILE_EXTENT_REG) {
5193 ret = 0;
5194 goto out;
5195 }
Chris Mason74dd17f2012-08-07 16:25:13 -04005196 left_disknr = btrfs_file_extent_disk_bytenr(eb, ei);
5197 left_len = btrfs_file_extent_num_bytes(eb, ei);
5198 left_offset = btrfs_file_extent_offset(eb, ei);
5199 left_gen = btrfs_file_extent_generation(eb, ei);
Alexander Block31db9f72012-07-25 23:19:24 +02005200
5201 /*
5202 * Following comments will refer to these graphics. L is the left
5203 * extents which we are checking at the moment. 1-8 are the right
5204 * extents that we iterate.
5205 *
5206 * |-----L-----|
5207 * |-1-|-2a-|-3-|-4-|-5-|-6-|
5208 *
5209 * |-----L-----|
5210 * |--1--|-2b-|...(same as above)
5211 *
5212 * Alternative situation. Happens on files where extents got split.
5213 * |-----L-----|
5214 * |-----------7-----------|-6-|
5215 *
5216 * Alternative situation. Happens on files which got larger.
5217 * |-----L-----|
5218 * |-8-|
5219 * Nothing follows after 8.
5220 */
5221
5222 key.objectid = ekey->objectid;
5223 key.type = BTRFS_EXTENT_DATA_KEY;
5224 key.offset = ekey->offset;
5225 ret = btrfs_search_slot_for_read(sctx->parent_root, &key, path, 0, 0);
5226 if (ret < 0)
5227 goto out;
5228 if (ret) {
5229 ret = 0;
5230 goto out;
5231 }
5232
5233 /*
5234 * Handle special case where the right side has no extents at all.
5235 */
5236 eb = path->nodes[0];
5237 slot = path->slots[0];
5238 btrfs_item_key_to_cpu(eb, &found_key, slot);
5239 if (found_key.objectid != key.objectid ||
5240 found_key.type != key.type) {
Josef Bacik57cfd462013-08-20 15:55:39 -04005241 /* If we're a hole then just pretend nothing changed */
5242 ret = (left_disknr) ? 0 : 1;
Alexander Block31db9f72012-07-25 23:19:24 +02005243 goto out;
5244 }
5245
5246 /*
5247 * We're now on 2a, 2b or 7.
5248 */
5249 key = found_key;
5250 while (key.offset < ekey->offset + left_len) {
5251 ei = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item);
5252 right_type = btrfs_file_extent_type(eb, ei);
Filipe Manana7016b202017-04-04 20:31:00 +01005253 if (right_type != BTRFS_FILE_EXTENT_REG &&
5254 right_type != BTRFS_FILE_EXTENT_INLINE) {
Alexander Block31db9f72012-07-25 23:19:24 +02005255 ret = 0;
5256 goto out;
5257 }
5258
Filipe Manana7016b202017-04-04 20:31:00 +01005259 if (right_type == BTRFS_FILE_EXTENT_INLINE) {
5260 right_len = btrfs_file_extent_inline_len(eb, slot, ei);
5261 right_len = PAGE_ALIGN(right_len);
5262 } else {
5263 right_len = btrfs_file_extent_num_bytes(eb, ei);
5264 }
Josef Bacik007d31f2013-10-31 16:49:02 -04005265
Alexander Block31db9f72012-07-25 23:19:24 +02005266 /*
5267 * Are we at extent 8? If yes, we know the extent is changed.
5268 * This may only happen on the first iteration.
5269 */
Alexander Blockd8347fa2012-08-01 12:49:15 +02005270 if (found_key.offset + right_len <= ekey->offset) {
Josef Bacik57cfd462013-08-20 15:55:39 -04005271 /* If we're a hole just pretend nothing changed */
5272 ret = (left_disknr) ? 0 : 1;
Alexander Block31db9f72012-07-25 23:19:24 +02005273 goto out;
5274 }
5275
Filipe Manana7016b202017-04-04 20:31:00 +01005276 /*
5277 * We just wanted to see if when we have an inline extent, what
5278 * follows it is a regular extent (wanted to check the above
5279 * condition for inline extents too). This should normally not
5280 * happen but it's possible for example when we have an inline
5281 * compressed extent representing data with a size matching
5282 * the page size (currently the same as sector size).
5283 */
5284 if (right_type == BTRFS_FILE_EXTENT_INLINE) {
5285 ret = 0;
5286 goto out;
5287 }
5288
Filipe Manana97d65c12017-07-06 15:31:46 +01005289 right_disknr = btrfs_file_extent_disk_bytenr(eb, ei);
5290 right_offset = btrfs_file_extent_offset(eb, ei);
5291 right_gen = btrfs_file_extent_generation(eb, ei);
5292
Alexander Block31db9f72012-07-25 23:19:24 +02005293 left_offset_fixed = left_offset;
5294 if (key.offset < ekey->offset) {
5295 /* Fix the right offset for 2a and 7. */
5296 right_offset += ekey->offset - key.offset;
5297 } else {
5298 /* Fix the left offset for all behind 2a and 2b */
5299 left_offset_fixed += key.offset - ekey->offset;
5300 }
5301
5302 /*
5303 * Check if we have the same extent.
5304 */
Alexander Block39540962012-08-01 12:46:05 +02005305 if (left_disknr != right_disknr ||
Chris Mason74dd17f2012-08-07 16:25:13 -04005306 left_offset_fixed != right_offset ||
5307 left_gen != right_gen) {
Alexander Block31db9f72012-07-25 23:19:24 +02005308 ret = 0;
5309 goto out;
5310 }
5311
5312 /*
5313 * Go to the next extent.
5314 */
5315 ret = btrfs_next_item(sctx->parent_root, path);
5316 if (ret < 0)
5317 goto out;
5318 if (!ret) {
5319 eb = path->nodes[0];
5320 slot = path->slots[0];
5321 btrfs_item_key_to_cpu(eb, &found_key, slot);
5322 }
5323 if (ret || found_key.objectid != key.objectid ||
5324 found_key.type != key.type) {
5325 key.offset += right_len;
5326 break;
Jan Schmidtadaa4b82013-03-21 14:30:23 +00005327 }
5328 if (found_key.offset != key.offset + right_len) {
5329 ret = 0;
5330 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02005331 }
5332 key = found_key;
5333 }
5334
5335 /*
5336 * We're now behind the left extent (treat as unchanged) or at the end
5337 * of the right side (treat as changed).
5338 */
5339 if (key.offset >= ekey->offset + left_len)
5340 ret = 1;
5341 else
5342 ret = 0;
5343
5344
5345out:
5346 btrfs_free_path(path);
5347 return ret;
5348}
5349
Josef Bacik16e75492013-10-22 12:18:51 -04005350static int get_last_extent(struct send_ctx *sctx, u64 offset)
5351{
5352 struct btrfs_path *path;
5353 struct btrfs_root *root = sctx->send_root;
5354 struct btrfs_file_extent_item *fi;
5355 struct btrfs_key key;
5356 u64 extent_end;
5357 u8 type;
5358 int ret;
5359
5360 path = alloc_path_for_send();
5361 if (!path)
5362 return -ENOMEM;
5363
5364 sctx->cur_inode_last_extent = 0;
5365
5366 key.objectid = sctx->cur_ino;
5367 key.type = BTRFS_EXTENT_DATA_KEY;
5368 key.offset = offset;
5369 ret = btrfs_search_slot_for_read(root, &key, path, 0, 1);
5370 if (ret < 0)
5371 goto out;
5372 ret = 0;
5373 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
5374 if (key.objectid != sctx->cur_ino || key.type != BTRFS_EXTENT_DATA_KEY)
5375 goto out;
5376
5377 fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
5378 struct btrfs_file_extent_item);
5379 type = btrfs_file_extent_type(path->nodes[0], fi);
5380 if (type == BTRFS_FILE_EXTENT_INLINE) {
Chris Mason514ac8a2014-01-03 21:07:00 -08005381 u64 size = btrfs_file_extent_inline_len(path->nodes[0],
5382 path->slots[0], fi);
Josef Bacik16e75492013-10-22 12:18:51 -04005383 extent_end = ALIGN(key.offset + size,
5384 sctx->send_root->sectorsize);
5385 } else {
5386 extent_end = key.offset +
5387 btrfs_file_extent_num_bytes(path->nodes[0], fi);
5388 }
5389 sctx->cur_inode_last_extent = extent_end;
5390out:
5391 btrfs_free_path(path);
5392 return ret;
5393}
5394
5395static int maybe_send_hole(struct send_ctx *sctx, struct btrfs_path *path,
5396 struct btrfs_key *key)
5397{
5398 struct btrfs_file_extent_item *fi;
5399 u64 extent_end;
5400 u8 type;
5401 int ret = 0;
5402
5403 if (sctx->cur_ino != key->objectid || !need_send_hole(sctx))
5404 return 0;
5405
5406 if (sctx->cur_inode_last_extent == (u64)-1) {
5407 ret = get_last_extent(sctx, key->offset - 1);
5408 if (ret)
5409 return ret;
5410 }
5411
5412 fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
5413 struct btrfs_file_extent_item);
5414 type = btrfs_file_extent_type(path->nodes[0], fi);
5415 if (type == BTRFS_FILE_EXTENT_INLINE) {
Chris Mason514ac8a2014-01-03 21:07:00 -08005416 u64 size = btrfs_file_extent_inline_len(path->nodes[0],
5417 path->slots[0], fi);
Josef Bacik16e75492013-10-22 12:18:51 -04005418 extent_end = ALIGN(key->offset + size,
5419 sctx->send_root->sectorsize);
5420 } else {
5421 extent_end = key->offset +
5422 btrfs_file_extent_num_bytes(path->nodes[0], fi);
5423 }
Filipe David Borba Mananabf54f412014-01-28 01:38:06 +00005424
5425 if (path->slots[0] == 0 &&
5426 sctx->cur_inode_last_extent < key->offset) {
5427 /*
5428 * We might have skipped entire leafs that contained only
5429 * file extent items for our current inode. These leafs have
5430 * a generation number smaller (older) than the one in the
5431 * current leaf and the leaf our last extent came from, and
5432 * are located between these 2 leafs.
5433 */
5434 ret = get_last_extent(sctx, key->offset - 1);
5435 if (ret)
5436 return ret;
5437 }
5438
Josef Bacik16e75492013-10-22 12:18:51 -04005439 if (sctx->cur_inode_last_extent < key->offset)
5440 ret = send_hole(sctx, key->offset);
5441 sctx->cur_inode_last_extent = extent_end;
5442 return ret;
5443}
5444
Alexander Block31db9f72012-07-25 23:19:24 +02005445static int process_extent(struct send_ctx *sctx,
5446 struct btrfs_path *path,
5447 struct btrfs_key *key)
5448{
Alexander Block31db9f72012-07-25 23:19:24 +02005449 struct clone_root *found_clone = NULL;
Josef Bacik57cfd462013-08-20 15:55:39 -04005450 int ret = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02005451
5452 if (S_ISLNK(sctx->cur_inode_mode))
5453 return 0;
5454
5455 if (sctx->parent_root && !sctx->cur_inode_new) {
5456 ret = is_extent_unchanged(sctx, path, key);
5457 if (ret < 0)
5458 goto out;
5459 if (ret) {
5460 ret = 0;
Josef Bacik16e75492013-10-22 12:18:51 -04005461 goto out_hole;
Alexander Block31db9f72012-07-25 23:19:24 +02005462 }
Josef Bacik57cfd462013-08-20 15:55:39 -04005463 } else {
5464 struct btrfs_file_extent_item *ei;
5465 u8 type;
5466
5467 ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
5468 struct btrfs_file_extent_item);
5469 type = btrfs_file_extent_type(path->nodes[0], ei);
5470 if (type == BTRFS_FILE_EXTENT_PREALLOC ||
5471 type == BTRFS_FILE_EXTENT_REG) {
5472 /*
5473 * The send spec does not have a prealloc command yet,
5474 * so just leave a hole for prealloc'ed extents until
5475 * we have enough commands queued up to justify rev'ing
5476 * the send spec.
5477 */
5478 if (type == BTRFS_FILE_EXTENT_PREALLOC) {
5479 ret = 0;
5480 goto out;
5481 }
5482
5483 /* Have a hole, just skip it. */
5484 if (btrfs_file_extent_disk_bytenr(path->nodes[0], ei) == 0) {
5485 ret = 0;
5486 goto out;
5487 }
5488 }
Alexander Block31db9f72012-07-25 23:19:24 +02005489 }
5490
5491 ret = find_extent_clone(sctx, path, key->objectid, key->offset,
5492 sctx->cur_inode_size, &found_clone);
5493 if (ret != -ENOENT && ret < 0)
5494 goto out;
5495
5496 ret = send_write_or_clone(sctx, path, key, found_clone);
Josef Bacik16e75492013-10-22 12:18:51 -04005497 if (ret)
5498 goto out;
5499out_hole:
5500 ret = maybe_send_hole(sctx, path, key);
Alexander Block31db9f72012-07-25 23:19:24 +02005501out:
5502 return ret;
5503}
5504
5505static int process_all_extents(struct send_ctx *sctx)
5506{
5507 int ret;
5508 struct btrfs_root *root;
5509 struct btrfs_path *path;
5510 struct btrfs_key key;
5511 struct btrfs_key found_key;
5512 struct extent_buffer *eb;
5513 int slot;
5514
5515 root = sctx->send_root;
5516 path = alloc_path_for_send();
5517 if (!path)
5518 return -ENOMEM;
5519
5520 key.objectid = sctx->cmp_key->objectid;
5521 key.type = BTRFS_EXTENT_DATA_KEY;
5522 key.offset = 0;
Filipe David Borba Manana7fdd29d2014-01-24 17:42:09 +00005523 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
5524 if (ret < 0)
5525 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02005526
Filipe David Borba Manana7fdd29d2014-01-24 17:42:09 +00005527 while (1) {
Alexander Block31db9f72012-07-25 23:19:24 +02005528 eb = path->nodes[0];
5529 slot = path->slots[0];
Filipe David Borba Manana7fdd29d2014-01-24 17:42:09 +00005530
5531 if (slot >= btrfs_header_nritems(eb)) {
5532 ret = btrfs_next_leaf(root, path);
5533 if (ret < 0) {
5534 goto out;
5535 } else if (ret > 0) {
5536 ret = 0;
5537 break;
5538 }
5539 continue;
5540 }
5541
Alexander Block31db9f72012-07-25 23:19:24 +02005542 btrfs_item_key_to_cpu(eb, &found_key, slot);
5543
5544 if (found_key.objectid != key.objectid ||
5545 found_key.type != key.type) {
5546 ret = 0;
5547 goto out;
5548 }
5549
5550 ret = process_extent(sctx, path, &found_key);
5551 if (ret < 0)
5552 goto out;
5553
Filipe David Borba Manana7fdd29d2014-01-24 17:42:09 +00005554 path->slots[0]++;
Alexander Block31db9f72012-07-25 23:19:24 +02005555 }
5556
5557out:
5558 btrfs_free_path(path);
5559 return ret;
5560}
5561
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005562static int process_recorded_refs_if_needed(struct send_ctx *sctx, int at_end,
5563 int *pending_move,
5564 int *refs_processed)
Alexander Block31db9f72012-07-25 23:19:24 +02005565{
5566 int ret = 0;
5567
5568 if (sctx->cur_ino == 0)
5569 goto out;
5570 if (!at_end && sctx->cur_ino == sctx->cmp_key->objectid &&
Jan Schmidt96b5bd72012-10-15 08:30:45 +00005571 sctx->cmp_key->type <= BTRFS_INODE_EXTREF_KEY)
Alexander Block31db9f72012-07-25 23:19:24 +02005572 goto out;
5573 if (list_empty(&sctx->new_refs) && list_empty(&sctx->deleted_refs))
5574 goto out;
5575
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005576 ret = process_recorded_refs(sctx, pending_move);
Alexander Blocke479d9b2012-07-28 16:09:35 +02005577 if (ret < 0)
5578 goto out;
5579
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005580 *refs_processed = 1;
Alexander Block31db9f72012-07-25 23:19:24 +02005581out:
5582 return ret;
5583}
5584
5585static int finish_inode_if_needed(struct send_ctx *sctx, int at_end)
5586{
5587 int ret = 0;
5588 u64 left_mode;
5589 u64 left_uid;
5590 u64 left_gid;
5591 u64 right_mode;
5592 u64 right_uid;
5593 u64 right_gid;
5594 int need_chmod = 0;
5595 int need_chown = 0;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005596 int pending_move = 0;
5597 int refs_processed = 0;
Alexander Block31db9f72012-07-25 23:19:24 +02005598
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005599 ret = process_recorded_refs_if_needed(sctx, at_end, &pending_move,
5600 &refs_processed);
Alexander Block31db9f72012-07-25 23:19:24 +02005601 if (ret < 0)
5602 goto out;
5603
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005604 /*
5605 * We have processed the refs and thus need to advance send_progress.
5606 * Now, calls to get_cur_xxx will take the updated refs of the current
5607 * inode into account.
5608 *
5609 * On the other hand, if our current inode is a directory and couldn't
5610 * be moved/renamed because its parent was renamed/moved too and it has
5611 * a higher inode number, we can only move/rename our current inode
5612 * after we moved/renamed its parent. Therefore in this case operate on
5613 * the old path (pre move/rename) of our current inode, and the
5614 * move/rename will be performed later.
5615 */
5616 if (refs_processed && !pending_move)
5617 sctx->send_progress = sctx->cur_ino + 1;
5618
Alexander Block31db9f72012-07-25 23:19:24 +02005619 if (sctx->cur_ino == 0 || sctx->cur_inode_deleted)
5620 goto out;
5621 if (!at_end && sctx->cmp_key->objectid == sctx->cur_ino)
5622 goto out;
5623
5624 ret = get_inode_info(sctx->send_root, sctx->cur_ino, NULL, NULL,
Alexander Block85a7b332012-07-26 23:39:10 +02005625 &left_mode, &left_uid, &left_gid, NULL);
Alexander Block31db9f72012-07-25 23:19:24 +02005626 if (ret < 0)
5627 goto out;
5628
Alex Lyakase2d044f2012-10-17 13:52:47 +00005629 if (!sctx->parent_root || sctx->cur_inode_new) {
5630 need_chown = 1;
5631 if (!S_ISLNK(sctx->cur_inode_mode))
Alexander Block31db9f72012-07-25 23:19:24 +02005632 need_chmod = 1;
Alex Lyakase2d044f2012-10-17 13:52:47 +00005633 } else {
5634 ret = get_inode_info(sctx->parent_root, sctx->cur_ino,
5635 NULL, NULL, &right_mode, &right_uid,
5636 &right_gid, NULL);
5637 if (ret < 0)
5638 goto out;
Alexander Block31db9f72012-07-25 23:19:24 +02005639
Alex Lyakase2d044f2012-10-17 13:52:47 +00005640 if (left_uid != right_uid || left_gid != right_gid)
5641 need_chown = 1;
5642 if (!S_ISLNK(sctx->cur_inode_mode) && left_mode != right_mode)
5643 need_chmod = 1;
Alexander Block31db9f72012-07-25 23:19:24 +02005644 }
5645
5646 if (S_ISREG(sctx->cur_inode_mode)) {
Josef Bacik16e75492013-10-22 12:18:51 -04005647 if (need_send_hole(sctx)) {
Filipe Manana766b5e52014-03-30 23:02:53 +01005648 if (sctx->cur_inode_last_extent == (u64)-1 ||
5649 sctx->cur_inode_last_extent <
5650 sctx->cur_inode_size) {
Josef Bacik16e75492013-10-22 12:18:51 -04005651 ret = get_last_extent(sctx, (u64)-1);
5652 if (ret)
5653 goto out;
5654 }
5655 if (sctx->cur_inode_last_extent <
5656 sctx->cur_inode_size) {
5657 ret = send_hole(sctx, sctx->cur_inode_size);
5658 if (ret)
5659 goto out;
5660 }
5661 }
Alexander Block31db9f72012-07-25 23:19:24 +02005662 ret = send_truncate(sctx, sctx->cur_ino, sctx->cur_inode_gen,
5663 sctx->cur_inode_size);
5664 if (ret < 0)
5665 goto out;
5666 }
5667
5668 if (need_chown) {
5669 ret = send_chown(sctx, sctx->cur_ino, sctx->cur_inode_gen,
5670 left_uid, left_gid);
5671 if (ret < 0)
5672 goto out;
5673 }
5674 if (need_chmod) {
5675 ret = send_chmod(sctx, sctx->cur_ino, sctx->cur_inode_gen,
5676 left_mode);
5677 if (ret < 0)
5678 goto out;
5679 }
5680
Marcos Paulo de Souza9e36fae2020-05-10 23:15:07 -03005681 ret = send_capabilities(sctx);
5682 if (ret < 0)
5683 goto out;
5684
Alexander Block31db9f72012-07-25 23:19:24 +02005685 /*
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005686 * If other directory inodes depended on our current directory
5687 * inode's move/rename, now do their move/rename operations.
Alexander Block31db9f72012-07-25 23:19:24 +02005688 */
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005689 if (!is_waiting_for_move(sctx, sctx->cur_ino)) {
5690 ret = apply_children_dir_moves(sctx);
5691 if (ret)
5692 goto out;
Filipe Mananafcbd2152014-03-03 12:28:40 +00005693 /*
5694 * Need to send that every time, no matter if it actually
5695 * changed between the two trees as we have done changes to
5696 * the inode before. If our inode is a directory and it's
5697 * waiting to be moved/renamed, we will send its utimes when
5698 * it's moved/renamed, therefore we don't need to do it here.
5699 */
5700 sctx->send_progress = sctx->cur_ino + 1;
5701 ret = send_utimes(sctx, sctx->cur_ino, sctx->cur_inode_gen);
5702 if (ret < 0)
5703 goto out;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00005704 }
5705
Alexander Block31db9f72012-07-25 23:19:24 +02005706out:
5707 return ret;
5708}
5709
5710static int changed_inode(struct send_ctx *sctx,
5711 enum btrfs_compare_tree_result result)
5712{
5713 int ret = 0;
5714 struct btrfs_key *key = sctx->cmp_key;
5715 struct btrfs_inode_item *left_ii = NULL;
5716 struct btrfs_inode_item *right_ii = NULL;
5717 u64 left_gen = 0;
5718 u64 right_gen = 0;
5719
Alexander Block31db9f72012-07-25 23:19:24 +02005720 sctx->cur_ino = key->objectid;
5721 sctx->cur_inode_new_gen = 0;
Josef Bacik16e75492013-10-22 12:18:51 -04005722 sctx->cur_inode_last_extent = (u64)-1;
Alexander Blocke479d9b2012-07-28 16:09:35 +02005723
5724 /*
5725 * Set send_progress to current inode. This will tell all get_cur_xxx
5726 * functions that the current inode's refs are not updated yet. Later,
5727 * when process_recorded_refs is finished, it is set to cur_ino + 1.
5728 */
Alexander Block31db9f72012-07-25 23:19:24 +02005729 sctx->send_progress = sctx->cur_ino;
5730
5731 if (result == BTRFS_COMPARE_TREE_NEW ||
5732 result == BTRFS_COMPARE_TREE_CHANGED) {
5733 left_ii = btrfs_item_ptr(sctx->left_path->nodes[0],
5734 sctx->left_path->slots[0],
5735 struct btrfs_inode_item);
5736 left_gen = btrfs_inode_generation(sctx->left_path->nodes[0],
5737 left_ii);
5738 } else {
5739 right_ii = btrfs_item_ptr(sctx->right_path->nodes[0],
5740 sctx->right_path->slots[0],
5741 struct btrfs_inode_item);
5742 right_gen = btrfs_inode_generation(sctx->right_path->nodes[0],
5743 right_ii);
5744 }
5745 if (result == BTRFS_COMPARE_TREE_CHANGED) {
5746 right_ii = btrfs_item_ptr(sctx->right_path->nodes[0],
5747 sctx->right_path->slots[0],
5748 struct btrfs_inode_item);
5749
5750 right_gen = btrfs_inode_generation(sctx->right_path->nodes[0],
5751 right_ii);
Alexander Block6d85ed02012-08-01 14:48:59 +02005752
5753 /*
5754 * The cur_ino = root dir case is special here. We can't treat
5755 * the inode as deleted+reused because it would generate a
5756 * stream that tries to delete/mkdir the root dir.
5757 */
5758 if (left_gen != right_gen &&
5759 sctx->cur_ino != BTRFS_FIRST_FREE_OBJECTID)
Alexander Block31db9f72012-07-25 23:19:24 +02005760 sctx->cur_inode_new_gen = 1;
5761 }
5762
5763 if (result == BTRFS_COMPARE_TREE_NEW) {
5764 sctx->cur_inode_gen = left_gen;
5765 sctx->cur_inode_new = 1;
5766 sctx->cur_inode_deleted = 0;
5767 sctx->cur_inode_size = btrfs_inode_size(
5768 sctx->left_path->nodes[0], left_ii);
5769 sctx->cur_inode_mode = btrfs_inode_mode(
5770 sctx->left_path->nodes[0], left_ii);
Liu Bo644d1942014-02-27 17:29:01 +08005771 sctx->cur_inode_rdev = btrfs_inode_rdev(
5772 sctx->left_path->nodes[0], left_ii);
Alexander Block31db9f72012-07-25 23:19:24 +02005773 if (sctx->cur_ino != BTRFS_FIRST_FREE_OBJECTID)
Alexander Block1f4692d2012-07-28 10:42:24 +02005774 ret = send_create_inode_if_needed(sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02005775 } else if (result == BTRFS_COMPARE_TREE_DELETED) {
5776 sctx->cur_inode_gen = right_gen;
5777 sctx->cur_inode_new = 0;
5778 sctx->cur_inode_deleted = 1;
5779 sctx->cur_inode_size = btrfs_inode_size(
5780 sctx->right_path->nodes[0], right_ii);
5781 sctx->cur_inode_mode = btrfs_inode_mode(
5782 sctx->right_path->nodes[0], right_ii);
5783 } else if (result == BTRFS_COMPARE_TREE_CHANGED) {
Alexander Block766702e2012-07-28 14:11:31 +02005784 /*
5785 * We need to do some special handling in case the inode was
5786 * reported as changed with a changed generation number. This
5787 * means that the original inode was deleted and new inode
5788 * reused the same inum. So we have to treat the old inode as
5789 * deleted and the new one as new.
5790 */
Alexander Block31db9f72012-07-25 23:19:24 +02005791 if (sctx->cur_inode_new_gen) {
Alexander Block766702e2012-07-28 14:11:31 +02005792 /*
5793 * First, process the inode as if it was deleted.
5794 */
Alexander Block31db9f72012-07-25 23:19:24 +02005795 sctx->cur_inode_gen = right_gen;
5796 sctx->cur_inode_new = 0;
5797 sctx->cur_inode_deleted = 1;
5798 sctx->cur_inode_size = btrfs_inode_size(
5799 sctx->right_path->nodes[0], right_ii);
5800 sctx->cur_inode_mode = btrfs_inode_mode(
5801 sctx->right_path->nodes[0], right_ii);
5802 ret = process_all_refs(sctx,
5803 BTRFS_COMPARE_TREE_DELETED);
5804 if (ret < 0)
5805 goto out;
5806
Alexander Block766702e2012-07-28 14:11:31 +02005807 /*
5808 * Now process the inode as if it was new.
5809 */
Alexander Block31db9f72012-07-25 23:19:24 +02005810 sctx->cur_inode_gen = left_gen;
5811 sctx->cur_inode_new = 1;
5812 sctx->cur_inode_deleted = 0;
5813 sctx->cur_inode_size = btrfs_inode_size(
5814 sctx->left_path->nodes[0], left_ii);
5815 sctx->cur_inode_mode = btrfs_inode_mode(
5816 sctx->left_path->nodes[0], left_ii);
Liu Bo644d1942014-02-27 17:29:01 +08005817 sctx->cur_inode_rdev = btrfs_inode_rdev(
5818 sctx->left_path->nodes[0], left_ii);
Alexander Block1f4692d2012-07-28 10:42:24 +02005819 ret = send_create_inode_if_needed(sctx);
Alexander Block31db9f72012-07-25 23:19:24 +02005820 if (ret < 0)
5821 goto out;
5822
5823 ret = process_all_refs(sctx, BTRFS_COMPARE_TREE_NEW);
5824 if (ret < 0)
5825 goto out;
Alexander Blocke479d9b2012-07-28 16:09:35 +02005826 /*
5827 * Advance send_progress now as we did not get into
5828 * process_recorded_refs_if_needed in the new_gen case.
5829 */
5830 sctx->send_progress = sctx->cur_ino + 1;
Alexander Block766702e2012-07-28 14:11:31 +02005831
5832 /*
5833 * Now process all extents and xattrs of the inode as if
5834 * they were all new.
5835 */
Alexander Block31db9f72012-07-25 23:19:24 +02005836 ret = process_all_extents(sctx);
5837 if (ret < 0)
5838 goto out;
5839 ret = process_all_new_xattrs(sctx);
5840 if (ret < 0)
5841 goto out;
5842 } else {
5843 sctx->cur_inode_gen = left_gen;
5844 sctx->cur_inode_new = 0;
5845 sctx->cur_inode_new_gen = 0;
5846 sctx->cur_inode_deleted = 0;
5847 sctx->cur_inode_size = btrfs_inode_size(
5848 sctx->left_path->nodes[0], left_ii);
5849 sctx->cur_inode_mode = btrfs_inode_mode(
5850 sctx->left_path->nodes[0], left_ii);
5851 }
5852 }
5853
5854out:
5855 return ret;
5856}
5857
Alexander Block766702e2012-07-28 14:11:31 +02005858/*
5859 * We have to process new refs before deleted refs, but compare_trees gives us
5860 * the new and deleted refs mixed. To fix this, we record the new/deleted refs
5861 * first and later process them in process_recorded_refs.
5862 * For the cur_inode_new_gen case, we skip recording completely because
5863 * changed_inode did already initiate processing of refs. The reason for this is
5864 * that in this case, compare_tree actually compares the refs of 2 different
5865 * inodes. To fix this, process_all_refs is used in changed_inode to handle all
5866 * refs of the right tree as deleted and all refs of the left tree as new.
5867 */
Alexander Block31db9f72012-07-25 23:19:24 +02005868static int changed_ref(struct send_ctx *sctx,
5869 enum btrfs_compare_tree_result result)
5870{
5871 int ret = 0;
5872
Filipe Manana95155582016-08-01 01:50:37 +01005873 if (sctx->cur_ino != sctx->cmp_key->objectid) {
5874 inconsistent_snapshot_error(sctx, result, "reference");
5875 return -EIO;
5876 }
Alexander Block31db9f72012-07-25 23:19:24 +02005877
5878 if (!sctx->cur_inode_new_gen &&
5879 sctx->cur_ino != BTRFS_FIRST_FREE_OBJECTID) {
5880 if (result == BTRFS_COMPARE_TREE_NEW)
5881 ret = record_new_ref(sctx);
5882 else if (result == BTRFS_COMPARE_TREE_DELETED)
5883 ret = record_deleted_ref(sctx);
5884 else if (result == BTRFS_COMPARE_TREE_CHANGED)
5885 ret = record_changed_ref(sctx);
5886 }
5887
5888 return ret;
5889}
5890
Alexander Block766702e2012-07-28 14:11:31 +02005891/*
5892 * Process new/deleted/changed xattrs. We skip processing in the
5893 * cur_inode_new_gen case because changed_inode did already initiate processing
5894 * of xattrs. The reason is the same as in changed_ref
5895 */
Alexander Block31db9f72012-07-25 23:19:24 +02005896static int changed_xattr(struct send_ctx *sctx,
5897 enum btrfs_compare_tree_result result)
5898{
5899 int ret = 0;
5900
Filipe Manana95155582016-08-01 01:50:37 +01005901 if (sctx->cur_ino != sctx->cmp_key->objectid) {
5902 inconsistent_snapshot_error(sctx, result, "xattr");
5903 return -EIO;
5904 }
Alexander Block31db9f72012-07-25 23:19:24 +02005905
5906 if (!sctx->cur_inode_new_gen && !sctx->cur_inode_deleted) {
5907 if (result == BTRFS_COMPARE_TREE_NEW)
5908 ret = process_new_xattr(sctx);
5909 else if (result == BTRFS_COMPARE_TREE_DELETED)
5910 ret = process_deleted_xattr(sctx);
5911 else if (result == BTRFS_COMPARE_TREE_CHANGED)
5912 ret = process_changed_xattr(sctx);
5913 }
5914
5915 return ret;
5916}
5917
Alexander Block766702e2012-07-28 14:11:31 +02005918/*
5919 * Process new/deleted/changed extents. We skip processing in the
5920 * cur_inode_new_gen case because changed_inode did already initiate processing
5921 * of extents. The reason is the same as in changed_ref
5922 */
Alexander Block31db9f72012-07-25 23:19:24 +02005923static int changed_extent(struct send_ctx *sctx,
5924 enum btrfs_compare_tree_result result)
5925{
5926 int ret = 0;
5927
Filipe Manana09c63dc2019-07-17 13:23:39 +01005928 /*
5929 * We have found an extent item that changed without the inode item
5930 * having changed. This can happen either after relocation (where the
5931 * disk_bytenr of an extent item is replaced at
5932 * relocation.c:replace_file_extents()) or after deduplication into a
5933 * file in both the parent and send snapshots (where an extent item can
5934 * get modified or replaced with a new one). Note that deduplication
5935 * updates the inode item, but it only changes the iversion (sequence
5936 * field in the inode item) of the inode, so if a file is deduplicated
5937 * the same amount of times in both the parent and send snapshots, its
5938 * iversion becames the same in both snapshots, whence the inode item is
5939 * the same on both snapshots.
5940 */
5941 if (sctx->cur_ino != sctx->cmp_key->objectid)
5942 return 0;
Alexander Block31db9f72012-07-25 23:19:24 +02005943
5944 if (!sctx->cur_inode_new_gen && !sctx->cur_inode_deleted) {
5945 if (result != BTRFS_COMPARE_TREE_DELETED)
5946 ret = process_extent(sctx, sctx->left_path,
5947 sctx->cmp_key);
5948 }
5949
5950 return ret;
5951}
5952
Josef Bacikba5e8f22013-08-16 16:52:55 -04005953static int dir_changed(struct send_ctx *sctx, u64 dir)
5954{
5955 u64 orig_gen, new_gen;
5956 int ret;
5957
5958 ret = get_inode_info(sctx->send_root, dir, NULL, &new_gen, NULL, NULL,
5959 NULL, NULL);
5960 if (ret)
5961 return ret;
5962
5963 ret = get_inode_info(sctx->parent_root, dir, NULL, &orig_gen, NULL,
5964 NULL, NULL, NULL);
5965 if (ret)
5966 return ret;
5967
5968 return (orig_gen != new_gen) ? 1 : 0;
5969}
5970
5971static int compare_refs(struct send_ctx *sctx, struct btrfs_path *path,
5972 struct btrfs_key *key)
5973{
5974 struct btrfs_inode_extref *extref;
5975 struct extent_buffer *leaf;
5976 u64 dirid = 0, last_dirid = 0;
5977 unsigned long ptr;
5978 u32 item_size;
5979 u32 cur_offset = 0;
5980 int ref_name_len;
5981 int ret = 0;
5982
5983 /* Easy case, just check this one dirid */
5984 if (key->type == BTRFS_INODE_REF_KEY) {
5985 dirid = key->offset;
5986
5987 ret = dir_changed(sctx, dirid);
5988 goto out;
5989 }
5990
5991 leaf = path->nodes[0];
5992 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
5993 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
5994 while (cur_offset < item_size) {
5995 extref = (struct btrfs_inode_extref *)(ptr +
5996 cur_offset);
5997 dirid = btrfs_inode_extref_parent(leaf, extref);
5998 ref_name_len = btrfs_inode_extref_name_len(leaf, extref);
5999 cur_offset += ref_name_len + sizeof(*extref);
6000 if (dirid == last_dirid)
6001 continue;
6002 ret = dir_changed(sctx, dirid);
6003 if (ret)
6004 break;
6005 last_dirid = dirid;
6006 }
6007out:
6008 return ret;
6009}
6010
Alexander Block766702e2012-07-28 14:11:31 +02006011/*
6012 * Updates compare related fields in sctx and simply forwards to the actual
6013 * changed_xxx functions.
6014 */
Alexander Block31db9f72012-07-25 23:19:24 +02006015static int changed_cb(struct btrfs_root *left_root,
6016 struct btrfs_root *right_root,
6017 struct btrfs_path *left_path,
6018 struct btrfs_path *right_path,
6019 struct btrfs_key *key,
6020 enum btrfs_compare_tree_result result,
6021 void *ctx)
6022{
6023 int ret = 0;
6024 struct send_ctx *sctx = ctx;
6025
Josef Bacikba5e8f22013-08-16 16:52:55 -04006026 if (result == BTRFS_COMPARE_TREE_SAME) {
Josef Bacik16e75492013-10-22 12:18:51 -04006027 if (key->type == BTRFS_INODE_REF_KEY ||
6028 key->type == BTRFS_INODE_EXTREF_KEY) {
6029 ret = compare_refs(sctx, left_path, key);
6030 if (!ret)
6031 return 0;
6032 if (ret < 0)
6033 return ret;
6034 } else if (key->type == BTRFS_EXTENT_DATA_KEY) {
6035 return maybe_send_hole(sctx, left_path, key);
6036 } else {
Josef Bacikba5e8f22013-08-16 16:52:55 -04006037 return 0;
Josef Bacik16e75492013-10-22 12:18:51 -04006038 }
Josef Bacikba5e8f22013-08-16 16:52:55 -04006039 result = BTRFS_COMPARE_TREE_CHANGED;
6040 ret = 0;
6041 }
6042
Alexander Block31db9f72012-07-25 23:19:24 +02006043 sctx->left_path = left_path;
6044 sctx->right_path = right_path;
6045 sctx->cmp_key = key;
6046
6047 ret = finish_inode_if_needed(sctx, 0);
6048 if (ret < 0)
6049 goto out;
6050
Alexander Block2981e222012-08-01 14:47:03 +02006051 /* Ignore non-FS objects */
6052 if (key->objectid == BTRFS_FREE_INO_OBJECTID ||
6053 key->objectid == BTRFS_FREE_SPACE_OBJECTID)
6054 goto out;
6055
Alexander Block31db9f72012-07-25 23:19:24 +02006056 if (key->type == BTRFS_INODE_ITEM_KEY)
6057 ret = changed_inode(sctx, result);
Jan Schmidt96b5bd72012-10-15 08:30:45 +00006058 else if (key->type == BTRFS_INODE_REF_KEY ||
6059 key->type == BTRFS_INODE_EXTREF_KEY)
Alexander Block31db9f72012-07-25 23:19:24 +02006060 ret = changed_ref(sctx, result);
6061 else if (key->type == BTRFS_XATTR_ITEM_KEY)
6062 ret = changed_xattr(sctx, result);
6063 else if (key->type == BTRFS_EXTENT_DATA_KEY)
6064 ret = changed_extent(sctx, result);
6065
6066out:
6067 return ret;
6068}
6069
6070static int full_send_tree(struct send_ctx *sctx)
6071{
6072 int ret;
Alexander Block31db9f72012-07-25 23:19:24 +02006073 struct btrfs_root *send_root = sctx->send_root;
6074 struct btrfs_key key;
6075 struct btrfs_key found_key;
6076 struct btrfs_path *path;
6077 struct extent_buffer *eb;
6078 int slot;
Alexander Block31db9f72012-07-25 23:19:24 +02006079
6080 path = alloc_path_for_send();
6081 if (!path)
6082 return -ENOMEM;
6083
Alexander Block31db9f72012-07-25 23:19:24 +02006084 key.objectid = BTRFS_FIRST_FREE_OBJECTID;
6085 key.type = BTRFS_INODE_ITEM_KEY;
6086 key.offset = 0;
6087
Alexander Block31db9f72012-07-25 23:19:24 +02006088 ret = btrfs_search_slot_for_read(send_root, &key, path, 1, 0);
6089 if (ret < 0)
6090 goto out;
6091 if (ret)
6092 goto out_finish;
6093
6094 while (1) {
Alexander Block31db9f72012-07-25 23:19:24 +02006095 eb = path->nodes[0];
6096 slot = path->slots[0];
6097 btrfs_item_key_to_cpu(eb, &found_key, slot);
6098
6099 ret = changed_cb(send_root, NULL, path, NULL,
6100 &found_key, BTRFS_COMPARE_TREE_NEW, sctx);
6101 if (ret < 0)
6102 goto out;
6103
6104 key.objectid = found_key.objectid;
6105 key.type = found_key.type;
6106 key.offset = found_key.offset + 1;
6107
6108 ret = btrfs_next_item(send_root, path);
6109 if (ret < 0)
6110 goto out;
6111 if (ret) {
6112 ret = 0;
6113 break;
6114 }
6115 }
6116
6117out_finish:
6118 ret = finish_inode_if_needed(sctx, 1);
6119
6120out:
6121 btrfs_free_path(path);
Alexander Block31db9f72012-07-25 23:19:24 +02006122 return ret;
6123}
6124
6125static int send_subvol(struct send_ctx *sctx)
6126{
6127 int ret;
6128
Stefan Behrensc2c71322013-04-10 17:10:52 +00006129 if (!(sctx->flags & BTRFS_SEND_FLAG_OMIT_STREAM_HEADER)) {
6130 ret = send_header(sctx);
6131 if (ret < 0)
6132 goto out;
6133 }
Alexander Block31db9f72012-07-25 23:19:24 +02006134
6135 ret = send_subvol_begin(sctx);
6136 if (ret < 0)
6137 goto out;
6138
6139 if (sctx->parent_root) {
6140 ret = btrfs_compare_trees(sctx->send_root, sctx->parent_root,
6141 changed_cb, sctx);
6142 if (ret < 0)
6143 goto out;
6144 ret = finish_inode_if_needed(sctx, 1);
6145 if (ret < 0)
6146 goto out;
6147 } else {
6148 ret = full_send_tree(sctx);
6149 if (ret < 0)
6150 goto out;
6151 }
6152
6153out:
Alexander Block31db9f72012-07-25 23:19:24 +02006154 free_recorded_refs(sctx);
6155 return ret;
6156}
6157
Filipe Mananae5fa8f82014-10-21 11:11:41 +01006158/*
6159 * If orphan cleanup did remove any orphans from a root, it means the tree
6160 * was modified and therefore the commit root is not the same as the current
6161 * root anymore. This is a problem, because send uses the commit root and
6162 * therefore can see inode items that don't exist in the current root anymore,
6163 * and for example make calls to btrfs_iget, which will do tree lookups based
6164 * on the current root and not on the commit root. Those lookups will fail,
6165 * returning a -ESTALE error, and making send fail with that error. So make
6166 * sure a send does not see any orphans we have just removed, and that it will
6167 * see the same inodes regardless of whether a transaction commit happened
6168 * before it started (meaning that the commit root will be the same as the
6169 * current root) or not.
6170 */
6171static int ensure_commit_roots_uptodate(struct send_ctx *sctx)
6172{
6173 int i;
6174 struct btrfs_trans_handle *trans = NULL;
6175
6176again:
6177 if (sctx->parent_root &&
6178 sctx->parent_root->node != sctx->parent_root->commit_root)
6179 goto commit_trans;
6180
6181 for (i = 0; i < sctx->clone_roots_cnt; i++)
6182 if (sctx->clone_roots[i].root->node !=
6183 sctx->clone_roots[i].root->commit_root)
6184 goto commit_trans;
6185
6186 if (trans)
6187 return btrfs_end_transaction(trans, sctx->send_root);
6188
6189 return 0;
6190
6191commit_trans:
6192 /* Use any root, all fs roots will get their commit roots updated. */
6193 if (!trans) {
6194 trans = btrfs_join_transaction(sctx->send_root);
6195 if (IS_ERR(trans))
6196 return PTR_ERR(trans);
6197 goto again;
6198 }
6199
6200 return btrfs_commit_transaction(trans, sctx->send_root);
6201}
6202
David Sterba66ef7d62013-12-17 15:07:20 +01006203static void btrfs_root_dec_send_in_progress(struct btrfs_root* root)
6204{
6205 spin_lock(&root->root_item_lock);
6206 root->send_in_progress--;
6207 /*
6208 * Not much left to do, we don't know why it's unbalanced and
6209 * can't blindly reset it to 0.
6210 */
6211 if (root->send_in_progress < 0)
6212 btrfs_err(root->fs_info,
David Sterba351fd352014-05-15 16:48:20 +02006213 "send_in_progres unbalanced %d root %llu",
David Sterba66ef7d62013-12-17 15:07:20 +01006214 root->send_in_progress, root->root_key.objectid);
6215 spin_unlock(&root->root_item_lock);
6216}
6217
Alexander Block31db9f72012-07-25 23:19:24 +02006218long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
6219{
6220 int ret = 0;
6221 struct btrfs_root *send_root;
6222 struct btrfs_root *clone_root;
6223 struct btrfs_fs_info *fs_info;
6224 struct btrfs_ioctl_send_args *arg = NULL;
6225 struct btrfs_key key;
Alexander Block31db9f72012-07-25 23:19:24 +02006226 struct send_ctx *sctx = NULL;
6227 u32 i;
6228 u64 *clone_sources_tmp = NULL;
David Sterba2c686532013-12-16 17:34:17 +01006229 int clone_sources_to_rollback = 0;
David Sterbae55d1152016-04-11 18:52:02 +02006230 unsigned alloc_size;
Wang Shilong896c14f2014-01-07 17:25:18 +08006231 int sort_clone_roots = 0;
Wang Shilong18f687d2014-01-07 17:25:19 +08006232 int index;
Alexander Block31db9f72012-07-25 23:19:24 +02006233
6234 if (!capable(CAP_SYS_ADMIN))
6235 return -EPERM;
6236
Al Viro496ad9a2013-01-23 17:07:38 -05006237 send_root = BTRFS_I(file_inode(mnt_file))->root;
Alexander Block31db9f72012-07-25 23:19:24 +02006238 fs_info = send_root->fs_info;
6239
Josef Bacik139f8072013-05-20 11:26:50 -04006240 /*
David Sterba2c686532013-12-16 17:34:17 +01006241 * The subvolume must remain read-only during send, protect against
David Sterba521e0542014-04-15 16:41:44 +02006242 * making it RW. This also protects against deletion.
David Sterba2c686532013-12-16 17:34:17 +01006243 */
6244 spin_lock(&send_root->root_item_lock);
6245 send_root->send_in_progress++;
6246 spin_unlock(&send_root->root_item_lock);
6247
6248 /*
Josef Bacik139f8072013-05-20 11:26:50 -04006249 * This is done when we lookup the root, it should already be complete
6250 * by the time we get here.
6251 */
6252 WARN_ON(send_root->orphan_cleanup_state != ORPHAN_CLEANUP_DONE);
6253
6254 /*
David Sterba2c686532013-12-16 17:34:17 +01006255 * Userspace tools do the checks and warn the user if it's
6256 * not RO.
6257 */
6258 if (!btrfs_root_readonly(send_root)) {
6259 ret = -EPERM;
6260 goto out;
6261 }
6262
Alexander Block31db9f72012-07-25 23:19:24 +02006263 arg = memdup_user(arg_, sizeof(*arg));
6264 if (IS_ERR(arg)) {
6265 ret = PTR_ERR(arg);
6266 arg = NULL;
6267 goto out;
6268 }
6269
Dan Carpenter9c1433b2017-03-17 23:51:20 +03006270 /*
6271 * Check that we don't overflow at later allocations, we request
6272 * clone_sources_count + 1 items, and compare to unsigned long inside
6273 * access_ok.
6274 */
Dan Carpenterf5ecec32016-04-13 09:40:59 +03006275 if (arg->clone_sources_count >
Dan Carpenter9c1433b2017-03-17 23:51:20 +03006276 ULONG_MAX / sizeof(struct clone_root) - 1) {
Dan Carpenterf5ecec32016-04-13 09:40:59 +03006277 ret = -EINVAL;
6278 goto out;
6279 }
6280
Alexander Block31db9f72012-07-25 23:19:24 +02006281 if (!access_ok(VERIFY_READ, arg->clone_sources,
Dan Carpenter700ff4f2013-01-10 03:57:25 -05006282 sizeof(*arg->clone_sources) *
6283 arg->clone_sources_count)) {
Alexander Block31db9f72012-07-25 23:19:24 +02006284 ret = -EFAULT;
6285 goto out;
6286 }
6287
Stefan Behrensc2c71322013-04-10 17:10:52 +00006288 if (arg->flags & ~BTRFS_SEND_FLAG_MASK) {
Mark Fashehcb95e7b2013-02-04 20:54:57 +00006289 ret = -EINVAL;
6290 goto out;
6291 }
6292
David Sterbae780b0d2016-01-18 18:42:13 +01006293 sctx = kzalloc(sizeof(struct send_ctx), GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +02006294 if (!sctx) {
6295 ret = -ENOMEM;
6296 goto out;
6297 }
6298
6299 INIT_LIST_HEAD(&sctx->new_refs);
6300 INIT_LIST_HEAD(&sctx->deleted_refs);
David Sterbae780b0d2016-01-18 18:42:13 +01006301 INIT_RADIX_TREE(&sctx->name_cache, GFP_KERNEL);
Alexander Block31db9f72012-07-25 23:19:24 +02006302 INIT_LIST_HEAD(&sctx->name_cache_list);
6303
Mark Fashehcb95e7b2013-02-04 20:54:57 +00006304 sctx->flags = arg->flags;
6305
Alexander Block31db9f72012-07-25 23:19:24 +02006306 sctx->send_filp = fget(arg->send_fd);
Tsutomu Itohecc7ada2013-04-19 01:04:46 +00006307 if (!sctx->send_filp) {
6308 ret = -EBADF;
Alexander Block31db9f72012-07-25 23:19:24 +02006309 goto out;
6310 }
6311
Alexander Block31db9f72012-07-25 23:19:24 +02006312 sctx->send_root = send_root;
David Sterba521e0542014-04-15 16:41:44 +02006313 /*
6314 * Unlikely but possible, if the subvolume is marked for deletion but
6315 * is slow to remove the directory entry, send can still be started
6316 */
6317 if (btrfs_root_dead(sctx->send_root)) {
6318 ret = -EPERM;
6319 goto out;
6320 }
6321
Alexander Block31db9f72012-07-25 23:19:24 +02006322 sctx->clone_roots_cnt = arg->clone_sources_count;
6323
6324 sctx->send_max_size = BTRFS_SEND_BUF_SIZE;
David Sterba6ff48ce2016-04-11 18:40:08 +02006325 sctx->send_buf = kmalloc(sctx->send_max_size, GFP_KERNEL | __GFP_NOWARN);
Alexander Block31db9f72012-07-25 23:19:24 +02006326 if (!sctx->send_buf) {
David Sterba6ff48ce2016-04-11 18:40:08 +02006327 sctx->send_buf = vmalloc(sctx->send_max_size);
6328 if (!sctx->send_buf) {
6329 ret = -ENOMEM;
6330 goto out;
6331 }
Alexander Block31db9f72012-07-25 23:19:24 +02006332 }
6333
David Sterbaeb5b75f2016-04-11 18:40:08 +02006334 sctx->read_buf = kmalloc(BTRFS_SEND_READ_SIZE, GFP_KERNEL | __GFP_NOWARN);
Alexander Block31db9f72012-07-25 23:19:24 +02006335 if (!sctx->read_buf) {
David Sterbaeb5b75f2016-04-11 18:40:08 +02006336 sctx->read_buf = vmalloc(BTRFS_SEND_READ_SIZE);
6337 if (!sctx->read_buf) {
6338 ret = -ENOMEM;
6339 goto out;
6340 }
Alexander Block31db9f72012-07-25 23:19:24 +02006341 }
6342
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00006343 sctx->pending_dir_moves = RB_ROOT;
6344 sctx->waiting_dir_moves = RB_ROOT;
Filipe Manana9dc44212014-02-19 14:31:44 +00006345 sctx->orphan_dirs = RB_ROOT;
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00006346
David Sterbae55d1152016-04-11 18:52:02 +02006347 alloc_size = sizeof(struct clone_root) * (arg->clone_sources_count + 1);
6348
David Sterbac03d01f2016-04-11 18:40:08 +02006349 sctx->clone_roots = kzalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN);
Alexander Block31db9f72012-07-25 23:19:24 +02006350 if (!sctx->clone_roots) {
David Sterbac03d01f2016-04-11 18:40:08 +02006351 sctx->clone_roots = vzalloc(alloc_size);
6352 if (!sctx->clone_roots) {
6353 ret = -ENOMEM;
6354 goto out;
6355 }
Alexander Block31db9f72012-07-25 23:19:24 +02006356 }
6357
David Sterbae55d1152016-04-11 18:52:02 +02006358 alloc_size = arg->clone_sources_count * sizeof(*arg->clone_sources);
6359
Alexander Block31db9f72012-07-25 23:19:24 +02006360 if (arg->clone_sources_count) {
David Sterba2f913062016-04-11 18:40:08 +02006361 clone_sources_tmp = kmalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN);
Alexander Block31db9f72012-07-25 23:19:24 +02006362 if (!clone_sources_tmp) {
David Sterba2f913062016-04-11 18:40:08 +02006363 clone_sources_tmp = vmalloc(alloc_size);
6364 if (!clone_sources_tmp) {
6365 ret = -ENOMEM;
6366 goto out;
6367 }
Alexander Block31db9f72012-07-25 23:19:24 +02006368 }
6369
6370 ret = copy_from_user(clone_sources_tmp, arg->clone_sources,
David Sterbae55d1152016-04-11 18:52:02 +02006371 alloc_size);
Alexander Block31db9f72012-07-25 23:19:24 +02006372 if (ret) {
6373 ret = -EFAULT;
6374 goto out;
6375 }
6376
6377 for (i = 0; i < arg->clone_sources_count; i++) {
6378 key.objectid = clone_sources_tmp[i];
6379 key.type = BTRFS_ROOT_ITEM_KEY;
6380 key.offset = (u64)-1;
Wang Shilong18f687d2014-01-07 17:25:19 +08006381
6382 index = srcu_read_lock(&fs_info->subvol_srcu);
6383
Alexander Block31db9f72012-07-25 23:19:24 +02006384 clone_root = btrfs_read_fs_root_no_name(fs_info, &key);
Alexander Block31db9f72012-07-25 23:19:24 +02006385 if (IS_ERR(clone_root)) {
Wang Shilong18f687d2014-01-07 17:25:19 +08006386 srcu_read_unlock(&fs_info->subvol_srcu, index);
Alexander Block31db9f72012-07-25 23:19:24 +02006387 ret = PTR_ERR(clone_root);
6388 goto out;
6389 }
David Sterba2c686532013-12-16 17:34:17 +01006390 spin_lock(&clone_root->root_item_lock);
Filipe Manana5cc2b172015-03-02 20:53:52 +00006391 if (!btrfs_root_readonly(clone_root) ||
6392 btrfs_root_dead(clone_root)) {
David Sterba2c686532013-12-16 17:34:17 +01006393 spin_unlock(&clone_root->root_item_lock);
Wang Shilong18f687d2014-01-07 17:25:19 +08006394 srcu_read_unlock(&fs_info->subvol_srcu, index);
David Sterba2c686532013-12-16 17:34:17 +01006395 ret = -EPERM;
6396 goto out;
6397 }
Filipe Manana2f1f4652015-03-02 20:53:53 +00006398 clone_root->send_in_progress++;
David Sterba2c686532013-12-16 17:34:17 +01006399 spin_unlock(&clone_root->root_item_lock);
Wang Shilong18f687d2014-01-07 17:25:19 +08006400 srcu_read_unlock(&fs_info->subvol_srcu, index);
6401
Alexander Block31db9f72012-07-25 23:19:24 +02006402 sctx->clone_roots[i].root = clone_root;
Filipe Manana2f1f4652015-03-02 20:53:53 +00006403 clone_sources_to_rollback = i + 1;
Alexander Block31db9f72012-07-25 23:19:24 +02006404 }
David Sterba2f913062016-04-11 18:40:08 +02006405 kvfree(clone_sources_tmp);
Alexander Block31db9f72012-07-25 23:19:24 +02006406 clone_sources_tmp = NULL;
6407 }
6408
6409 if (arg->parent_root) {
6410 key.objectid = arg->parent_root;
6411 key.type = BTRFS_ROOT_ITEM_KEY;
6412 key.offset = (u64)-1;
Wang Shilong18f687d2014-01-07 17:25:19 +08006413
6414 index = srcu_read_lock(&fs_info->subvol_srcu);
6415
Alexander Block31db9f72012-07-25 23:19:24 +02006416 sctx->parent_root = btrfs_read_fs_root_no_name(fs_info, &key);
Stefan Behrensb1b19592013-05-13 14:42:57 +00006417 if (IS_ERR(sctx->parent_root)) {
Wang Shilong18f687d2014-01-07 17:25:19 +08006418 srcu_read_unlock(&fs_info->subvol_srcu, index);
Stefan Behrensb1b19592013-05-13 14:42:57 +00006419 ret = PTR_ERR(sctx->parent_root);
Alexander Block31db9f72012-07-25 23:19:24 +02006420 goto out;
6421 }
Wang Shilong18f687d2014-01-07 17:25:19 +08006422
David Sterba2c686532013-12-16 17:34:17 +01006423 spin_lock(&sctx->parent_root->root_item_lock);
6424 sctx->parent_root->send_in_progress++;
David Sterba521e0542014-04-15 16:41:44 +02006425 if (!btrfs_root_readonly(sctx->parent_root) ||
6426 btrfs_root_dead(sctx->parent_root)) {
David Sterba2c686532013-12-16 17:34:17 +01006427 spin_unlock(&sctx->parent_root->root_item_lock);
Wang Shilong18f687d2014-01-07 17:25:19 +08006428 srcu_read_unlock(&fs_info->subvol_srcu, index);
David Sterba2c686532013-12-16 17:34:17 +01006429 ret = -EPERM;
6430 goto out;
6431 }
6432 spin_unlock(&sctx->parent_root->root_item_lock);
Wang Shilong18f687d2014-01-07 17:25:19 +08006433
6434 srcu_read_unlock(&fs_info->subvol_srcu, index);
Alexander Block31db9f72012-07-25 23:19:24 +02006435 }
6436
6437 /*
6438 * Clones from send_root are allowed, but only if the clone source
6439 * is behind the current send position. This is checked while searching
6440 * for possible clone sources.
6441 */
6442 sctx->clone_roots[sctx->clone_roots_cnt++].root = sctx->send_root;
6443
6444 /* We do a bsearch later */
6445 sort(sctx->clone_roots, sctx->clone_roots_cnt,
6446 sizeof(*sctx->clone_roots), __clone_root_cmp_sort,
6447 NULL);
Wang Shilong896c14f2014-01-07 17:25:18 +08006448 sort_clone_roots = 1;
Alexander Block31db9f72012-07-25 23:19:24 +02006449
Filipe Mananae5fa8f82014-10-21 11:11:41 +01006450 ret = ensure_commit_roots_uptodate(sctx);
6451 if (ret)
6452 goto out;
6453
David Sterba2755a0d2014-07-31 00:43:18 +02006454 current->journal_info = BTRFS_SEND_TRANS_STUB;
Alexander Block31db9f72012-07-25 23:19:24 +02006455 ret = send_subvol(sctx);
Josef Bacika26e8c92014-03-28 17:07:27 -04006456 current->journal_info = NULL;
Alexander Block31db9f72012-07-25 23:19:24 +02006457 if (ret < 0)
6458 goto out;
6459
Stefan Behrensc2c71322013-04-10 17:10:52 +00006460 if (!(sctx->flags & BTRFS_SEND_FLAG_OMIT_END_CMD)) {
6461 ret = begin_cmd(sctx, BTRFS_SEND_C_END);
6462 if (ret < 0)
6463 goto out;
6464 ret = send_cmd(sctx);
6465 if (ret < 0)
6466 goto out;
6467 }
Alexander Block31db9f72012-07-25 23:19:24 +02006468
6469out:
Filipe David Borba Manana9f037402014-01-22 10:00:53 +00006470 WARN_ON(sctx && !ret && !RB_EMPTY_ROOT(&sctx->pending_dir_moves));
6471 while (sctx && !RB_EMPTY_ROOT(&sctx->pending_dir_moves)) {
6472 struct rb_node *n;
6473 struct pending_dir_move *pm;
6474
6475 n = rb_first(&sctx->pending_dir_moves);
6476 pm = rb_entry(n, struct pending_dir_move, node);
6477 while (!list_empty(&pm->list)) {
6478 struct pending_dir_move *pm2;
6479
6480 pm2 = list_first_entry(&pm->list,
6481 struct pending_dir_move, list);
6482 free_pending_move(sctx, pm2);
6483 }
6484 free_pending_move(sctx, pm);
6485 }
6486
6487 WARN_ON(sctx && !ret && !RB_EMPTY_ROOT(&sctx->waiting_dir_moves));
6488 while (sctx && !RB_EMPTY_ROOT(&sctx->waiting_dir_moves)) {
6489 struct rb_node *n;
6490 struct waiting_dir_move *dm;
6491
6492 n = rb_first(&sctx->waiting_dir_moves);
6493 dm = rb_entry(n, struct waiting_dir_move, node);
6494 rb_erase(&dm->node, &sctx->waiting_dir_moves);
6495 kfree(dm);
6496 }
6497
Filipe Manana9dc44212014-02-19 14:31:44 +00006498 WARN_ON(sctx && !ret && !RB_EMPTY_ROOT(&sctx->orphan_dirs));
6499 while (sctx && !RB_EMPTY_ROOT(&sctx->orphan_dirs)) {
6500 struct rb_node *n;
6501 struct orphan_dir_info *odi;
6502
6503 n = rb_first(&sctx->orphan_dirs);
6504 odi = rb_entry(n, struct orphan_dir_info, node);
6505 free_orphan_dir_info(sctx, odi);
6506 }
6507
Wang Shilong896c14f2014-01-07 17:25:18 +08006508 if (sort_clone_roots) {
6509 for (i = 0; i < sctx->clone_roots_cnt; i++)
6510 btrfs_root_dec_send_in_progress(
6511 sctx->clone_roots[i].root);
6512 } else {
6513 for (i = 0; sctx && i < clone_sources_to_rollback; i++)
6514 btrfs_root_dec_send_in_progress(
6515 sctx->clone_roots[i].root);
6516
6517 btrfs_root_dec_send_in_progress(send_root);
6518 }
David Sterba66ef7d62013-12-17 15:07:20 +01006519 if (sctx && !IS_ERR_OR_NULL(sctx->parent_root))
6520 btrfs_root_dec_send_in_progress(sctx->parent_root);
David Sterba2c686532013-12-16 17:34:17 +01006521
Alexander Block31db9f72012-07-25 23:19:24 +02006522 kfree(arg);
David Sterba2f913062016-04-11 18:40:08 +02006523 kvfree(clone_sources_tmp);
Alexander Block31db9f72012-07-25 23:19:24 +02006524
6525 if (sctx) {
6526 if (sctx->send_filp)
6527 fput(sctx->send_filp);
6528
David Sterbac03d01f2016-04-11 18:40:08 +02006529 kvfree(sctx->clone_roots);
David Sterba6ff48ce2016-04-11 18:40:08 +02006530 kvfree(sctx->send_buf);
David Sterbaeb5b75f2016-04-11 18:40:08 +02006531 kvfree(sctx->read_buf);
Alexander Block31db9f72012-07-25 23:19:24 +02006532
6533 name_cache_free(sctx);
6534
6535 kfree(sctx);
6536 }
6537
6538 return ret;
6539}