^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright 1999 Hans Reiser, see reiserfs/README for licensing and copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * details
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/buffer_head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "reiserfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * access to tail : when one is going to read tail it must make sure, that is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * not running. direct2indirect and indirect2direct can not run concurrently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Converts direct items to an unformatted node. Panics if file has no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * tail. -ENOSPC if no disk space for conversion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * path points to first direct item of the file regardless of how many of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * them are there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) int direct2indirect(struct reiserfs_transaction_handle *th, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct treepath *path, struct buffer_head *unbh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) loff_t tail_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct super_block *sb = inode->i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct buffer_head *up_to_date_bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct item_head *p_le_ih = tp_item_head(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) unsigned long total_tail = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* Key to search for the last byte of the converted item. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct cpu_key end_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * new indirect item to be inserted or key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * of unfm pointer to be pasted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) struct item_head ind_ih;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) int blk_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* returned value for reiserfs_insert_item and clones */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* Handle on an unformatted node that will be inserted in the tree. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) unp_t unfm_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) BUG_ON(!th->t_trans_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) REISERFS_SB(sb)->s_direct2indirect++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) blk_size = sb->s_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * and key to search for append or insert pointer to the new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * unformatted node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) copy_item_head(&ind_ih, p_le_ih);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) set_le_ih_k_offset(&ind_ih, tail_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) set_le_ih_k_type(&ind_ih, TYPE_INDIRECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* Set the key to search for the place for new unfm pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) make_cpu_key(&end_key, inode, tail_offset, TYPE_INDIRECT, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* FIXME: we could avoid this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if (search_for_position_by_key(sb, &end_key, path) == POSITION_FOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) reiserfs_error(sb, "PAP-14030",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) "pasted or inserted byte exists in "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) "the tree %K. Use fsck to repair.", &end_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) pathrelse(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) p_le_ih = tp_item_head(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) unfm_ptr = cpu_to_le32(unbh->b_blocknr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (is_statdata_le_ih(p_le_ih)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /* Insert new indirect item. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) set_ih_free_space(&ind_ih, 0); /* delete at nearest future */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) put_ih_item_len(&ind_ih, UNFM_P_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) PATH_LAST_POSITION(path)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) retval =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) reiserfs_insert_item(th, path, &end_key, &ind_ih, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) (char *)&unfm_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* Paste into last indirect item of an object. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) retval = reiserfs_paste_into_item(th, path, &end_key, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) (char *)&unfm_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) UNFM_P_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * note: from here there are two keys which have matching first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * three key components. They only differ by the fourth one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* Set the key to search for the direct items of the file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) make_cpu_key(&end_key, inode, max_reiserfs_offset(inode), TYPE_DIRECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * Move bytes from the direct items to the new unformatted node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * and delete them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) int tail_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * end_key.k_offset is set so, that we will always have found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * last item of the file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) if (search_for_position_by_key(sb, &end_key, path) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) POSITION_FOUND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) reiserfs_panic(sb, "PAP-14050",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) "direct item (%K) not found", &end_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) p_le_ih = tp_item_head(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) RFALSE(!is_direct_le_ih(p_le_ih),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) "vs-14055: direct item expected(%K), found %h",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) &end_key, p_le_ih);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) tail_size = (le_ih_k_offset(p_le_ih) & (blk_size - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) + ih_item_len(p_le_ih) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * we only send the unbh pointer if the buffer is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * up to date. this avoids overwriting good data from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * writepage() with old data from the disk or buffer cache
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * Special case: unbh->b_page will be NULL if we are coming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * through DIRECT_IO handler here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (!unbh->b_page || buffer_uptodate(unbh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) || PageUptodate(unbh->b_page)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) up_to_date_bh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) up_to_date_bh = unbh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) retval = reiserfs_delete_item(th, path, &end_key, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) up_to_date_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) total_tail += retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* done: file does not have direct items anymore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) if (tail_size == retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * if we've copied bytes from disk into the page, we need to zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * out the unused part of the block (it was not up to date before)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) if (up_to_date_bh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) unsigned pgoff =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) (tail_offset + total_tail - 1) & (PAGE_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) char *kaddr = kmap_atomic(up_to_date_bh->b_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) memset(kaddr + pgoff, 0, blk_size - total_tail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) kunmap_atomic(kaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) REISERFS_I(inode)->i_first_direct_byte = U32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /* stolen from fs/buffer.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) void reiserfs_unmap_buffer(struct buffer_head *bh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) lock_buffer(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) if (buffer_journaled(bh) || buffer_journal_dirty(bh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) clear_buffer_dirty(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * Remove the buffer from whatever list it belongs to. We are mostly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * interested in removing it from per-sb j_dirty_buffers list, to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * BUG() on attempt to write not mapped buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if ((!list_empty(&bh->b_assoc_buffers) || bh->b_private) && bh->b_page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct inode *inode = bh->b_page->mapping->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) struct reiserfs_journal *j = SB_JOURNAL(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) spin_lock(&j->j_dirty_buffers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) list_del_init(&bh->b_assoc_buffers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) reiserfs_free_jh(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) spin_unlock(&j->j_dirty_buffers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) clear_buffer_mapped(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) clear_buffer_req(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) clear_buffer_new(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) bh->b_bdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) unlock_buffer(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * this first locks inode (neither reads nor sync are permitted),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * reads tail through page cache, insert direct item. When direct item
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * inserted successfully inode is left locked. Return value is always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * what we expect from it (number of cut bytes). But when tail remains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * in the unformatted node, we set mode to SKIP_BALANCING and unlock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) int indirect2direct(struct reiserfs_transaction_handle *th,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) struct inode *inode, struct page *page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct treepath *path, /* path to the indirect item. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) const struct cpu_key *item_key, /* Key to look for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) * unformatted node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) * pointer to be cut. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) loff_t n_new_file_size, /* New file size. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) char *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct super_block *sb = inode->i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct item_head s_ih;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) unsigned long block_size = sb->s_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) char *tail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) int tail_len, round_tail_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) loff_t pos, pos1; /* position of first byte of the tail */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct cpu_key key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) BUG_ON(!th->t_trans_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) REISERFS_SB(sb)->s_indirect2direct++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) *mode = M_SKIP_BALANCING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) /* store item head path points to. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) copy_item_head(&s_ih, tp_item_head(path));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) tail_len = (n_new_file_size & (block_size - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) if (get_inode_sd_version(inode) == STAT_DATA_V2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) round_tail_len = ROUND_UP(tail_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) round_tail_len = tail_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) pos =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) le_ih_k_offset(&s_ih) - 1 + (ih_item_len(&s_ih) / UNFM_P_SIZE -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 1) * sb->s_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) pos1 = pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * we are protected by i_mutex. The tail can not disapper, not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * append can be done either
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * we are in truncate or packing tail in file_release
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) tail = (char *)kmap(page); /* this can schedule */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (path_changed(&s_ih, path)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) /* re-search indirect item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if (search_for_position_by_key(sb, item_key, path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) == POSITION_NOT_FOUND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) reiserfs_panic(sb, "PAP-5520",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) "item to be converted %K does not exist",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) item_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) copy_item_head(&s_ih, tp_item_head(path));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #ifdef CONFIG_REISERFS_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) pos = le_ih_k_offset(&s_ih) - 1 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) (ih_item_len(&s_ih) / UNFM_P_SIZE -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 1) * sb->s_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) if (pos != pos1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) reiserfs_panic(sb, "vs-5530", "tail position "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) "changed while we were reading it");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /* Set direct item header to insert. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) make_le_item_head(&s_ih, NULL, get_inode_item_key_version(inode),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) pos1 + 1, TYPE_DIRECT, round_tail_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 0xffff /*ih_free_space */ );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * we want a pointer to the first byte of the tail in the page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) * the page was locked and this part of the page was up to date when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) * indirect2direct was called, so we know the bytes are still valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) tail = tail + (pos & (PAGE_SIZE - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) PATH_LAST_POSITION(path)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) key = *item_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) set_cpu_key_k_type(&key, TYPE_DIRECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) key.key_length = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) /* Insert tail as new direct item in the tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (reiserfs_insert_item(th, path, &key, &s_ih, inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) tail ? tail : NULL) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * No disk memory. So we can not convert last unformatted node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * to the direct item. In this case we used to adjust
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * indirect items's ih_free_space. Now ih_free_space is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * used, it would be ideal to write zeros to corresponding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) * unformatted node. For now i_size is considered as guard for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) * going out of file size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) kunmap(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) return block_size - round_tail_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) kunmap(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /* make sure to get the i_blocks changes from reiserfs_insert_item */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) reiserfs_update_sd(th, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) * note: we have now the same as in above direct2indirect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) * conversion: there are two keys which have matching first three
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) * key components. They only differ by the fourth one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * We have inserted new direct item and must remove last
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) * unformatted node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) *mode = M_CUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) /* we store position of first direct item in the in-core inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* mark_file_with_tail (inode, pos1 + 1); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) REISERFS_I(inode)->i_first_direct_byte = pos1 + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) return block_size - round_tail_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }