]> git.sesse.net Git - bcachefs-tools-debian/blob - libbcachefs/inode.c
Update bcachefs sources to 70b5fb5daf bcachefs: Fix error reporting from bch2_journal...
[bcachefs-tools-debian] / libbcachefs / inode.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 #include "bcachefs.h"
4 #include "btree_key_cache.h"
5 #include "bkey_methods.h"
6 #include "btree_update.h"
7 #include "error.h"
8 #include "extents.h"
9 #include "extent_update.h"
10 #include "inode.h"
11 #include "str_hash.h"
12 #include "subvolume.h"
13 #include "varint.h"
14
15 #include <linux/random.h>
16
17 #include <asm/unaligned.h>
18
19 const char * const bch2_inode_opts[] = {
20 #define x(name, ...)    #name,
21         BCH_INODE_OPTS()
22 #undef  x
23         NULL,
24 };
25
26 static const u8 byte_table[8] = { 1, 2, 3, 4, 6, 8, 10, 13 };
27 static const u8 bits_table[8] = {
28         1  * 8 - 1,
29         2  * 8 - 2,
30         3  * 8 - 3,
31         4  * 8 - 4,
32         6  * 8 - 5,
33         8  * 8 - 6,
34         10 * 8 - 7,
35         13 * 8 - 8,
36 };
37
38 static int inode_decode_field(const u8 *in, const u8 *end,
39                               u64 out[2], unsigned *out_bits)
40 {
41         __be64 be[2] = { 0, 0 };
42         unsigned bytes, shift;
43         u8 *p;
44
45         if (in >= end)
46                 return -1;
47
48         if (!*in)
49                 return -1;
50
51         /*
52          * position of highest set bit indicates number of bytes:
53          * shift = number of bits to remove in high byte:
54          */
55         shift   = 8 - __fls(*in); /* 1 <= shift <= 8 */
56         bytes   = byte_table[shift - 1];
57
58         if (in + bytes > end)
59                 return -1;
60
61         p = (u8 *) be + 16 - bytes;
62         memcpy(p, in, bytes);
63         *p ^= (1 << 8) >> shift;
64
65         out[0] = be64_to_cpu(be[0]);
66         out[1] = be64_to_cpu(be[1]);
67         *out_bits = out[0] ? 64 + fls64(out[0]) : fls64(out[1]);
68
69         return bytes;
70 }
71
72 void bch2_inode_pack(struct bch_fs *c,
73                      struct bkey_inode_buf *packed,
74                      const struct bch_inode_unpacked *inode)
75 {
76         struct bkey_i_inode_v2 *k = &packed->inode;
77         u8 *out = k->v.fields;
78         u8 *end = (void *) &packed[1];
79         u8 *last_nonzero_field = out;
80         unsigned nr_fields = 0, last_nonzero_fieldnr = 0;
81         unsigned bytes;
82         int ret;
83
84         bkey_inode_v2_init(&packed->inode.k_i);
85         packed->inode.k.p.offset        = inode->bi_inum;
86         packed->inode.v.bi_journal_seq  = cpu_to_le64(inode->bi_journal_seq);
87         packed->inode.v.bi_hash_seed    = inode->bi_hash_seed;
88         packed->inode.v.bi_flags        = cpu_to_le64(inode->bi_flags);
89         packed->inode.v.bi_flags        = cpu_to_le64(inode->bi_flags);
90         packed->inode.v.bi_mode         = cpu_to_le16(inode->bi_mode);
91
92 #define x(_name, _bits)                                                 \
93         nr_fields++;                                                    \
94                                                                         \
95         if (inode->_name) {                                             \
96                 ret = bch2_varint_encode_fast(out, inode->_name);       \
97                 out += ret;                                             \
98                                                                         \
99                 if (_bits > 64)                                         \
100                         *out++ = 0;                                     \
101                                                                         \
102                 last_nonzero_field = out;                               \
103                 last_nonzero_fieldnr = nr_fields;                       \
104         } else {                                                        \
105                 *out++ = 0;                                             \
106                                                                         \
107                 if (_bits > 64)                                         \
108                         *out++ = 0;                                     \
109         }
110
111         BCH_INODE_FIELDS()
112 #undef  x
113         BUG_ON(out > end);
114
115         out = last_nonzero_field;
116         nr_fields = last_nonzero_fieldnr;
117
118         bytes = out - (u8 *) &packed->inode.v;
119         set_bkey_val_bytes(&packed->inode.k, bytes);
120         memset_u64s_tail(&packed->inode.v, 0, bytes);
121
122         SET_INODEv2_NR_FIELDS(&k->v, nr_fields);
123
124         if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG)) {
125                 struct bch_inode_unpacked unpacked;
126
127                 int ret = bch2_inode_unpack(bkey_i_to_s_c(&packed->inode.k_i),
128                                            &unpacked);
129                 BUG_ON(ret);
130                 BUG_ON(unpacked.bi_inum         != inode->bi_inum);
131                 BUG_ON(unpacked.bi_hash_seed    != inode->bi_hash_seed);
132                 BUG_ON(unpacked.bi_mode         != inode->bi_mode);
133
134 #define x(_name, _bits) if (unpacked._name != inode->_name)             \
135                         panic("unpacked %llu should be %llu",           \
136                               (u64) unpacked._name, (u64) inode->_name);
137                 BCH_INODE_FIELDS()
138 #undef  x
139         }
140 }
141
142 static noinline int bch2_inode_unpack_v1(struct bkey_s_c_inode inode,
143                                 struct bch_inode_unpacked *unpacked)
144 {
145         const u8 *in = inode.v->fields;
146         const u8 *end = bkey_val_end(inode);
147         u64 field[2];
148         unsigned fieldnr = 0, field_bits;
149         int ret;
150
151 #define x(_name, _bits)                                 \
152         if (fieldnr++ == INODE_NR_FIELDS(inode.v)) {                    \
153                 memset(&unpacked->_name, 0,                             \
154                        sizeof(*unpacked) -                              \
155                        offsetof(struct bch_inode_unpacked, _name));     \
156                 return 0;                                               \
157         }                                                               \
158                                                                         \
159         ret = inode_decode_field(in, end, field, &field_bits);          \
160         if (ret < 0)                                                    \
161                 return ret;                                             \
162                                                                         \
163         if (field_bits > sizeof(unpacked->_name) * 8)                   \
164                 return -1;                                              \
165                                                                         \
166         unpacked->_name = field[1];                                     \
167         in += ret;
168
169         BCH_INODE_FIELDS()
170 #undef  x
171
172         /* XXX: signal if there were more fields than expected? */
173         return 0;
174 }
175
176 static int bch2_inode_unpack_v2(struct bch_inode_unpacked *unpacked,
177                                 const u8 *in, const u8 *end,
178                                 unsigned nr_fields)
179 {
180         unsigned fieldnr = 0;
181         int ret;
182         u64 v[2];
183
184 #define x(_name, _bits)                                                 \
185         if (fieldnr < nr_fields) {                                      \
186                 ret = bch2_varint_decode_fast(in, end, &v[0]);          \
187                 if (ret < 0)                                            \
188                         return ret;                                     \
189                 in += ret;                                              \
190                                                                         \
191                 if (_bits > 64) {                                       \
192                         ret = bch2_varint_decode_fast(in, end, &v[1]);  \
193                         if (ret < 0)                                    \
194                                 return ret;                             \
195                         in += ret;                                      \
196                 } else {                                                \
197                         v[1] = 0;                                       \
198                 }                                                       \
199         } else {                                                        \
200                 v[0] = v[1] = 0;                                        \
201         }                                                               \
202                                                                         \
203         unpacked->_name = v[0];                                         \
204         if (v[1] || v[0] != unpacked->_name)                            \
205                 return -1;                                              \
206         fieldnr++;
207
208         BCH_INODE_FIELDS()
209 #undef  x
210
211         /* XXX: signal if there were more fields than expected? */
212         return 0;
213 }
214
215 int bch2_inode_unpack(struct bkey_s_c k,
216                       struct bch_inode_unpacked *unpacked)
217 {
218         switch (k.k->type) {
219         case KEY_TYPE_inode: {
220                 struct bkey_s_c_inode inode = bkey_s_c_to_inode(k);
221
222                 unpacked->bi_inum       = inode.k->p.offset;
223                 unpacked->bi_journal_seq= 0;
224                 unpacked->bi_hash_seed  = inode.v->bi_hash_seed;
225                 unpacked->bi_flags      = le32_to_cpu(inode.v->bi_flags);
226                 unpacked->bi_mode       = le16_to_cpu(inode.v->bi_mode);
227
228                 if (INODE_NEW_VARINT(inode.v)) {
229                         return bch2_inode_unpack_v2(unpacked, inode.v->fields,
230                                                     bkey_val_end(inode),
231                                                     INODE_NR_FIELDS(inode.v));
232                 } else {
233                         return bch2_inode_unpack_v1(inode, unpacked);
234                 }
235                 break;
236         }
237         case KEY_TYPE_inode_v2: {
238                 struct bkey_s_c_inode_v2 inode = bkey_s_c_to_inode_v2(k);
239
240                 unpacked->bi_inum       = inode.k->p.offset;
241                 unpacked->bi_journal_seq= le64_to_cpu(inode.v->bi_journal_seq);
242                 unpacked->bi_hash_seed  = inode.v->bi_hash_seed;
243                 unpacked->bi_flags      = le64_to_cpu(inode.v->bi_flags);
244                 unpacked->bi_mode       = le16_to_cpu(inode.v->bi_mode);
245
246                 return bch2_inode_unpack_v2(unpacked, inode.v->fields,
247                                             bkey_val_end(inode),
248                                             INODEv2_NR_FIELDS(inode.v));
249         }
250         default:
251                 BUG();
252         }
253 }
254
255 int bch2_inode_peek(struct btree_trans *trans,
256                     struct btree_iter *iter,
257                     struct bch_inode_unpacked *inode,
258                     subvol_inum inum, unsigned flags)
259 {
260         struct bkey_s_c k;
261         u32 snapshot;
262         int ret;
263
264         if (0 && trans->c->opts.inodes_use_key_cache)
265                 flags |= BTREE_ITER_CACHED;
266
267         ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
268         if (ret)
269                 return ret;
270
271         bch2_trans_iter_init(trans, iter, BTREE_ID_inodes,
272                              SPOS(0, inum.inum, snapshot), flags);
273         k = bch2_btree_iter_peek_slot(iter);
274         ret = bkey_err(k);
275         if (ret)
276                 goto err;
277
278         ret = bkey_is_inode(k.k) ? 0 : -ENOENT;
279         if (ret)
280                 goto err;
281
282         ret = bch2_inode_unpack(k, inode);
283         if (ret)
284                 goto err;
285
286         return 0;
287 err:
288         bch2_trans_iter_exit(trans, iter);
289         return ret;
290 }
291
292 int bch2_inode_write(struct btree_trans *trans,
293                      struct btree_iter *iter,
294                      struct bch_inode_unpacked *inode)
295 {
296         struct bkey_inode_buf *inode_p;
297
298         inode_p = bch2_trans_kmalloc(trans, sizeof(*inode_p));
299         if (IS_ERR(inode_p))
300                 return PTR_ERR(inode_p);
301
302         bch2_inode_pack(trans->c, inode_p, inode);
303         inode_p->inode.k.p.snapshot = iter->snapshot;
304         return bch2_trans_update(trans, iter, &inode_p->inode.k_i, 0);
305 }
306
307 const char *bch2_inode_invalid(const struct bch_fs *c, struct bkey_s_c k)
308 {
309         struct bkey_s_c_inode inode = bkey_s_c_to_inode(k);
310         struct bch_inode_unpacked unpacked;
311
312         if (k.k->p.inode)
313                 return "nonzero k.p.inode";
314
315         if (bkey_val_bytes(k.k) < sizeof(struct bch_inode))
316                 return "incorrect value size";
317
318         if (k.k->p.offset < BLOCKDEV_INODE_MAX)
319                 return "fs inode in blockdev range";
320
321         if (INODE_STR_HASH(inode.v) >= BCH_STR_HASH_NR)
322                 return "invalid str hash type";
323
324         if (bch2_inode_unpack(k, &unpacked))
325                 return "invalid variable length fields";
326
327         if (unpacked.bi_data_checksum >= BCH_CSUM_OPT_NR + 1)
328                 return "invalid data checksum type";
329
330         if (unpacked.bi_compression >= BCH_COMPRESSION_OPT_NR + 1)
331                 return "invalid data checksum type";
332
333         if ((unpacked.bi_flags & BCH_INODE_UNLINKED) &&
334             unpacked.bi_nlink != 0)
335                 return "flagged as unlinked but bi_nlink != 0";
336
337         if (unpacked.bi_subvol && !S_ISDIR(unpacked.bi_mode))
338                 return "subvolume root but not a directory";
339
340         return NULL;
341 }
342
343 const char *bch2_inode_v2_invalid(const struct bch_fs *c, struct bkey_s_c k)
344 {
345         struct bkey_s_c_inode_v2 inode = bkey_s_c_to_inode_v2(k);
346         struct bch_inode_unpacked unpacked;
347
348         if (k.k->p.inode)
349                 return "nonzero k.p.inode";
350
351         if (bkey_val_bytes(k.k) < sizeof(struct bch_inode))
352                 return "incorrect value size";
353
354         if (k.k->p.offset < BLOCKDEV_INODE_MAX)
355                 return "fs inode in blockdev range";
356
357         if (INODEv2_STR_HASH(inode.v) >= BCH_STR_HASH_NR)
358                 return "invalid str hash type";
359
360         if (bch2_inode_unpack(k, &unpacked))
361                 return "invalid variable length fields";
362
363         if (unpacked.bi_data_checksum >= BCH_CSUM_OPT_NR + 1)
364                 return "invalid data checksum type";
365
366         if (unpacked.bi_compression >= BCH_COMPRESSION_OPT_NR + 1)
367                 return "invalid data checksum type";
368
369         if ((unpacked.bi_flags & BCH_INODE_UNLINKED) &&
370             unpacked.bi_nlink != 0)
371                 return "flagged as unlinked but bi_nlink != 0";
372
373         if (unpacked.bi_subvol && !S_ISDIR(unpacked.bi_mode))
374                 return "subvolume root but not a directory";
375
376         return NULL;
377 }
378
379 static void __bch2_inode_unpacked_to_text(struct printbuf *out, struct bch_inode_unpacked *inode)
380 {
381         pr_buf(out, "mode %o flags %x journal_seq %llu",
382                inode->bi_mode, inode->bi_flags,
383                inode->bi_journal_seq);
384
385 #define x(_name, _bits)                                         \
386         pr_buf(out, " "#_name " %llu", (u64) inode->_name);
387         BCH_INODE_FIELDS()
388 #undef  x
389 }
390
391 void bch2_inode_unpacked_to_text(struct printbuf *out, struct bch_inode_unpacked *inode)
392 {
393         pr_buf(out, "inum: %llu ", inode->bi_inum);
394         __bch2_inode_unpacked_to_text(out, inode);
395 }
396
397 void bch2_inode_to_text(struct printbuf *out, struct bch_fs *c,
398                        struct bkey_s_c k)
399 {
400         struct bch_inode_unpacked inode;
401
402         if (bch2_inode_unpack(k, &inode)) {
403                 pr_buf(out, "(unpack error)");
404                 return;
405         }
406
407         __bch2_inode_unpacked_to_text(out, &inode);
408 }
409
410 const char *bch2_inode_generation_invalid(const struct bch_fs *c,
411                                           struct bkey_s_c k)
412 {
413         if (k.k->p.inode)
414                 return "nonzero k.p.inode";
415
416         if (bkey_val_bytes(k.k) != sizeof(struct bch_inode_generation))
417                 return "incorrect value size";
418
419         return NULL;
420 }
421
422 void bch2_inode_generation_to_text(struct printbuf *out, struct bch_fs *c,
423                                    struct bkey_s_c k)
424 {
425         struct bkey_s_c_inode_generation gen = bkey_s_c_to_inode_generation(k);
426
427         pr_buf(out, "generation: %u", le32_to_cpu(gen.v->bi_generation));
428 }
429
430 void bch2_inode_init_early(struct bch_fs *c,
431                            struct bch_inode_unpacked *inode_u)
432 {
433         enum bch_str_hash_type str_hash =
434                 bch2_str_hash_opt_to_type(c, c->opts.str_hash);
435
436         memset(inode_u, 0, sizeof(*inode_u));
437
438         /* ick */
439         inode_u->bi_flags |= str_hash << INODE_STR_HASH_OFFSET;
440         get_random_bytes(&inode_u->bi_hash_seed,
441                          sizeof(inode_u->bi_hash_seed));
442 }
443
444 void bch2_inode_init_late(struct bch_inode_unpacked *inode_u, u64 now,
445                           uid_t uid, gid_t gid, umode_t mode, dev_t rdev,
446                           struct bch_inode_unpacked *parent)
447 {
448         inode_u->bi_mode        = mode;
449         inode_u->bi_uid         = uid;
450         inode_u->bi_gid         = gid;
451         inode_u->bi_dev         = rdev;
452         inode_u->bi_atime       = now;
453         inode_u->bi_mtime       = now;
454         inode_u->bi_ctime       = now;
455         inode_u->bi_otime       = now;
456
457         if (parent && parent->bi_mode & S_ISGID) {
458                 inode_u->bi_gid = parent->bi_gid;
459                 if (S_ISDIR(mode))
460                         inode_u->bi_mode |= S_ISGID;
461         }
462
463         if (parent) {
464 #define x(_name, ...)   inode_u->bi_##_name = parent->bi_##_name;
465                 BCH_INODE_OPTS()
466 #undef x
467         }
468 }
469
470 void bch2_inode_init(struct bch_fs *c, struct bch_inode_unpacked *inode_u,
471                      uid_t uid, gid_t gid, umode_t mode, dev_t rdev,
472                      struct bch_inode_unpacked *parent)
473 {
474         bch2_inode_init_early(c, inode_u);
475         bch2_inode_init_late(inode_u, bch2_current_time(c),
476                              uid, gid, mode, rdev, parent);
477 }
478
479 static inline u32 bkey_generation(struct bkey_s_c k)
480 {
481         switch (k.k->type) {
482         case KEY_TYPE_inode:
483         case KEY_TYPE_inode_v2:
484                 BUG();
485         case KEY_TYPE_inode_generation:
486                 return le32_to_cpu(bkey_s_c_to_inode_generation(k).v->bi_generation);
487         default:
488                 return 0;
489         }
490 }
491
492 /*
493  * This just finds an empty slot:
494  */
495 int bch2_inode_create(struct btree_trans *trans,
496                       struct btree_iter *iter,
497                       struct bch_inode_unpacked *inode_u,
498                       u32 snapshot, u64 cpu)
499 {
500         struct bch_fs *c = trans->c;
501         struct bkey_s_c k;
502         u64 min, max, start, pos, *hint;
503         int ret = 0;
504         unsigned bits = (c->opts.inodes_32bit ? 31 : 63);
505
506         if (c->opts.shard_inode_numbers) {
507                 bits -= c->inode_shard_bits;
508
509                 min = (cpu << bits);
510                 max = (cpu << bits) | ~(ULLONG_MAX << bits);
511
512                 min = max_t(u64, min, BLOCKDEV_INODE_MAX);
513                 hint = c->unused_inode_hints + cpu;
514         } else {
515                 min = BLOCKDEV_INODE_MAX;
516                 max = ~(ULLONG_MAX << bits);
517                 hint = c->unused_inode_hints;
518         }
519
520         start = READ_ONCE(*hint);
521
522         if (start >= max || start < min)
523                 start = min;
524
525         pos = start;
526         bch2_trans_iter_init(trans, iter, BTREE_ID_inodes, POS(0, pos),
527                              BTREE_ITER_ALL_SNAPSHOTS|
528                              BTREE_ITER_INTENT);
529 again:
530         while ((k = bch2_btree_iter_peek(iter)).k &&
531                !(ret = bkey_err(k)) &&
532                bkey_cmp(k.k->p, POS(0, max)) < 0) {
533                 while (pos < iter->pos.offset) {
534                         if (!bch2_btree_key_cache_find(c, BTREE_ID_inodes, POS(0, pos)))
535                                 goto found_slot;
536
537                         pos++;
538                 }
539
540                 if (k.k->p.snapshot == snapshot &&
541                     !bkey_is_inode(k.k) &&
542                     !bch2_btree_key_cache_find(c, BTREE_ID_inodes, SPOS(0, pos, snapshot))) {
543                         bch2_btree_iter_advance(iter);
544                         continue;
545                 }
546
547                 /*
548                  * We don't need to iterate over keys in every snapshot once
549                  * we've found just one:
550                  */
551                 pos = iter->pos.offset + 1;
552                 bch2_btree_iter_set_pos(iter, POS(0, pos));
553         }
554
555         while (!ret && pos < max) {
556                 if (!bch2_btree_key_cache_find(c, BTREE_ID_inodes, POS(0, pos)))
557                         goto found_slot;
558
559                 pos++;
560         }
561
562         if (!ret && start == min)
563                 ret = -ENOSPC;
564
565         if (ret) {
566                 bch2_trans_iter_exit(trans, iter);
567                 return ret;
568         }
569
570         /* Retry from start */
571         pos = start = min;
572         bch2_btree_iter_set_pos(iter, POS(0, pos));
573         goto again;
574 found_slot:
575         bch2_btree_iter_set_pos(iter, SPOS(0, pos, snapshot));
576         k = bch2_btree_iter_peek_slot(iter);
577         ret = bkey_err(k);
578         if (ret) {
579                 bch2_trans_iter_exit(trans, iter);
580                 return ret;
581         }
582
583         /* We may have raced while the iterator wasn't pointing at pos: */
584         if (bkey_is_inode(k.k) ||
585             bch2_btree_key_cache_find(c, BTREE_ID_inodes, k.k->p))
586                 goto again;
587
588         *hint                   = k.k->p.offset;
589         inode_u->bi_inum        = k.k->p.offset;
590         inode_u->bi_generation  = bkey_generation(k);
591         return 0;
592 }
593
594 static int bch2_inode_delete_keys(struct btree_trans *trans,
595                                   subvol_inum inum, enum btree_id id)
596 {
597         u64 offset = 0;
598         int ret = 0;
599
600         while (!ret || ret == -EINTR) {
601                 struct btree_iter iter;
602                 struct bkey_s_c k;
603                 struct bkey_i delete;
604                 u32 snapshot;
605
606                 bch2_trans_begin(trans);
607
608                 ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
609                 if (ret)
610                         continue;
611
612                 bch2_trans_iter_init(trans, &iter, id,
613                                      SPOS(inum.inum, offset, snapshot),
614                                      BTREE_ITER_INTENT);
615                 k = bch2_btree_iter_peek(&iter);
616
617                 if (!k.k || iter.pos.inode != inum.inum) {
618                         bch2_trans_iter_exit(trans, &iter);
619                         break;
620                 }
621
622                 ret = bkey_err(k);
623                 if (ret)
624                         goto err;
625
626                 bkey_init(&delete.k);
627                 delete.k.p = iter.pos;
628
629                 if (btree_node_type_is_extents(iter.btree_id)) {
630                         unsigned max_sectors =
631                                 min_t(u64, U64_MAX - iter.pos.offset,
632                                       KEY_SIZE_MAX & (~0 << trans->c->block_bits));
633
634                         /* create the biggest key we can */
635                         bch2_key_resize(&delete.k, max_sectors);
636
637                         ret = bch2_extent_trim_atomic(trans, &iter, &delete);
638                         if (ret)
639                                 goto err;
640                 }
641
642                 ret = bch2_trans_update(trans, &iter, &delete, 0) ?:
643                       bch2_trans_commit(trans, NULL, NULL,
644                                         BTREE_INSERT_NOFAIL);
645 err:
646                 offset = iter.pos.offset;
647                 bch2_trans_iter_exit(trans, &iter);
648         }
649
650         return ret;
651 }
652
653 int bch2_inode_rm(struct bch_fs *c, subvol_inum inum, bool cached)
654 {
655         struct btree_trans trans;
656         struct btree_iter iter = { NULL };
657         struct bkey_i_inode_generation delete;
658         struct bch_inode_unpacked inode_u;
659         struct bkey_s_c k;
660         unsigned iter_flags = BTREE_ITER_INTENT;
661         u32 snapshot;
662         int ret;
663
664         if (0 && cached && c->opts.inodes_use_key_cache)
665                 iter_flags |= BTREE_ITER_CACHED;
666
667         bch2_trans_init(&trans, c, 0, 1024);
668
669         /*
670          * If this was a directory, there shouldn't be any real dirents left -
671          * but there could be whiteouts (from hash collisions) that we should
672          * delete:
673          *
674          * XXX: the dirent could ideally would delete whiteouts when they're no
675          * longer needed
676          */
677         ret   = bch2_inode_delete_keys(&trans, inum, BTREE_ID_extents) ?:
678                 bch2_inode_delete_keys(&trans, inum, BTREE_ID_xattrs) ?:
679                 bch2_inode_delete_keys(&trans, inum, BTREE_ID_dirents);
680         if (ret)
681                 goto err;
682 retry:
683         bch2_trans_begin(&trans);
684
685         ret = bch2_subvolume_get_snapshot(&trans, inum.subvol, &snapshot);
686         if (ret)
687                 goto err;
688
689         bch2_trans_iter_init(&trans, &iter, BTREE_ID_inodes,
690                              SPOS(0, inum.inum, snapshot), iter_flags);
691         k = bch2_btree_iter_peek_slot(&iter);
692
693         ret = bkey_err(k);
694         if (ret)
695                 goto err;
696
697         if (!bkey_is_inode(k.k)) {
698                 bch2_fs_inconsistent(trans.c,
699                                      "inode %llu not found when deleting",
700                                      inum.inum);
701                 ret = -EIO;
702                 goto err;
703         }
704
705         bch2_inode_unpack(k, &inode_u);
706
707         /* Subvolume root? */
708         BUG_ON(inode_u.bi_subvol);
709
710         bkey_inode_generation_init(&delete.k_i);
711         delete.k.p = iter.pos;
712         delete.v.bi_generation = cpu_to_le32(inode_u.bi_generation + 1);
713
714         ret   = bch2_trans_update(&trans, &iter, &delete.k_i, 0) ?:
715                 bch2_trans_commit(&trans, NULL, NULL,
716                                 BTREE_INSERT_NOFAIL);
717 err:
718         bch2_trans_iter_exit(&trans, &iter);
719         if (ret == -EINTR)
720                 goto retry;
721
722         bch2_trans_exit(&trans);
723         return ret;
724 }
725
726 int bch2_inode_find_by_inum_trans(struct btree_trans *trans,
727                                   subvol_inum inum,
728                                   struct bch_inode_unpacked *inode)
729 {
730         struct btree_iter iter;
731         int ret;
732
733         ret = bch2_inode_peek(trans, &iter, inode, inum, 0);
734         if (!ret)
735                 bch2_trans_iter_exit(trans, &iter);
736         return ret;
737 }
738
739 int bch2_inode_find_by_inum(struct bch_fs *c, subvol_inum inum,
740                             struct bch_inode_unpacked *inode)
741 {
742         return bch2_trans_do(c, NULL, NULL, 0,
743                 bch2_inode_find_by_inum_trans(&trans, inum, inode));
744 }