]> git.sesse.net Git - bcachefs-tools-debian/blob - libbcachefs/inode.c
Update bcachefs sources to 2e70771b8d
[bcachefs-tools-debian] / libbcachefs / inode.c
1
2 #include "bcachefs.h"
3 #include "bkey_methods.h"
4 #include "btree_update.h"
5 #include "extents.h"
6 #include "inode.h"
7 #include "io.h"
8 #include "keylist.h"
9
10 #include <linux/random.h>
11
12 #include <asm/unaligned.h>
13
14 #define FIELD_BYTES()                                           \
15
16 static const u8 byte_table[8] = { 1, 2, 3, 4, 6, 8, 10, 13 };
17 static const u8 bits_table[8] = {
18         1  * 8 - 1,
19         2  * 8 - 2,
20         3  * 8 - 3,
21         4  * 8 - 4,
22         6  * 8 - 5,
23         8  * 8 - 6,
24         10 * 8 - 7,
25         13 * 8 - 8,
26 };
27
28 static int inode_encode_field(u8 *out, u8 *end, u64 hi, u64 lo)
29 {
30         __be64 in[2] = { cpu_to_be64(hi), cpu_to_be64(lo), };
31         unsigned shift, bytes, bits = likely(!hi)
32                 ? fls64(lo)
33                 : fls64(hi) + 64;
34
35         for (shift = 1; shift <= 8; shift++)
36                 if (bits < bits_table[shift - 1])
37                         goto got_shift;
38
39         BUG();
40 got_shift:
41         bytes = byte_table[shift - 1];
42
43         BUG_ON(out + bytes > end);
44
45         memcpy(out, (u8 *) in + 16 - bytes, bytes);
46         *out |= (1 << 8) >> shift;
47
48         return bytes;
49 }
50
51 static int inode_decode_field(const u8 *in, const u8 *end,
52                               u64 out[2], unsigned *out_bits)
53 {
54         __be64 be[2] = { 0, 0 };
55         unsigned bytes, shift;
56         u8 *p;
57
58         if (in >= end)
59                 return -1;
60
61         if (!*in)
62                 return -1;
63
64         /*
65          * position of highest set bit indicates number of bytes:
66          * shift = number of bits to remove in high byte:
67          */
68         shift   = 8 - __fls(*in); /* 1 <= shift <= 8 */
69         bytes   = byte_table[shift - 1];
70
71         if (in + bytes > end)
72                 return -1;
73
74         p = (u8 *) be + 16 - bytes;
75         memcpy(p, in, bytes);
76         *p ^= (1 << 8) >> shift;
77
78         out[0] = be64_to_cpu(be[0]);
79         out[1] = be64_to_cpu(be[1]);
80         *out_bits = out[0] ? 64 + fls64(out[0]) : fls64(out[1]);
81
82         return bytes;
83 }
84
85 void bch2_inode_pack(struct bkey_inode_buf *packed,
86                      const struct bch_inode_unpacked *inode)
87 {
88         u8 *out = packed->inode.v.fields;
89         u8 *end = (void *) &packed[1];
90         u8 *last_nonzero_field = out;
91         unsigned nr_fields = 0, last_nonzero_fieldnr = 0;
92
93         bkey_inode_init(&packed->inode.k_i);
94         packed->inode.k.p.inode         = inode->inum;
95         packed->inode.v.i_hash_seed     = inode->i_hash_seed;
96         packed->inode.v.i_flags         = cpu_to_le32(inode->i_flags);
97         packed->inode.v.i_mode          = cpu_to_le16(inode->i_mode);
98
99 #define BCH_INODE_FIELD(_name, _bits)                                   \
100         out += inode_encode_field(out, end, 0, inode->_name);           \
101         nr_fields++;                                                    \
102                                                                         \
103         if (inode->_name) {                                             \
104                 last_nonzero_field = out;                               \
105                 last_nonzero_fieldnr = nr_fields;                       \
106         }
107
108         BCH_INODE_FIELDS()
109 #undef  BCH_INODE_FIELD
110
111         out = last_nonzero_field;
112         nr_fields = last_nonzero_fieldnr;
113
114         set_bkey_val_bytes(&packed->inode.k, out - (u8 *) &packed->inode.v);
115         memset(out, 0,
116                (u8 *) &packed->inode.v +
117                bkey_val_bytes(&packed->inode.k) - out);
118
119         SET_INODE_NR_FIELDS(&packed->inode.v, nr_fields);
120
121         if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG)) {
122                 struct bch_inode_unpacked unpacked;
123
124                 int ret = bch2_inode_unpack(inode_i_to_s_c(&packed->inode),
125                                            &unpacked);
126                 BUG_ON(ret);
127                 BUG_ON(unpacked.inum            != inode->inum);
128                 BUG_ON(unpacked.i_hash_seed     != inode->i_hash_seed);
129                 BUG_ON(unpacked.i_mode          != inode->i_mode);
130
131 #define BCH_INODE_FIELD(_name, _bits)   BUG_ON(unpacked._name != inode->_name);
132                 BCH_INODE_FIELDS()
133 #undef  BCH_INODE_FIELD
134         }
135 }
136
137 int bch2_inode_unpack(struct bkey_s_c_inode inode,
138                       struct bch_inode_unpacked *unpacked)
139 {
140         const u8 *in = inode.v->fields;
141         const u8 *end = (void *) inode.v + bkey_val_bytes(inode.k);
142         u64 field[2];
143         unsigned fieldnr = 0, field_bits;
144         int ret;
145
146         unpacked->inum          = inode.k->p.inode;
147         unpacked->i_hash_seed   = inode.v->i_hash_seed;
148         unpacked->i_flags       = le32_to_cpu(inode.v->i_flags);
149         unpacked->i_mode        = le16_to_cpu(inode.v->i_mode);
150
151 #define BCH_INODE_FIELD(_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  BCH_INODE_FIELD
171
172         /* XXX: signal if there were more fields than expected? */
173
174         return 0;
175 }
176
177 static const char *bch2_inode_invalid(const struct bch_fs *c,
178                                       struct bkey_s_c k)
179 {
180         if (k.k->p.offset)
181                 return "nonzero offset";
182
183         switch (k.k->type) {
184         case BCH_INODE_FS: {
185                 struct bkey_s_c_inode inode = bkey_s_c_to_inode(k);
186                 struct bch_inode_unpacked unpacked;
187
188                 if (bkey_val_bytes(k.k) < sizeof(struct bch_inode))
189                         return "incorrect value size";
190
191                 if (k.k->p.inode < BLOCKDEV_INODE_MAX)
192                         return "fs inode in blockdev range";
193
194                 if (INODE_STR_HASH(inode.v) >= BCH_STR_HASH_NR)
195                         return "invalid str hash type";
196
197                 if (bch2_inode_unpack(inode, &unpacked))
198                         return "invalid variable length fields";
199
200                 return NULL;
201         }
202         case BCH_INODE_BLOCKDEV:
203                 if (bkey_val_bytes(k.k) != sizeof(struct bch_inode_blockdev))
204                         return "incorrect value size";
205
206                 if (k.k->p.inode >= BLOCKDEV_INODE_MAX)
207                         return "blockdev inode in fs range";
208
209                 return NULL;
210         default:
211                 return "invalid type";
212         }
213 }
214
215 static void bch2_inode_to_text(struct bch_fs *c, char *buf,
216                                size_t size, struct bkey_s_c k)
217 {
218         struct bkey_s_c_inode inode;
219         struct bch_inode_unpacked unpacked;
220
221         switch (k.k->type) {
222         case BCH_INODE_FS:
223                 inode = bkey_s_c_to_inode(k);
224                 if (bch2_inode_unpack(inode, &unpacked)) {
225                         scnprintf(buf, size, "(unpack error)");
226                         break;
227                 }
228
229                 scnprintf(buf, size, "i_size %llu", unpacked.i_size);
230                 break;
231         }
232 }
233
234 const struct bkey_ops bch2_bkey_inode_ops = {
235         .key_invalid    = bch2_inode_invalid,
236         .val_to_text    = bch2_inode_to_text,
237 };
238
239 void bch2_inode_init(struct bch_fs *c, struct bch_inode_unpacked *inode_u,
240                      uid_t uid, gid_t gid, umode_t mode, dev_t rdev)
241 {
242         s64 now = timespec_to_bch2_time(c, CURRENT_TIME);
243
244         memset(inode_u, 0, sizeof(*inode_u));
245
246         /* ick */
247         inode_u->i_flags |= c->sb.str_hash_type << INODE_STR_HASH_OFFSET;
248         get_random_bytes(&inode_u->i_hash_seed, sizeof(inode_u->i_hash_seed));
249
250         inode_u->i_mode         = mode;
251         inode_u->i_uid          = uid;
252         inode_u->i_gid          = gid;
253         inode_u->i_dev          = rdev;
254         inode_u->i_atime        = now;
255         inode_u->i_mtime        = now;
256         inode_u->i_ctime        = now;
257         inode_u->i_otime        = now;
258 }
259
260 int bch2_inode_create(struct bch_fs *c, struct bkey_i *inode,
261                       u64 min, u64 max, u64 *hint)
262 {
263         struct btree_iter iter;
264         bool searched_from_start = false;
265         int ret;
266
267         if (!max)
268                 max = ULLONG_MAX;
269
270         if (c->opts.inodes_32bit)
271                 max = min_t(u64, max, U32_MAX);
272
273         if (*hint >= max || *hint < min)
274                 *hint = min;
275
276         if (*hint == min)
277                 searched_from_start = true;
278 again:
279         bch2_btree_iter_init(&iter, c, BTREE_ID_INODES, POS(*hint, 0),
280                              BTREE_ITER_INTENT);
281
282         while (1) {
283                 struct bkey_s_c k = bch2_btree_iter_peek_with_holes(&iter);
284
285                 ret = btree_iter_err(k);
286                 if (ret) {
287                         bch2_btree_iter_unlock(&iter);
288                         return ret;
289                 }
290
291                 if (k.k->type < BCH_INODE_FS) {
292                         inode->k.p = k.k->p;
293
294                         pr_debug("inserting inode %llu (size %u)",
295                                  inode->k.p.inode, inode->k.u64s);
296
297                         ret = bch2_btree_insert_at(c, NULL, NULL, NULL,
298                                         BTREE_INSERT_ATOMIC,
299                                         BTREE_INSERT_ENTRY(&iter, inode));
300
301                         if (ret == -EINTR)
302                                 continue;
303
304                         bch2_btree_iter_unlock(&iter);
305                         if (!ret)
306                                 *hint = k.k->p.inode + 1;
307
308                         return ret;
309                 } else {
310                         if (iter.pos.inode == max)
311                                 break;
312                         /* slot used */
313                         bch2_btree_iter_advance_pos(&iter);
314                 }
315         }
316         bch2_btree_iter_unlock(&iter);
317
318         if (!searched_from_start) {
319                 /* Retry from start */
320                 *hint = min;
321                 searched_from_start = true;
322                 goto again;
323         }
324
325         return -ENOSPC;
326 }
327
328 int bch2_inode_truncate(struct bch_fs *c, u64 inode_nr, u64 new_size,
329                         struct extent_insert_hook *hook, u64 *journal_seq)
330 {
331         return bch2_discard(c, POS(inode_nr, new_size), POS(inode_nr + 1, 0),
332                            ZERO_VERSION, NULL, hook, journal_seq);
333 }
334
335 int bch2_inode_rm(struct bch_fs *c, u64 inode_nr)
336 {
337         struct bkey_i delete;
338         int ret;
339
340         ret = bch2_inode_truncate(c, inode_nr, 0, NULL, NULL);
341         if (ret < 0)
342                 return ret;
343
344         ret = bch2_btree_delete_range(c, BTREE_ID_XATTRS,
345                                      POS(inode_nr, 0),
346                                      POS(inode_nr + 1, 0),
347                                      ZERO_VERSION, NULL, NULL, NULL);
348         if (ret < 0)
349                 return ret;
350
351         /*
352          * If this was a directory, there shouldn't be any real dirents left -
353          * but there could be whiteouts (from hash collisions) that we should
354          * delete:
355          *
356          * XXX: the dirent could ideally would delete whitouts when they're no
357          * longer needed
358          */
359         ret = bch2_btree_delete_range(c, BTREE_ID_DIRENTS,
360                                      POS(inode_nr, 0),
361                                      POS(inode_nr + 1, 0),
362                                      ZERO_VERSION, NULL, NULL, NULL);
363         if (ret < 0)
364                 return ret;
365
366         bkey_init(&delete.k);
367         delete.k.p.inode = inode_nr;
368
369         return bch2_btree_insert(c, BTREE_ID_INODES, &delete, NULL,
370                                 NULL, NULL, BTREE_INSERT_NOFAIL);
371 }
372
373 int bch2_inode_find_by_inum(struct bch_fs *c, u64 inode_nr,
374                             struct bch_inode_unpacked *inode)
375 {
376         struct btree_iter iter;
377         struct bkey_s_c k;
378         int ret = -ENOENT;
379
380         for_each_btree_key(&iter, c, BTREE_ID_INODES,
381                            POS(inode_nr, 0),
382                            BTREE_ITER_WITH_HOLES, k) {
383                 switch (k.k->type) {
384                 case BCH_INODE_FS:
385                         ret = bch2_inode_unpack(bkey_s_c_to_inode(k), inode);
386                         break;
387                 default:
388                         /* hole, not found */
389                         break;
390                 }
391
392                 break;
393
394         }
395
396         return bch2_btree_iter_unlock(&iter) ?: ret;
397 }
398
399 int bch2_cached_dev_inode_find_by_uuid(struct bch_fs *c, uuid_le *uuid,
400                                        struct bkey_i_inode_blockdev *ret)
401 {
402         struct btree_iter iter;
403         struct bkey_s_c k;
404
405         for_each_btree_key(&iter, c, BTREE_ID_INODES, POS(0, 0), 0, k) {
406                 if (k.k->p.inode >= BLOCKDEV_INODE_MAX)
407                         break;
408
409                 if (k.k->type == BCH_INODE_BLOCKDEV) {
410                         struct bkey_s_c_inode_blockdev inode =
411                                 bkey_s_c_to_inode_blockdev(k);
412
413                         pr_debug("found inode %llu: %pU (u64s %u)",
414                                  inode.k->p.inode, inode.v->i_uuid.b,
415                                  inode.k->u64s);
416
417                         if (CACHED_DEV(inode.v) &&
418                             !memcmp(uuid, &inode.v->i_uuid, 16)) {
419                                 bkey_reassemble(&ret->k_i, k);
420                                 bch2_btree_iter_unlock(&iter);
421                                 return 0;
422                         }
423                 }
424
425                 bch2_btree_iter_cond_resched(&iter);
426         }
427         bch2_btree_iter_unlock(&iter);
428         return -ENOENT;
429 }
430
431 #ifdef CONFIG_BCACHEFS_DEBUG
432 void bch2_inode_pack_test(void)
433 {
434         struct bch_inode_unpacked *u, test_inodes[] = {
435                 {
436                         .i_atime        = U64_MAX,
437                         .i_ctime        = U64_MAX,
438                         .i_mtime        = U64_MAX,
439                         .i_otime        = U64_MAX,
440                         .i_size         = U64_MAX,
441                         .i_sectors      = U64_MAX,
442                         .i_uid          = U32_MAX,
443                         .i_gid          = U32_MAX,
444                         .i_nlink        = U32_MAX,
445                         .i_generation   = U32_MAX,
446                         .i_dev          = U32_MAX,
447                 },
448         };
449
450         for (u = test_inodes;
451              u < test_inodes + ARRAY_SIZE(test_inodes);
452              u++) {
453                 struct bkey_inode_buf p;
454
455                 bch2_inode_pack(&p, u);
456         }
457 }
458 #endif