Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) }