]> git.sesse.net Git - bcachefs-tools-debian/blob - libbcachefs/subvolume.c
Update bcachefs sources to 50d6a25d9c bcachefs: Erasure coding fixes
[bcachefs-tools-debian] / libbcachefs / subvolume.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 #include "bcachefs.h"
4 #include "btree_key_cache.h"
5 #include "btree_update.h"
6 #include "error.h"
7 #include "fs.h"
8 #include "subvolume.h"
9
10 /* Snapshot tree: */
11
12 static void bch2_delete_dead_snapshots_work(struct work_struct *);
13 static void bch2_delete_dead_snapshots(struct bch_fs *);
14
15 void bch2_snapshot_to_text(struct printbuf *out, struct bch_fs *c,
16                            struct bkey_s_c k)
17 {
18         struct bkey_s_c_snapshot s = bkey_s_c_to_snapshot(k);
19
20         pr_buf(out, "is_subvol %llu deleted %llu parent %u children %u %u subvol %u",
21                BCH_SNAPSHOT_SUBVOL(s.v),
22                BCH_SNAPSHOT_DELETED(s.v),
23                le32_to_cpu(s.v->parent),
24                le32_to_cpu(s.v->children[0]),
25                le32_to_cpu(s.v->children[1]),
26                le32_to_cpu(s.v->subvol));
27 }
28
29 const char *bch2_snapshot_invalid(const struct bch_fs *c, struct bkey_s_c k)
30 {
31         struct bkey_s_c_snapshot s;
32         u32 i, id;
33
34         if (bkey_cmp(k.k->p, POS(0, U32_MAX)) > 0 ||
35             bkey_cmp(k.k->p, POS(0, 1)) < 0)
36                 return "bad pos";
37
38         if (bkey_val_bytes(k.k) != sizeof(struct bch_snapshot))
39                 return "bad val size";
40
41         s = bkey_s_c_to_snapshot(k);
42
43         id = le32_to_cpu(s.v->parent);
44         if (id && id <= k.k->p.offset)
45                 return "bad parent node";
46
47         if (le32_to_cpu(s.v->children[0]) < le32_to_cpu(s.v->children[1]))
48                 return "children not normalized";
49
50         if (s.v->children[0] &&
51             s.v->children[0] == s.v->children[1])
52                 return "duplicate child nodes";
53
54         for (i = 0; i < 2; i++) {
55                 id = le32_to_cpu(s.v->children[i]);
56
57                 if (id >= k.k->p.offset)
58                         return "bad child node";
59         }
60
61         return NULL;
62 }
63
64 int bch2_mark_snapshot(struct btree_trans *trans,
65                        struct bkey_s_c old, struct bkey_s_c new,
66                        unsigned flags)
67 {
68         struct bch_fs *c = trans->c;
69         struct snapshot_t *t;
70
71         t = genradix_ptr_alloc(&c->snapshots,
72                                U32_MAX - new.k->p.offset,
73                                GFP_KERNEL);
74         if (!t)
75                 return -ENOMEM;
76
77         if (new.k->type == KEY_TYPE_snapshot) {
78                 struct bkey_s_c_snapshot s = bkey_s_c_to_snapshot(new);
79
80                 t->parent       = le32_to_cpu(s.v->parent);
81                 t->children[0]  = le32_to_cpu(s.v->children[0]);
82                 t->children[1]  = le32_to_cpu(s.v->children[1]);
83                 t->subvol       = BCH_SNAPSHOT_SUBVOL(s.v) ? le32_to_cpu(s.v->subvol) : 0;
84         } else {
85                 t->parent       = 0;
86                 t->children[0]  = 0;
87                 t->children[1]  = 0;
88                 t->subvol       = 0;
89         }
90
91         return 0;
92 }
93
94 static int snapshot_lookup(struct btree_trans *trans, u32 id,
95                            struct bch_snapshot *s)
96 {
97         struct btree_iter iter;
98         struct bkey_s_c k;
99         int ret;
100
101         bch2_trans_iter_init(trans, &iter, BTREE_ID_snapshots, POS(0, id),
102                              BTREE_ITER_WITH_UPDATES);
103         k = bch2_btree_iter_peek_slot(&iter);
104         ret = bkey_err(k) ?: k.k->type == KEY_TYPE_snapshot ? 0 : -ENOENT;
105
106         if (!ret)
107                 *s = *bkey_s_c_to_snapshot(k).v;
108
109         bch2_trans_iter_exit(trans, &iter);
110         return ret;
111 }
112
113 static int snapshot_live(struct btree_trans *trans, u32 id)
114 {
115         struct bch_snapshot v;
116         int ret;
117
118         if (!id)
119                 return 0;
120
121         ret = lockrestart_do(trans, snapshot_lookup(trans, id, &v));
122         if (ret == -ENOENT)
123                 bch_err(trans->c, "snapshot node %u not found", id);
124         if (ret)
125                 return ret;
126
127         return !BCH_SNAPSHOT_DELETED(&v);
128 }
129
130 static int bch2_snapshots_set_equiv(struct btree_trans *trans)
131 {
132         struct bch_fs *c = trans->c;
133         struct btree_iter iter;
134         struct bkey_s_c k;
135         struct bkey_s_c_snapshot snap;
136         unsigned i;
137         int ret;
138
139         for_each_btree_key(trans, iter, BTREE_ID_snapshots,
140                            POS_MIN, 0, k, ret) {
141                 u32 id = k.k->p.offset, child[2];
142                 unsigned nr_live = 0, live_idx;
143
144                 if (k.k->type != KEY_TYPE_snapshot)
145                         continue;
146
147                 snap = bkey_s_c_to_snapshot(k);
148                 child[0] = le32_to_cpu(snap.v->children[0]);
149                 child[1] = le32_to_cpu(snap.v->children[1]);
150
151                 for (i = 0; i < 2; i++) {
152                         ret = snapshot_live(trans, child[i]);
153                         if (ret < 0)
154                                 break;
155
156                         if (ret)
157                                 live_idx = i;
158                         nr_live += ret;
159                 }
160
161                 snapshot_t(c, id)->equiv = nr_live == 1
162                         ? snapshot_t(c, child[live_idx])->equiv
163                         : id;
164         }
165         bch2_trans_iter_exit(trans, &iter);
166
167         if (ret)
168                 bch_err(c, "error walking snapshots: %i", ret);
169
170         return ret;
171 }
172
173 /* fsck: */
174 static int bch2_snapshot_check(struct btree_trans *trans,
175                                struct bkey_s_c_snapshot s)
176 {
177         struct bch_subvolume subvol;
178         struct bch_snapshot v;
179         u32 i, id;
180         int ret;
181
182         id = le32_to_cpu(s.v->subvol);
183         ret = lockrestart_do(trans, bch2_subvolume_get(trans, id, 0, false, &subvol));
184         if (ret == -ENOENT)
185                 bch_err(trans->c, "snapshot node %llu has nonexistent subvolume %u",
186                         s.k->p.offset, id);
187         if (ret)
188                 return ret;
189
190         if (BCH_SNAPSHOT_SUBVOL(s.v) != (le32_to_cpu(subvol.snapshot) == s.k->p.offset)) {
191                 bch_err(trans->c, "snapshot node %llu has wrong BCH_SNAPSHOT_SUBVOL",
192                         s.k->p.offset);
193                 return -EINVAL;
194         }
195
196         id = le32_to_cpu(s.v->parent);
197         if (id) {
198                 ret = lockrestart_do(trans, snapshot_lookup(trans, id, &v));
199                 if (ret == -ENOENT)
200                         bch_err(trans->c, "snapshot node %llu has nonexistent parent %u",
201                                 s.k->p.offset, id);
202                 if (ret)
203                         return ret;
204
205                 if (le32_to_cpu(v.children[0]) != s.k->p.offset &&
206                     le32_to_cpu(v.children[1]) != s.k->p.offset) {
207                         bch_err(trans->c, "snapshot parent %u missing pointer to child %llu",
208                                 id, s.k->p.offset);
209                         return -EINVAL;
210                 }
211         }
212
213         for (i = 0; i < 2 && s.v->children[i]; i++) {
214                 id = le32_to_cpu(s.v->children[i]);
215
216                 ret = lockrestart_do(trans, snapshot_lookup(trans, id, &v));
217                 if (ret == -ENOENT)
218                         bch_err(trans->c, "snapshot node %llu has nonexistent child %u",
219                                 s.k->p.offset, id);
220                 if (ret)
221                         return ret;
222
223                 if (le32_to_cpu(v.parent) != s.k->p.offset) {
224                         bch_err(trans->c, "snapshot child %u has wrong parent (got %u should be %llu)",
225                                 id, le32_to_cpu(v.parent), s.k->p.offset);
226                         return -EINVAL;
227                 }
228         }
229
230         return 0;
231 }
232
233 int bch2_fs_snapshots_check(struct bch_fs *c)
234 {
235         struct btree_trans trans;
236         struct btree_iter iter;
237         struct bkey_s_c k;
238         struct bch_snapshot s;
239         unsigned id;
240         int ret;
241
242         bch2_trans_init(&trans, c, 0, 0);
243
244         for_each_btree_key(&trans, iter, BTREE_ID_snapshots,
245                            POS_MIN, 0, k, ret) {
246                 if (k.k->type != KEY_TYPE_snapshot)
247                         continue;
248
249                 ret = bch2_snapshot_check(&trans, bkey_s_c_to_snapshot(k));
250                 if (ret)
251                         break;
252         }
253         bch2_trans_iter_exit(&trans, &iter);
254
255         if (ret) {
256                 bch_err(c, "error %i checking snapshots", ret);
257                 goto err;
258         }
259
260         for_each_btree_key(&trans, iter, BTREE_ID_subvolumes,
261                            POS_MIN, 0, k, ret) {
262                 if (k.k->type != KEY_TYPE_subvolume)
263                         continue;
264 again_2:
265                 id = le32_to_cpu(bkey_s_c_to_subvolume(k).v->snapshot);
266                 ret = snapshot_lookup(&trans, id, &s);
267
268                 if (ret == -EINTR) {
269                         k = bch2_btree_iter_peek(&iter);
270                         goto again_2;
271                 } else if (ret == -ENOENT)
272                         bch_err(c, "subvolume %llu points to nonexistent snapshot %u",
273                                 k.k->p.offset, id);
274                 else if (ret)
275                         break;
276         }
277         bch2_trans_iter_exit(&trans, &iter);
278 err:
279         bch2_trans_exit(&trans);
280         return ret;
281 }
282
283 void bch2_fs_snapshots_exit(struct bch_fs *c)
284 {
285         genradix_free(&c->snapshots);
286 }
287
288 int bch2_fs_snapshots_start(struct bch_fs *c)
289 {
290         struct btree_trans trans;
291         struct btree_iter iter;
292         struct bkey_s_c k;
293         bool have_deleted = false;
294         int ret = 0;
295
296         bch2_trans_init(&trans, c, 0, 0);
297
298         for_each_btree_key(&trans, iter, BTREE_ID_snapshots,
299                            POS_MIN, 0, k, ret) {
300                if (bkey_cmp(k.k->p, POS(0, U32_MAX)) > 0)
301                        break;
302
303                 if (k.k->type != KEY_TYPE_snapshot) {
304                         bch_err(c, "found wrong key type %u in snapshot node table",
305                                 k.k->type);
306                         continue;
307                 }
308
309                 if (BCH_SNAPSHOT_DELETED(bkey_s_c_to_snapshot(k).v))
310                         have_deleted = true;
311
312                 ret = bch2_mark_snapshot(&trans, bkey_s_c_null, k, 0);
313                 if (ret)
314                         break;
315         }
316         bch2_trans_iter_exit(&trans, &iter);
317
318         if (ret)
319                 goto err;
320
321         ret = bch2_snapshots_set_equiv(&trans);
322         if (ret)
323                 goto err;
324 err:
325         bch2_trans_exit(&trans);
326
327         if (!ret && have_deleted) {
328                 bch_info(c, "restarting deletion of dead snapshots");
329                 if (c->opts.fsck) {
330                         bch2_delete_dead_snapshots_work(&c->snapshot_delete_work);
331                 } else {
332                         bch2_delete_dead_snapshots(c);
333                 }
334         }
335
336         return ret;
337 }
338
339 /*
340  * Mark a snapshot as deleted, for future cleanup:
341  */
342 static int bch2_snapshot_node_set_deleted(struct btree_trans *trans, u32 id)
343 {
344         struct btree_iter iter;
345         struct bkey_s_c k;
346         struct bkey_i_snapshot *s;
347         int ret = 0;
348
349         bch2_trans_iter_init(trans, &iter, BTREE_ID_snapshots, POS(0, id),
350                              BTREE_ITER_INTENT);
351         k = bch2_btree_iter_peek_slot(&iter);
352         ret = bkey_err(k);
353         if (ret)
354                 goto err;
355
356         if (k.k->type != KEY_TYPE_snapshot) {
357                 bch2_fs_inconsistent(trans->c, "missing snapshot %u", id);
358                 ret = -ENOENT;
359                 goto err;
360         }
361
362         /* already deleted? */
363         if (BCH_SNAPSHOT_DELETED(bkey_s_c_to_snapshot(k).v))
364                 goto err;
365
366         s = bch2_trans_kmalloc(trans, sizeof(*s));
367         ret = PTR_ERR_OR_ZERO(s);
368         if (ret)
369                 goto err;
370
371         bkey_reassemble(&s->k_i, k);
372
373         SET_BCH_SNAPSHOT_DELETED(&s->v, true);
374         ret = bch2_trans_update(trans, &iter, &s->k_i, 0);
375         if (ret)
376                 goto err;
377 err:
378         bch2_trans_iter_exit(trans, &iter);
379         return ret;
380 }
381
382 static int bch2_snapshot_node_delete(struct btree_trans *trans, u32 id)
383 {
384         struct btree_iter iter, p_iter = (struct btree_iter) { NULL };
385         struct bkey_s_c k;
386         struct bkey_s_c_snapshot s;
387         struct bkey_i_snapshot *parent;
388         u32 parent_id;
389         unsigned i;
390         int ret = 0;
391
392         bch2_trans_iter_init(trans, &iter, BTREE_ID_snapshots, POS(0, id),
393                              BTREE_ITER_INTENT);
394         k = bch2_btree_iter_peek_slot(&iter);
395         ret = bkey_err(k);
396         if (ret)
397                 goto err;
398
399         if (k.k->type != KEY_TYPE_snapshot) {
400                 bch2_fs_inconsistent(trans->c, "missing snapshot %u", id);
401                 ret = -ENOENT;
402                 goto err;
403         }
404
405         s = bkey_s_c_to_snapshot(k);
406
407         BUG_ON(!BCH_SNAPSHOT_DELETED(s.v));
408         parent_id = le32_to_cpu(s.v->parent);
409
410         if (parent_id) {
411                 bch2_trans_iter_init(trans, &p_iter, BTREE_ID_snapshots,
412                                      POS(0, parent_id),
413                                      BTREE_ITER_INTENT);
414                 k = bch2_btree_iter_peek_slot(&p_iter);
415                 ret = bkey_err(k);
416                 if (ret)
417                         goto err;
418
419                 if (k.k->type != KEY_TYPE_snapshot) {
420                         bch2_fs_inconsistent(trans->c, "missing snapshot %u", parent_id);
421                         ret = -ENOENT;
422                         goto err;
423                 }
424
425                 parent = bch2_trans_kmalloc(trans, sizeof(*parent));
426                 ret = PTR_ERR_OR_ZERO(parent);
427                 if (ret)
428                         goto err;
429
430                 bkey_reassemble(&parent->k_i, k);
431
432                 for (i = 0; i < 2; i++)
433                         if (le32_to_cpu(parent->v.children[i]) == id)
434                                 break;
435
436                 if (i == 2)
437                         bch_err(trans->c, "snapshot %u missing child pointer to %u",
438                                 parent_id, id);
439                 else
440                         parent->v.children[i] = 0;
441
442                 if (le32_to_cpu(parent->v.children[0]) <
443                     le32_to_cpu(parent->v.children[1]))
444                         swap(parent->v.children[0],
445                              parent->v.children[1]);
446
447                 ret = bch2_trans_update(trans, &p_iter, &parent->k_i, 0);
448                 if (ret)
449                         goto err;
450         }
451
452         ret = bch2_btree_delete_at(trans, &iter, 0);
453 err:
454         bch2_trans_iter_exit(trans, &p_iter);
455         bch2_trans_iter_exit(trans, &iter);
456         return ret;
457 }
458
459 static int bch2_snapshot_node_create(struct btree_trans *trans, u32 parent,
460                                      u32 *new_snapids,
461                                      u32 *snapshot_subvols,
462                                      unsigned nr_snapids)
463 {
464         struct btree_iter iter;
465         struct bkey_i_snapshot *n;
466         struct bkey_s_c k;
467         unsigned i;
468         int ret = 0;
469
470         bch2_trans_iter_init(trans, &iter, BTREE_ID_snapshots,
471                              POS_MIN, BTREE_ITER_INTENT);
472         k = bch2_btree_iter_peek(&iter);
473         ret = bkey_err(k);
474         if (ret)
475                 goto err;
476
477         for (i = 0; i < nr_snapids; i++) {
478                 k = bch2_btree_iter_prev_slot(&iter);
479                 ret = bkey_err(k);
480                 if (ret)
481                         goto err;
482
483                 if (!k.k || !k.k->p.offset) {
484                         ret = -ENOSPC;
485                         goto err;
486                 }
487
488                 n = bch2_trans_kmalloc(trans, sizeof(*n));
489                 ret = PTR_ERR_OR_ZERO(n);
490                 if (ret)
491                         return ret;
492
493                 bkey_snapshot_init(&n->k_i);
494                 n->k.p          = iter.pos;
495                 n->v.flags      = 0;
496                 n->v.parent     = cpu_to_le32(parent);
497                 n->v.subvol     = cpu_to_le32(snapshot_subvols[i]);
498                 n->v.pad        = 0;
499                 SET_BCH_SNAPSHOT_SUBVOL(&n->v, true);
500
501                 bch2_trans_update(trans, &iter, &n->k_i, 0);
502
503                 ret = bch2_mark_snapshot(trans, bkey_s_c_null, bkey_i_to_s_c(&n->k_i), 0);
504                 if (ret)
505                         break;
506
507                 new_snapids[i]  = iter.pos.offset;
508         }
509
510         if (parent) {
511                 bch2_btree_iter_set_pos(&iter, POS(0, parent));
512                 k = bch2_btree_iter_peek(&iter);
513                 ret = bkey_err(k);
514                 if (ret)
515                         goto err;
516
517                 if (k.k->type != KEY_TYPE_snapshot) {
518                         bch_err(trans->c, "snapshot %u not found", parent);
519                         ret = -ENOENT;
520                         goto err;
521                 }
522
523                 n = bch2_trans_kmalloc(trans, sizeof(*n));
524                 ret = PTR_ERR_OR_ZERO(n);
525                 if (ret)
526                         return ret;
527
528                 bkey_reassemble(&n->k_i, k);
529
530                 if (n->v.children[0] || n->v.children[1]) {
531                         bch_err(trans->c, "Trying to add child snapshot nodes to parent that already has children");
532                         ret = -EINVAL;
533                         goto err;
534                 }
535
536                 n->v.children[0] = cpu_to_le32(new_snapids[0]);
537                 n->v.children[1] = cpu_to_le32(new_snapids[1]);
538                 SET_BCH_SNAPSHOT_SUBVOL(&n->v, false);
539                 bch2_trans_update(trans, &iter, &n->k_i, 0);
540         }
541 err:
542         bch2_trans_iter_exit(trans, &iter);
543         return ret;
544 }
545
546 static int snapshot_id_add(struct snapshot_id_list *s, u32 id)
547 {
548         BUG_ON(snapshot_list_has_id(s, id));
549
550         if (s->nr == s->size) {
551                 size_t new_size = max(8U, s->size * 2);
552                 void *n = krealloc(s->d,
553                                    new_size * sizeof(s->d[0]),
554                                    GFP_KERNEL);
555                 if (!n) {
556                         pr_err("error allocating snapshot ID list");
557                         return -ENOMEM;
558                 }
559
560                 s->d    = n;
561                 s->size = new_size;
562         };
563
564         s->d[s->nr++] = id;
565         return 0;
566 }
567
568 static int bch2_snapshot_delete_keys_btree(struct btree_trans *trans,
569                                            struct snapshot_id_list *deleted,
570                                            enum btree_id btree_id)
571 {
572         struct bch_fs *c = trans->c;
573         struct btree_iter iter;
574         struct bkey_s_c k;
575         struct snapshot_id_list equiv_seen = { 0 };
576         struct bpos last_pos = POS_MIN;
577         int ret = 0;
578
579         /*
580          * XXX: We should also delete whiteouts that no longer overwrite
581          * anything
582          */
583
584         bch2_trans_iter_init(trans, &iter, btree_id, POS_MIN,
585                              BTREE_ITER_INTENT|
586                              BTREE_ITER_PREFETCH|
587                              BTREE_ITER_NOT_EXTENTS|
588                              BTREE_ITER_ALL_SNAPSHOTS);
589
590         while ((bch2_trans_begin(trans),
591                 (k = bch2_btree_iter_peek(&iter)).k) &&
592                !(ret = bkey_err(k))) {
593                 u32 equiv = snapshot_t(c, k.k->p.snapshot)->equiv;
594
595                 if (bkey_cmp(k.k->p, last_pos))
596                         equiv_seen.nr = 0;
597                 last_pos = k.k->p;
598
599                 if (snapshot_list_has_id(deleted, k.k->p.snapshot) ||
600                     snapshot_list_has_id(&equiv_seen, equiv)) {
601                         if (btree_id == BTREE_ID_inodes &&
602                             bch2_btree_key_cache_flush(trans, btree_id, iter.pos))
603                                 continue;
604
605                         ret = __bch2_trans_do(trans, NULL, NULL,
606                                               BTREE_INSERT_NOFAIL,
607                                 bch2_btree_iter_traverse(&iter) ?:
608                                 bch2_btree_delete_at(trans, &iter,
609                                         BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE));
610                         if (ret)
611                                 break;
612                 } else {
613                         ret = snapshot_id_add(&equiv_seen, equiv);
614                         if (ret)
615                                 break;
616                 }
617
618                 bch2_btree_iter_advance(&iter);
619         }
620         bch2_trans_iter_exit(trans, &iter);
621
622         kfree(equiv_seen.d);
623
624         return ret;
625 }
626
627 static void bch2_delete_dead_snapshots_work(struct work_struct *work)
628 {
629         struct bch_fs *c = container_of(work, struct bch_fs, snapshot_delete_work);
630         struct btree_trans trans;
631         struct btree_iter iter;
632         struct bkey_s_c k;
633         struct bkey_s_c_snapshot snap;
634         struct snapshot_id_list deleted = { 0 };
635         u32 i, id, children[2];
636         int ret = 0;
637
638         bch2_trans_init(&trans, c, 0, 0);
639
640         /*
641          * For every snapshot node: If we have no live children and it's not
642          * pointed to by a subvolume, delete it:
643          */
644         for_each_btree_key(&trans, iter, BTREE_ID_snapshots,
645                            POS_MIN, 0, k, ret) {
646                 if (k.k->type != KEY_TYPE_snapshot)
647                         continue;
648
649                 snap = bkey_s_c_to_snapshot(k);
650                 if (BCH_SNAPSHOT_DELETED(snap.v) ||
651                     BCH_SNAPSHOT_SUBVOL(snap.v))
652                         continue;
653
654                 children[0] = le32_to_cpu(snap.v->children[0]);
655                 children[1] = le32_to_cpu(snap.v->children[1]);
656
657                 ret   = snapshot_live(&trans, children[0]) ?:
658                         snapshot_live(&trans, children[1]);
659                 if (ret < 0)
660                         break;
661                 if (ret)
662                         continue;
663
664                 ret = __bch2_trans_do(&trans, NULL, NULL, 0,
665                         bch2_snapshot_node_set_deleted(&trans, iter.pos.offset));
666                 if (ret) {
667                         bch_err(c, "error deleting snapshot %llu: %i", iter.pos.offset, ret);
668                         break;
669                 }
670         }
671         bch2_trans_iter_exit(&trans, &iter);
672
673         if (ret) {
674                 bch_err(c, "error walking snapshots: %i", ret);
675                 goto err;
676         }
677
678         ret = bch2_snapshots_set_equiv(&trans);
679         if (ret)
680                 goto err;
681
682         for_each_btree_key(&trans, iter, BTREE_ID_snapshots,
683                            POS_MIN, 0, k, ret) {
684                 if (k.k->type != KEY_TYPE_snapshot)
685                         continue;
686
687                 snap = bkey_s_c_to_snapshot(k);
688                 if (BCH_SNAPSHOT_DELETED(snap.v)) {
689                         ret = snapshot_id_add(&deleted, k.k->p.offset);
690                         if (ret)
691                                 break;
692                 }
693         }
694         bch2_trans_iter_exit(&trans, &iter);
695
696         if (ret) {
697                 bch_err(c, "error walking snapshots: %i", ret);
698                 goto err;
699         }
700
701         for (id = 0; id < BTREE_ID_NR; id++) {
702                 if (!btree_type_has_snapshots(id))
703                         continue;
704
705                 ret = bch2_snapshot_delete_keys_btree(&trans, &deleted, id);
706                 if (ret) {
707                         bch_err(c, "error deleting snapshot keys: %i", ret);
708                         goto err;
709                 }
710         }
711
712         for (i = 0; i < deleted.nr; i++) {
713                 ret = __bch2_trans_do(&trans, NULL, NULL, 0,
714                         bch2_snapshot_node_delete(&trans, deleted.d[i]));
715                 if (ret) {
716                         bch_err(c, "error deleting snapshot %u: %i",
717                                 deleted.d[i], ret);
718                         goto err;
719                 }
720         }
721 err:
722         kfree(deleted.d);
723         bch2_trans_exit(&trans);
724         percpu_ref_put(&c->writes);
725 }
726
727 static void bch2_delete_dead_snapshots(struct bch_fs *c)
728 {
729         if (unlikely(!percpu_ref_tryget(&c->writes)))
730                 return;
731
732         if (!queue_work(system_long_wq, &c->snapshot_delete_work))
733                 percpu_ref_put(&c->writes);
734 }
735
736 static int bch2_delete_dead_snapshots_hook(struct btree_trans *trans,
737                                            struct btree_trans_commit_hook *h)
738 {
739         bch2_delete_dead_snapshots(trans->c);
740         return 0;
741 }
742
743 /* Subvolumes: */
744
745 const char *bch2_subvolume_invalid(const struct bch_fs *c, struct bkey_s_c k)
746 {
747         if (bkey_cmp(k.k->p, SUBVOL_POS_MIN) < 0)
748                 return "invalid pos";
749
750         if (bkey_cmp(k.k->p, SUBVOL_POS_MAX) > 0)
751                 return "invalid pos";
752
753         if (bkey_val_bytes(k.k) != sizeof(struct bch_subvolume))
754                 return "bad val size";
755
756         return NULL;
757 }
758
759 void bch2_subvolume_to_text(struct printbuf *out, struct bch_fs *c,
760                             struct bkey_s_c k)
761 {
762         struct bkey_s_c_subvolume s = bkey_s_c_to_subvolume(k);
763
764         pr_buf(out, "root %llu snapshot id %u",
765                le64_to_cpu(s.v->inode),
766                le32_to_cpu(s.v->snapshot));
767 }
768
769 int bch2_subvolume_get(struct btree_trans *trans, unsigned subvol,
770                        bool inconsistent_if_not_found,
771                        int iter_flags,
772                        struct bch_subvolume *s)
773 {
774         struct btree_iter iter;
775         struct bkey_s_c k;
776         int ret;
777
778         bch2_trans_iter_init(trans, &iter, BTREE_ID_subvolumes, POS(0, subvol),
779                              iter_flags);
780         k = bch2_btree_iter_peek_slot(&iter);
781         ret = bkey_err(k) ?: k.k->type == KEY_TYPE_subvolume ? 0 : -ENOENT;
782
783         if (ret == -ENOENT && inconsistent_if_not_found)
784                 bch2_fs_inconsistent(trans->c, "missing subvolume %u", subvol);
785         if (!ret)
786                 *s = *bkey_s_c_to_subvolume(k).v;
787
788         bch2_trans_iter_exit(trans, &iter);
789         return ret;
790 }
791
792 int bch2_snapshot_get_subvol(struct btree_trans *trans, u32 snapshot,
793                              struct bch_subvolume *subvol)
794 {
795         struct bch_snapshot snap;
796
797         return  snapshot_lookup(trans, snapshot, &snap) ?:
798                 bch2_subvolume_get(trans, le32_to_cpu(snap.subvol), true, 0, subvol);
799 }
800
801 int bch2_subvolume_get_snapshot(struct btree_trans *trans, u32 subvol,
802                                 u32 *snapid)
803 {
804         struct bch_subvolume s;
805         int ret;
806
807         ret = bch2_subvolume_get(trans, subvol, true,
808                                  BTREE_ITER_CACHED|
809                                  BTREE_ITER_WITH_UPDATES,
810                                  &s);
811
812         *snapid = le32_to_cpu(s.snapshot);
813         return ret;
814 }
815
816 /*
817  * Delete subvolume, mark snapshot ID as deleted, queue up snapshot
818  * deletion/cleanup:
819  */
820 int bch2_subvolume_delete(struct btree_trans *trans, u32 subvolid)
821 {
822         struct btree_iter iter;
823         struct bkey_s_c k;
824         struct bkey_s_c_subvolume subvol;
825         struct btree_trans_commit_hook *h;
826         struct bkey_i *delete;
827         u32 snapid;
828         int ret = 0;
829
830         bch2_trans_iter_init(trans, &iter, BTREE_ID_subvolumes,
831                              POS(0, subvolid),
832                              BTREE_ITER_CACHED|
833                              BTREE_ITER_INTENT);
834         k = bch2_btree_iter_peek_slot(&iter);
835         ret = bkey_err(k);
836         if (ret)
837                 goto err;
838
839         if (k.k->type != KEY_TYPE_subvolume) {
840                 bch2_fs_inconsistent(trans->c, "missing subvolume %u", subvolid);
841                 ret = -EIO;
842                 goto err;
843         }
844
845         subvol = bkey_s_c_to_subvolume(k);
846         snapid = le32_to_cpu(subvol.v->snapshot);
847
848         delete = bch2_trans_kmalloc(trans, sizeof(*delete));
849         ret = PTR_ERR_OR_ZERO(delete);
850         if (ret)
851                 goto err;
852
853         bkey_init(&delete->k);
854         delete->k.p = iter.pos;
855         ret = bch2_trans_update(trans, &iter, delete, 0);
856         if (ret)
857                 goto err;
858
859         ret = bch2_snapshot_node_set_deleted(trans, snapid);
860
861         h = bch2_trans_kmalloc(trans, sizeof(*h));
862         ret = PTR_ERR_OR_ZERO(h);
863         if (ret)
864                 goto err;
865
866         h->fn = bch2_delete_dead_snapshots_hook;
867         bch2_trans_commit_hook(trans, h);
868 err:
869         bch2_trans_iter_exit(trans, &iter);
870         return ret;
871 }
872
873 void bch2_subvolume_wait_for_pagecache_and_delete(struct work_struct *work)
874 {
875         struct bch_fs *c = container_of(work, struct bch_fs,
876                                 snapshot_wait_for_pagecache_and_delete_work);
877         struct snapshot_id_list s;
878         u32 *id;
879         int ret = 0;
880
881         while (!ret) {
882                 mutex_lock(&c->snapshots_unlinked_lock);
883                 s = c->snapshots_unlinked;
884                 memset(&c->snapshots_unlinked, 0, sizeof(c->snapshots_unlinked));
885                 mutex_unlock(&c->snapshots_unlinked_lock);
886
887                 if (!s.nr)
888                         break;
889
890                 bch2_evict_subvolume_inodes(c, &s);
891
892                 for (id = s.d; id < s.d + s.nr; id++) {
893                         ret = bch2_trans_do(c, NULL, NULL, BTREE_INSERT_NOFAIL,
894                                       bch2_subvolume_delete(&trans, *id));
895                         if (ret) {
896                                 bch_err(c, "error %i deleting subvolume %u", ret, *id);
897                                 break;
898                         }
899                 }
900
901                 kfree(s.d);
902         }
903
904         percpu_ref_put(&c->writes);
905 }
906
907 struct subvolume_unlink_hook {
908         struct btree_trans_commit_hook  h;
909         u32                             subvol;
910 };
911
912 int bch2_subvolume_wait_for_pagecache_and_delete_hook(struct btree_trans *trans,
913                                                       struct btree_trans_commit_hook *_h)
914 {
915         struct subvolume_unlink_hook *h = container_of(_h, struct subvolume_unlink_hook, h);
916         struct bch_fs *c = trans->c;
917         int ret = 0;
918
919         mutex_lock(&c->snapshots_unlinked_lock);
920         if (!snapshot_list_has_id(&c->snapshots_unlinked, h->subvol))
921                 ret = snapshot_id_add(&c->snapshots_unlinked, h->subvol);
922         mutex_unlock(&c->snapshots_unlinked_lock);
923
924         if (ret)
925                 return ret;
926
927         if (unlikely(!percpu_ref_tryget(&c->writes)))
928                 return -EROFS;
929
930         if (!queue_work(system_long_wq, &c->snapshot_wait_for_pagecache_and_delete_work))
931                 percpu_ref_put(&c->writes);
932         return 0;
933 }
934
935 int bch2_subvolume_unlink(struct btree_trans *trans, u32 subvolid)
936 {
937         struct btree_iter iter;
938         struct bkey_s_c k;
939         struct bkey_i_subvolume *n;
940         struct subvolume_unlink_hook *h;
941         int ret = 0;
942
943         bch2_trans_iter_init(trans, &iter, BTREE_ID_subvolumes,
944                              POS(0, subvolid),
945                              BTREE_ITER_CACHED|
946                              BTREE_ITER_INTENT);
947         k = bch2_btree_iter_peek_slot(&iter);
948         ret = bkey_err(k);
949         if (ret)
950                 goto err;
951
952         if (k.k->type != KEY_TYPE_subvolume) {
953                 bch2_fs_inconsistent(trans->c, "missing subvolume %u", subvolid);
954                 ret = -EIO;
955                 goto err;
956         }
957
958         n = bch2_trans_kmalloc(trans, sizeof(*n));
959         ret = PTR_ERR_OR_ZERO(n);
960         if (ret)
961                 goto err;
962
963         bkey_reassemble(&n->k_i, k);
964         SET_BCH_SUBVOLUME_UNLINKED(&n->v, true);
965
966         ret = bch2_trans_update(trans, &iter, &n->k_i, 0);
967         if (ret)
968                 goto err;
969
970         h = bch2_trans_kmalloc(trans, sizeof(*h));
971         ret = PTR_ERR_OR_ZERO(h);
972         if (ret)
973                 goto err;
974
975         h->h.fn         = bch2_subvolume_wait_for_pagecache_and_delete_hook;
976         h->subvol       = subvolid;
977         bch2_trans_commit_hook(trans, &h->h);
978 err:
979         bch2_trans_iter_exit(trans, &iter);
980         return ret;
981 }
982
983 int bch2_subvolume_create(struct btree_trans *trans, u64 inode,
984                           u32 src_subvolid,
985                           u32 *new_subvolid,
986                           u32 *new_snapshotid,
987                           bool ro)
988 {
989         struct bch_fs *c = trans->c;
990         struct btree_iter dst_iter, src_iter = (struct btree_iter) { NULL };
991         struct bkey_i_subvolume *new_subvol = NULL;
992         struct bkey_i_subvolume *src_subvol = NULL;
993         struct bkey_s_c k;
994         u32 parent = 0, new_nodes[2], snapshot_subvols[2];
995         int ret = 0;
996
997         for_each_btree_key(trans, dst_iter, BTREE_ID_subvolumes, SUBVOL_POS_MIN,
998                            BTREE_ITER_SLOTS|BTREE_ITER_INTENT, k, ret) {
999                 if (bkey_cmp(k.k->p, SUBVOL_POS_MAX) > 0)
1000                         break;
1001
1002                 /*
1003                  * bch2_subvolume_delete() doesn't flush the btree key cache -
1004                  * ideally it would but that's tricky
1005                  */
1006                 if (bkey_deleted(k.k) &&
1007                     !bch2_btree_key_cache_find(c, BTREE_ID_subvolumes, dst_iter.pos))
1008                         goto found_slot;
1009         }
1010
1011         if (!ret)
1012                 ret = -ENOSPC;
1013         goto err;
1014 found_slot:
1015         snapshot_subvols[0] = dst_iter.pos.offset;
1016         snapshot_subvols[1] = src_subvolid;
1017
1018         if (src_subvolid) {
1019                 /* Creating a snapshot: */
1020                 src_subvol = bch2_trans_kmalloc(trans, sizeof(*src_subvol));
1021                 ret = PTR_ERR_OR_ZERO(src_subvol);
1022                 if (ret)
1023                         goto err;
1024
1025                 bch2_trans_iter_init(trans, &src_iter, BTREE_ID_subvolumes,
1026                                      POS(0, src_subvolid),
1027                                      BTREE_ITER_CACHED|
1028                                      BTREE_ITER_INTENT);
1029                 k = bch2_btree_iter_peek_slot(&src_iter);
1030                 ret = bkey_err(k);
1031                 if (ret)
1032                         goto err;
1033
1034                 if (k.k->type != KEY_TYPE_subvolume) {
1035                         bch_err(c, "subvolume %u not found", src_subvolid);
1036                         ret = -ENOENT;
1037                         goto err;
1038                 }
1039
1040                 bkey_reassemble(&src_subvol->k_i, k);
1041                 parent = le32_to_cpu(src_subvol->v.snapshot);
1042         }
1043
1044         ret = bch2_snapshot_node_create(trans, parent, new_nodes,
1045                                         snapshot_subvols,
1046                                         src_subvolid ? 2 : 1);
1047         if (ret)
1048                 goto err;
1049
1050         if (src_subvolid) {
1051                 src_subvol->v.snapshot = cpu_to_le32(new_nodes[1]);
1052                 bch2_trans_update(trans, &src_iter, &src_subvol->k_i, 0);
1053         }
1054
1055         new_subvol = bch2_trans_kmalloc(trans, sizeof(*new_subvol));
1056         ret = PTR_ERR_OR_ZERO(new_subvol);
1057         if (ret)
1058                 goto err;
1059
1060         bkey_subvolume_init(&new_subvol->k_i);
1061         new_subvol->v.flags     = 0;
1062         new_subvol->v.snapshot  = cpu_to_le32(new_nodes[0]);
1063         new_subvol->v.inode     = cpu_to_le64(inode);
1064         SET_BCH_SUBVOLUME_RO(&new_subvol->v, ro);
1065         SET_BCH_SUBVOLUME_SNAP(&new_subvol->v, src_subvolid != 0);
1066         new_subvol->k.p         = dst_iter.pos;
1067         bch2_trans_update(trans, &dst_iter, &new_subvol->k_i, 0);
1068
1069         *new_subvolid   = new_subvol->k.p.offset;
1070         *new_snapshotid = new_nodes[0];
1071 err:
1072         bch2_trans_iter_exit(trans, &src_iter);
1073         bch2_trans_iter_exit(trans, &dst_iter);
1074         return ret;
1075 }
1076
1077 int bch2_fs_subvolumes_init(struct bch_fs *c)
1078 {
1079         INIT_WORK(&c->snapshot_delete_work, bch2_delete_dead_snapshots_work);
1080         INIT_WORK(&c->snapshot_wait_for_pagecache_and_delete_work,
1081                   bch2_subvolume_wait_for_pagecache_and_delete);
1082         mutex_init(&c->snapshots_unlinked_lock);
1083         return 0;
1084 }