• Home
  • Raw
  • Download

Lines Matching +full:time +full:- +full:slots

1 // SPDX-License-Identifier: GPL-2.0
9 #include "inode-item.h"
10 #include "disk-io.h"
12 #include "print-tree.h"
13 #include "space-info.h"
15 #include "extent-tree.h"
16 #include "file-item.h"
36 if (len != name->len) in btrfs_find_name_in_backref()
38 if (memcmp_extent_buffer(leaf, name->name, name_ptr, in btrfs_find_name_in_backref()
39 name->len) == 0) in btrfs_find_name_in_backref()
61 * looking through any collisions so most of the time this is in btrfs_find_name_in_ext_backref()
67 name_ptr = (unsigned long)(&extref->name); in btrfs_find_name_in_ext_backref()
70 if (ref_name_len == name->len && in btrfs_find_name_in_ext_backref()
72 (memcmp_extent_buffer(leaf, name->name, name_ptr, in btrfs_find_name_in_ext_backref()
73 name->len) == 0)) in btrfs_find_name_in_ext_backref()
95 key.offset = btrfs_extref_hash(ref_objectid, name->name, name->len); in btrfs_lookup_inode_extref()
102 return btrfs_find_name_in_ext_backref(path->nodes[0], path->slots[0], in btrfs_lookup_inode_extref()
118 int del_len = name->len + sizeof(*extref); in btrfs_del_inode_extref()
125 key.offset = btrfs_extref_hash(ref_objectid, name->name, name->len); in btrfs_del_inode_extref()
129 return -ENOMEM; in btrfs_del_inode_extref()
131 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); in btrfs_del_inode_extref()
133 ret = -ENOENT; in btrfs_del_inode_extref()
138 * Sanity check - did we find the right item for this name? in btrfs_del_inode_extref()
142 extref = btrfs_find_name_in_ext_backref(path->nodes[0], path->slots[0], in btrfs_del_inode_extref()
145 btrfs_handle_fs_error(root->fs_info, -ENOENT, NULL); in btrfs_del_inode_extref()
146 ret = -EROFS; in btrfs_del_inode_extref()
150 leaf = path->nodes[0]; in btrfs_del_inode_extref()
151 item_size = btrfs_item_size(leaf, path->slots[0]); in btrfs_del_inode_extref()
165 item_start = btrfs_item_ptr_offset(leaf, path->slots[0]); in btrfs_del_inode_extref()
168 item_size - (ptr + del_len - item_start)); in btrfs_del_inode_extref()
170 btrfs_truncate_item(trans, path, item_size - del_len, 1); in btrfs_del_inode_extref()
192 int del_len = name->len + sizeof(*ref); in btrfs_del_inode_ref()
200 return -ENOMEM; in btrfs_del_inode_ref()
202 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); in btrfs_del_inode_ref()
204 ret = -ENOENT; in btrfs_del_inode_ref()
211 ref = btrfs_find_name_in_backref(path->nodes[0], path->slots[0], name); in btrfs_del_inode_ref()
213 ret = -ENOENT; in btrfs_del_inode_ref()
217 leaf = path->nodes[0]; in btrfs_del_inode_ref()
218 item_size = btrfs_item_size(leaf, path->slots[0]); in btrfs_del_inode_ref()
228 sub_item_len = name->len + sizeof(*ref); in btrfs_del_inode_ref()
229 item_start = btrfs_item_ptr_offset(leaf, path->slots[0]); in btrfs_del_inode_ref()
231 item_size - (ptr + sub_item_len - item_start)); in btrfs_del_inode_ref()
232 btrfs_truncate_item(trans, path, item_size - sub_item_len, 1); in btrfs_del_inode_ref()
250 * btrfs_insert_inode_extref() - Inserts an extended inode ref into a tree.
262 int ins_len = name->len + sizeof(*extref); in btrfs_insert_inode_extref()
270 key.offset = btrfs_extref_hash(ref_objectid, name->name, name->len); in btrfs_insert_inode_extref()
274 return -ENOMEM; in btrfs_insert_inode_extref()
278 if (ret == -EEXIST) { in btrfs_insert_inode_extref()
279 if (btrfs_find_name_in_ext_backref(path->nodes[0], in btrfs_insert_inode_extref()
280 path->slots[0], in btrfs_insert_inode_extref()
291 leaf = path->nodes[0]; in btrfs_insert_inode_extref()
292 ptr = (unsigned long)btrfs_item_ptr(leaf, path->slots[0], char); in btrfs_insert_inode_extref()
293 ptr += btrfs_item_size(leaf, path->slots[0]) - ins_len; in btrfs_insert_inode_extref()
296 btrfs_set_inode_extref_name_len(path->nodes[0], extref, name->len); in btrfs_insert_inode_extref()
297 btrfs_set_inode_extref_index(path->nodes[0], extref, index); in btrfs_insert_inode_extref()
298 btrfs_set_inode_extref_parent(path->nodes[0], extref, ref_objectid); in btrfs_insert_inode_extref()
300 ptr = (unsigned long)&extref->name; in btrfs_insert_inode_extref()
301 write_extent_buffer(path->nodes[0], name->name, ptr, name->len); in btrfs_insert_inode_extref()
302 btrfs_mark_buffer_dirty(trans, path->nodes[0]); in btrfs_insert_inode_extref()
309 /* Will return 0, -ENOMEM, -EMLINK, or -EEXIST or anything from the CoW path */
314 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_insert_inode_ref()
320 int ins_len = name->len + sizeof(*ref); in btrfs_insert_inode_ref()
328 return -ENOMEM; in btrfs_insert_inode_ref()
330 path->skip_release_on_error = 1; in btrfs_insert_inode_ref()
333 if (ret == -EEXIST) { in btrfs_insert_inode_ref()
335 ref = btrfs_find_name_in_backref(path->nodes[0], path->slots[0], in btrfs_insert_inode_ref()
340 old_size = btrfs_item_size(path->nodes[0], path->slots[0]); in btrfs_insert_inode_ref()
342 ref = btrfs_item_ptr(path->nodes[0], path->slots[0], in btrfs_insert_inode_ref()
345 btrfs_set_inode_ref_name_len(path->nodes[0], ref, name->len); in btrfs_insert_inode_ref()
346 btrfs_set_inode_ref_index(path->nodes[0], ref, index); in btrfs_insert_inode_ref()
350 if (ret == -EOVERFLOW) { in btrfs_insert_inode_ref()
351 if (btrfs_find_name_in_backref(path->nodes[0], in btrfs_insert_inode_ref()
352 path->slots[0], in btrfs_insert_inode_ref()
354 ret = -EEXIST; in btrfs_insert_inode_ref()
356 ret = -EMLINK; in btrfs_insert_inode_ref()
360 ref = btrfs_item_ptr(path->nodes[0], path->slots[0], in btrfs_insert_inode_ref()
362 btrfs_set_inode_ref_name_len(path->nodes[0], ref, name->len); in btrfs_insert_inode_ref()
363 btrfs_set_inode_ref_index(path->nodes[0], ref, index); in btrfs_insert_inode_ref()
366 write_extent_buffer(path->nodes[0], name->name, ptr, name->len); in btrfs_insert_inode_ref()
367 btrfs_mark_buffer_dirty(trans, path->nodes[0]); in btrfs_insert_inode_ref()
372 if (ret == -EMLINK) { in btrfs_insert_inode_ref()
373 struct btrfs_super_block *disk_super = fs_info->super_copy; in btrfs_insert_inode_ref()
405 int ins_len = mod < 0 ? -1 : 0; in btrfs_lookup_inode()
413 if (ret > 0 && location->type == BTRFS_ROOT_ITEM_KEY && in btrfs_lookup_inode()
414 location->offset == (u64)-1 && path->slots[0] != 0) { in btrfs_lookup_inode()
415 slot = path->slots[0] - 1; in btrfs_lookup_inode()
416 leaf = path->nodes[0]; in btrfs_lookup_inode()
418 if (found_key.objectid == location->objectid && in btrfs_lookup_inode()
419 found_key.type == location->type) { in btrfs_lookup_inode()
420 path->slots[0]--; in btrfs_lookup_inode()
463 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_truncate_inode_items()
469 u64 new_size = control->new_size; in btrfs_truncate_inode_items()
473 u32 found_type = (u8)-1; in btrfs_truncate_inode_items()
477 int extent_type = -1; in btrfs_truncate_inode_items()
482 ASSERT(control->inode || !control->clear_extent_range); in btrfs_truncate_inode_items()
483 ASSERT(new_size == 0 || control->min_type == BTRFS_EXTENT_DATA_KEY); in btrfs_truncate_inode_items()
485 control->last_size = new_size; in btrfs_truncate_inode_items()
486 control->sub_bytes = 0; in btrfs_truncate_inode_items()
489 * For shareable roots we want to back off from time to time, this turns in btrfs_truncate_inode_items()
492 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) in btrfs_truncate_inode_items()
497 return -ENOMEM; in btrfs_truncate_inode_items()
498 path->reada = READA_BACK; in btrfs_truncate_inode_items()
500 key.objectid = control->ino; in btrfs_truncate_inode_items()
501 key.offset = (u64)-1; in btrfs_truncate_inode_items()
502 key.type = (u8)-1; in btrfs_truncate_inode_items()
507 * huge file in a single leaf. Most of the time that bytes_deleted is in btrfs_truncate_inode_items()
508 * > 0, it will be huge by the time we get here in btrfs_truncate_inode_items()
512 ret = -EAGAIN; in btrfs_truncate_inode_items()
516 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); in btrfs_truncate_inode_items()
523 if (path->slots[0] == 0) in btrfs_truncate_inode_items()
525 path->slots[0]--; in btrfs_truncate_inode_items()
533 leaf = path->nodes[0]; in btrfs_truncate_inode_items()
534 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); in btrfs_truncate_inode_items()
537 if (found_key.objectid != control->ino) in btrfs_truncate_inode_items()
540 if (found_type < control->min_type) in btrfs_truncate_inode_items()
545 fi = btrfs_item_ptr(leaf, path->slots[0], in btrfs_truncate_inode_items()
554 btrfs_trace_truncate(control->inode, leaf, fi, in btrfs_truncate_inode_items()
556 path->slots[0]); in btrfs_truncate_inode_items()
557 item_end--; in btrfs_truncate_inode_items()
559 if (found_type > control->min_type) { in btrfs_truncate_inode_items()
574 control->extents_found++; in btrfs_truncate_inode_items()
584 extent_num_bytes = ALIGN(new_size - in btrfs_truncate_inode_items()
586 fs_info->sectorsize); in btrfs_truncate_inode_items()
587 clear_start = ALIGN(new_size, fs_info->sectorsize); in btrfs_truncate_inode_items()
591 num_dec = (orig_num_bytes - extent_num_bytes); in btrfs_truncate_inode_items()
593 control->sub_bytes += num_dec; in btrfs_truncate_inode_items()
598 extent_offset = found_key.offset - in btrfs_truncate_inode_items()
604 control->sub_bytes += num_dec; in btrfs_truncate_inode_items()
616 u32 size = (u32)(new_size - found_key.offset); in btrfs_truncate_inode_items()
634 clear_len = fs_info->sectorsize; in btrfs_truncate_inode_items()
637 control->sub_bytes += item_end + 1 - new_size; in btrfs_truncate_inode_items()
645 if (control->clear_extent_range) { in btrfs_truncate_inode_items()
646 ret = btrfs_inode_clear_file_extent_range(control->inode, in btrfs_truncate_inode_items()
656 ((path->slots[0] + 1) == pending_del_slot)); in btrfs_truncate_inode_items()
658 control->last_size = found_key.offset; in btrfs_truncate_inode_items()
661 pending_del_slot = path->slots[0]; in btrfs_truncate_inode_items()
663 } else if (path->slots[0] + 1 == pending_del_slot) { in btrfs_truncate_inode_items()
666 pending_del_slot = path->slots[0]; in btrfs_truncate_inode_items()
669 control->last_size = new_size; in btrfs_truncate_inode_items()
673 if (del_item && extent_start != 0 && !control->skip_ref_updates) { in btrfs_truncate_inode_items()
681 control->ino, extent_offset, in btrfs_truncate_inode_items()
682 root->root_key.objectid, false); in btrfs_truncate_inode_items()
695 if (path->slots[0] == 0 || in btrfs_truncate_inode_items()
696 path->slots[0] != pending_del_slot || in btrfs_truncate_inode_items()
724 ret = -EAGAIN; in btrfs_truncate_inode_items()
730 path->slots[0]--; in btrfs_truncate_inode_items()
745 ASSERT(control->last_size >= new_size); in btrfs_truncate_inode_items()
746 if (!ret && control->last_size > new_size) in btrfs_truncate_inode_items()
747 control->last_size = new_size; in btrfs_truncate_inode_items()