initramfs: fix initramfs to work with hardlinked init
[deliverable/linux.git] / fs / reiserfs / stree.c
CommitLineData
1da177e4
LT
1/*
2 * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
3 */
4
5/*
6 * Written by Anatoly P. Pinchuk pap@namesys.botik.ru
7 * Programm System Institute
8 * Pereslavl-Zalessky Russia
9 */
10
11/*
12 * This file contains functions dealing with S+tree
13 *
14 * B_IS_IN_TREE
15 * copy_item_head
16 * comp_short_keys
17 * comp_keys
18 * comp_short_le_keys
19 * le_key2cpu_key
20 * comp_le_keys
21 * bin_search
22 * get_lkey
23 * get_rkey
24 * key_in_buffer
25 * decrement_bcount
1da177e4
LT
26 * reiserfs_check_path
27 * pathrelse_and_restore
28 * pathrelse
29 * search_by_key_reada
30 * search_by_key
31 * search_for_position_by_key
32 * comp_items
33 * prepare_for_direct_item
34 * prepare_for_direntry_item
35 * prepare_for_delete_or_cut
36 * calc_deleted_bytes_number
37 * init_tb_struct
38 * padd_item
39 * reiserfs_delete_item
40 * reiserfs_delete_solid_item
41 * reiserfs_delete_object
42 * maybe_indirect_to_direct
43 * indirect_to_direct_roll_back
44 * reiserfs_cut_from_item
45 * truncate_directory
46 * reiserfs_do_truncate
47 * reiserfs_paste_into_item
48 * reiserfs_insert_item
49 */
50
1da177e4
LT
51#include <linux/time.h>
52#include <linux/string.h>
53#include <linux/pagemap.h>
54#include <linux/reiserfs_fs.h>
1da177e4
LT
55#include <linux/buffer_head.h>
56#include <linux/quotaops.h>
57
58/* Does the buffer contain a disk block which is in the tree. */
ad31a4fc 59inline int B_IS_IN_TREE(const struct buffer_head *bh)
1da177e4
LT
60{
61
ad31a4fc
JM
62 RFALSE(B_LEVEL(bh) > MAX_HEIGHT,
63 "PAP-1010: block (%b) has too big level (%z)", bh, bh);
1da177e4 64
ad31a4fc 65 return (B_LEVEL(bh) != FREE_LEVEL);
1da177e4
LT
66}
67
68//
69// to gets item head in le form
70//
d68caa95
JM
71inline void copy_item_head(struct item_head *to,
72 const struct item_head *from)
1da177e4 73{
d68caa95 74 memcpy(to, from, IH_SIZE);
1da177e4
LT
75}
76
1da177e4
LT
77/* k1 is pointer to on-disk structure which is stored in little-endian
78 form. k2 is pointer to cpu variable. For key of items of the same
79 object this returns 0.
0222e657 80 Returns: -1 if key1 < key2
1da177e4
LT
81 0 if key1 == key2
82 1 if key1 > key2 */
bd4c625c
LT
83inline int comp_short_keys(const struct reiserfs_key *le_key,
84 const struct cpu_key *cpu_key)
1da177e4 85{
bd4c625c
LT
86 __u32 n;
87 n = le32_to_cpu(le_key->k_dir_id);
88 if (n < cpu_key->on_disk_key.k_dir_id)
89 return -1;
90 if (n > cpu_key->on_disk_key.k_dir_id)
91 return 1;
92 n = le32_to_cpu(le_key->k_objectid);
93 if (n < cpu_key->on_disk_key.k_objectid)
94 return -1;
95 if (n > cpu_key->on_disk_key.k_objectid)
96 return 1;
97 return 0;
1da177e4
LT
98}
99
1da177e4
LT
100/* k1 is pointer to on-disk structure which is stored in little-endian
101 form. k2 is pointer to cpu variable.
102 Compare keys using all 4 key fields.
103 Returns: -1 if key1 < key2 0
104 if key1 = key2 1 if key1 > key2 */
bd4c625c
LT
105static inline int comp_keys(const struct reiserfs_key *le_key,
106 const struct cpu_key *cpu_key)
1da177e4 107{
bd4c625c
LT
108 int retval;
109
110 retval = comp_short_keys(le_key, cpu_key);
111 if (retval)
112 return retval;
113 if (le_key_k_offset(le_key_version(le_key), le_key) <
114 cpu_key_k_offset(cpu_key))
115 return -1;
116 if (le_key_k_offset(le_key_version(le_key), le_key) >
117 cpu_key_k_offset(cpu_key))
118 return 1;
119
120 if (cpu_key->key_length == 3)
121 return 0;
122
123 /* this part is needed only when tail conversion is in progress */
124 if (le_key_k_type(le_key_version(le_key), le_key) <
125 cpu_key_k_type(cpu_key))
126 return -1;
127
128 if (le_key_k_type(le_key_version(le_key), le_key) >
129 cpu_key_k_type(cpu_key))
130 return 1;
1da177e4 131
bd4c625c 132 return 0;
1da177e4
LT
133}
134
bd4c625c
LT
135inline int comp_short_le_keys(const struct reiserfs_key *key1,
136 const struct reiserfs_key *key2)
1da177e4 137{
d68caa95 138 __u32 *k1_u32, *k2_u32;
ee93961b 139 int key_length = REISERFS_SHORT_KEY_LEN;
bd4c625c 140
d68caa95
JM
141 k1_u32 = (__u32 *) key1;
142 k2_u32 = (__u32 *) key2;
ee93961b 143 for (; key_length--; ++k1_u32, ++k2_u32) {
d68caa95 144 if (le32_to_cpu(*k1_u32) < le32_to_cpu(*k2_u32))
bd4c625c 145 return -1;
d68caa95 146 if (le32_to_cpu(*k1_u32) > le32_to_cpu(*k2_u32))
bd4c625c
LT
147 return 1;
148 }
149 return 0;
1da177e4
LT
150}
151
bd4c625c 152inline void le_key2cpu_key(struct cpu_key *to, const struct reiserfs_key *from)
1da177e4 153{
bd4c625c
LT
154 int version;
155 to->on_disk_key.k_dir_id = le32_to_cpu(from->k_dir_id);
156 to->on_disk_key.k_objectid = le32_to_cpu(from->k_objectid);
157
158 // find out version of the key
159 version = le_key_version(from);
160 to->version = version;
161 to->on_disk_key.k_offset = le_key_k_offset(version, from);
162 to->on_disk_key.k_type = le_key_k_type(version, from);
1da177e4
LT
163}
164
1da177e4
LT
165// this does not say which one is bigger, it only returns 1 if keys
166// are not equal, 0 otherwise
bd4c625c
LT
167inline int comp_le_keys(const struct reiserfs_key *k1,
168 const struct reiserfs_key *k2)
1da177e4 169{
bd4c625c 170 return memcmp(k1, k2, sizeof(struct reiserfs_key));
1da177e4
LT
171}
172
173/**************************************************************************
174 * Binary search toolkit function *
175 * Search for an item in the array by the item key *
176 * Returns: 1 if found, 0 if not found; *
d68caa95
JM
177 * *pos = number of the searched element if found, else the *
178 * number of the first element that is larger than key. *
1da177e4 179 **************************************************************************/
ee93961b
JM
180/* For those not familiar with binary search: lbound is the leftmost item that it
181 could be, rbound the rightmost item that it could be. We examine the item
182 halfway between lbound and rbound, and that tells us either that we can increase
183 lbound, or decrease rbound, or that we have found it, or if lbound <= rbound that
1da177e4
LT
184 there are no possible items, and we have not found it. With each examination we
185 cut the number of possible items it could be by one more than half rounded down,
186 or we find it. */
d68caa95
JM
187static inline int bin_search(const void *key, /* Key to search for. */
188 const void *base, /* First item in the array. */
189 int num, /* Number of items in the array. */
190 int width, /* Item size in the array.
191 searched. Lest the reader be
192 confused, note that this is crafted
193 as a general function, and when it
194 is applied specifically to the array
195 of item headers in a node, width
196 is actually the item header size not
197 the item size. */
198 int *pos /* Number of the searched for element. */
bd4c625c
LT
199 )
200{
ee93961b 201 int rbound, lbound, j;
bd4c625c 202
ee93961b
JM
203 for (j = ((rbound = num - 1) + (lbound = 0)) / 2;
204 lbound <= rbound; j = (rbound + lbound) / 2)
bd4c625c 205 switch (comp_keys
ee93961b 206 ((struct reiserfs_key *)((char *)base + j * width),
d68caa95 207 (struct cpu_key *)key)) {
bd4c625c 208 case -1:
ee93961b 209 lbound = j + 1;
bd4c625c
LT
210 continue;
211 case 1:
ee93961b 212 rbound = j - 1;
bd4c625c
LT
213 continue;
214 case 0:
ee93961b 215 *pos = j;
bd4c625c
LT
216 return ITEM_FOUND; /* Key found in the array. */
217 }
218
219 /* bin_search did not find given key, it returns position of key,
220 that is minimal and greater than the given one. */
ee93961b 221 *pos = lbound;
bd4c625c 222 return ITEM_NOT_FOUND;
1da177e4
LT
223}
224
225#ifdef CONFIG_REISERFS_CHECK
bd4c625c 226extern struct tree_balance *cur_tb;
1da177e4
LT
227#endif
228
1da177e4 229/* Minimal possible key. It is never in the tree. */
bd4c625c 230const struct reiserfs_key MIN_KEY = { 0, 0, {{0, 0},} };
1da177e4
LT
231
232/* Maximal possible key. It is never in the tree. */
bd4c625c 233static const struct reiserfs_key MAX_KEY = {
3e8962be
AV
234 __constant_cpu_to_le32(0xffffffff),
235 __constant_cpu_to_le32(0xffffffff),
236 {{__constant_cpu_to_le32(0xffffffff),
bd4c625c 237 __constant_cpu_to_le32(0xffffffff)},}
3e8962be 238};
1da177e4 239
1da177e4
LT
240/* Get delimiting key of the buffer by looking for it in the buffers in the path, starting from the bottom
241 of the path, and going upwards. We must check the path's validity at each step. If the key is not in
242 the path, there is no delimiting key in the tree (buffer is first or last buffer in tree), and in this
243 case we return a special key, either MIN_KEY or MAX_KEY. */
ee93961b
JM
244static inline const struct reiserfs_key *get_lkey(const struct treepath *chk_path,
245 const struct super_block *sb)
bd4c625c 246{
ee93961b 247 int position, path_offset = chk_path->path_length;
d68caa95 248 struct buffer_head *parent;
bd4c625c 249
ee93961b 250 RFALSE(path_offset < FIRST_PATH_ELEMENT_OFFSET,
bd4c625c
LT
251 "PAP-5010: invalid offset in the path");
252
253 /* While not higher in path than first element. */
ee93961b 254 while (path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
bd4c625c
LT
255
256 RFALSE(!buffer_uptodate
ee93961b 257 (PATH_OFFSET_PBUFFER(chk_path, path_offset)),
bd4c625c
LT
258 "PAP-5020: parent is not uptodate");
259
260 /* Parent at the path is not in the tree now. */
261 if (!B_IS_IN_TREE
d68caa95 262 (parent =
ee93961b 263 PATH_OFFSET_PBUFFER(chk_path, path_offset)))
bd4c625c
LT
264 return &MAX_KEY;
265 /* Check whether position in the parent is correct. */
ee93961b 266 if ((position =
d68caa95 267 PATH_OFFSET_POSITION(chk_path,
ee93961b 268 path_offset)) >
d68caa95 269 B_NR_ITEMS(parent))
bd4c625c
LT
270 return &MAX_KEY;
271 /* Check whether parent at the path really points to the child. */
ee93961b 272 if (B_N_CHILD_NUM(parent, position) !=
d68caa95 273 PATH_OFFSET_PBUFFER(chk_path,
ee93961b 274 path_offset + 1)->b_blocknr)
bd4c625c
LT
275 return &MAX_KEY;
276 /* Return delimiting key if position in the parent is not equal to zero. */
ee93961b
JM
277 if (position)
278 return B_N_PDELIM_KEY(parent, position - 1);
bd4c625c
LT
279 }
280 /* Return MIN_KEY if we are in the root of the buffer tree. */
d68caa95 281 if (PATH_OFFSET_PBUFFER(chk_path, FIRST_PATH_ELEMENT_OFFSET)->
a9dd3643 282 b_blocknr == SB_ROOT_BLOCK(sb))
bd4c625c
LT
283 return &MIN_KEY;
284 return &MAX_KEY;
1da177e4
LT
285}
286
1da177e4 287/* Get delimiting key of the buffer at the path and its right neighbor. */
d68caa95 288inline const struct reiserfs_key *get_rkey(const struct treepath *chk_path,
a9dd3643 289 const struct super_block *sb)
bd4c625c 290{
ee93961b 291 int position, path_offset = chk_path->path_length;
d68caa95 292 struct buffer_head *parent;
bd4c625c 293
ee93961b 294 RFALSE(path_offset < FIRST_PATH_ELEMENT_OFFSET,
bd4c625c
LT
295 "PAP-5030: invalid offset in the path");
296
ee93961b 297 while (path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
bd4c625c
LT
298
299 RFALSE(!buffer_uptodate
ee93961b 300 (PATH_OFFSET_PBUFFER(chk_path, path_offset)),
bd4c625c
LT
301 "PAP-5040: parent is not uptodate");
302
303 /* Parent at the path is not in the tree now. */
304 if (!B_IS_IN_TREE
d68caa95 305 (parent =
ee93961b 306 PATH_OFFSET_PBUFFER(chk_path, path_offset)))
bd4c625c
LT
307 return &MIN_KEY;
308 /* Check whether position in the parent is correct. */
ee93961b 309 if ((position =
d68caa95 310 PATH_OFFSET_POSITION(chk_path,
ee93961b 311 path_offset)) >
d68caa95 312 B_NR_ITEMS(parent))
bd4c625c
LT
313 return &MIN_KEY;
314 /* Check whether parent at the path really points to the child. */
ee93961b 315 if (B_N_CHILD_NUM(parent, position) !=
d68caa95 316 PATH_OFFSET_PBUFFER(chk_path,
ee93961b 317 path_offset + 1)->b_blocknr)
bd4c625c
LT
318 return &MIN_KEY;
319 /* Return delimiting key if position in the parent is not the last one. */
ee93961b
JM
320 if (position != B_NR_ITEMS(parent))
321 return B_N_PDELIM_KEY(parent, position);
bd4c625c
LT
322 }
323 /* Return MAX_KEY if we are in the root of the buffer tree. */
d68caa95 324 if (PATH_OFFSET_PBUFFER(chk_path, FIRST_PATH_ELEMENT_OFFSET)->
a9dd3643 325 b_blocknr == SB_ROOT_BLOCK(sb))
bd4c625c
LT
326 return &MAX_KEY;
327 return &MIN_KEY;
1da177e4
LT
328}
329
1da177e4
LT
330/* Check whether a key is contained in the tree rooted from a buffer at a path. */
331/* This works by looking at the left and right delimiting keys for the buffer in the last path_element in
332 the path. These delimiting keys are stored at least one level above that buffer in the tree. If the
333 buffer is the first or last node in the tree order then one of the delimiting keys may be absent, and in
334 this case get_lkey and get_rkey return a special key which is MIN_KEY or MAX_KEY. */
d68caa95
JM
335static inline int key_in_buffer(struct treepath *chk_path, /* Path which should be checked. */
336 const struct cpu_key *key, /* Key which should be checked. */
337 struct super_block *sb
bd4c625c
LT
338 )
339{
1da177e4 340
d68caa95
JM
341 RFALSE(!key || chk_path->path_length < FIRST_PATH_ELEMENT_OFFSET
342 || chk_path->path_length > MAX_HEIGHT,
bd4c625c 343 "PAP-5050: pointer to the key(%p) is NULL or invalid path length(%d)",
d68caa95
JM
344 key, chk_path->path_length);
345 RFALSE(!PATH_PLAST_BUFFER(chk_path)->b_bdev,
bd4c625c
LT
346 "PAP-5060: device must not be NODEV");
347
d68caa95 348 if (comp_keys(get_lkey(chk_path, sb), key) == 1)
bd4c625c
LT
349 /* left delimiting key is bigger, that the key we look for */
350 return 0;
d68caa95
JM
351 /* if ( comp_keys(key, get_rkey(chk_path, sb)) != -1 ) */
352 if (comp_keys(get_rkey(chk_path, sb), key) != 1)
353 /* key must be less than right delimitiing key */
bd4c625c
LT
354 return 0;
355 return 1;
1da177e4
LT
356}
357
fec6d055 358int reiserfs_check_path(struct treepath *p)
bd4c625c
LT
359{
360 RFALSE(p->path_length != ILLEGAL_PATH_ELEMENT_OFFSET,
361 "path not properly relsed");
362 return 0;
363}
1da177e4 364
3cd6dbe6
JM
365/* Drop the reference to each buffer in a path and restore
366 * dirty bits clean when preparing the buffer for the log.
367 * This version should only be called from fix_nodes() */
368void pathrelse_and_restore(struct super_block *sb,
d68caa95 369 struct treepath *search_path)
bd4c625c 370{
ee93961b 371 int path_offset = search_path->path_length;
bd4c625c 372
ee93961b 373 RFALSE(path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
bd4c625c
LT
374 "clm-4000: invalid path offset");
375
ee93961b 376 while (path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) {
3cd6dbe6 377 struct buffer_head *bh;
ee93961b 378 bh = PATH_OFFSET_PBUFFER(search_path, path_offset--);
3cd6dbe6
JM
379 reiserfs_restore_prepared_buffer(sb, bh);
380 brelse(bh);
bd4c625c 381 }
d68caa95 382 search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
1da177e4
LT
383}
384
3cd6dbe6 385/* Drop the reference to each buffer in a path */
d68caa95 386void pathrelse(struct treepath *search_path)
bd4c625c 387{
ee93961b 388 int path_offset = search_path->path_length;
1da177e4 389
ee93961b 390 RFALSE(path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
bd4c625c 391 "PAP-5090: invalid path offset");
1da177e4 392
ee93961b
JM
393 while (path_offset > ILLEGAL_PATH_ELEMENT_OFFSET)
394 brelse(PATH_OFFSET_PBUFFER(search_path, path_offset--));
1da177e4 395
d68caa95 396 search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
bd4c625c 397}
1da177e4 398
bd4c625c
LT
399static int is_leaf(char *buf, int blocksize, struct buffer_head *bh)
400{
401 struct block_head *blkh;
402 struct item_head *ih;
403 int used_space;
404 int prev_location;
405 int i;
406 int nr;
407
408 blkh = (struct block_head *)buf;
409 if (blkh_level(blkh) != DISK_LEAF_NODE_LEVEL) {
45b03d5e
JM
410 reiserfs_warning(NULL, "reiserfs-5080",
411 "this should be caught earlier");
bd4c625c 412 return 0;
1da177e4 413 }
bd4c625c
LT
414
415 nr = blkh_nr_item(blkh);
416 if (nr < 1 || nr > ((blocksize - BLKH_SIZE) / (IH_SIZE + MIN_ITEM_LEN))) {
417 /* item number is too big or too small */
45b03d5e
JM
418 reiserfs_warning(NULL, "reiserfs-5081",
419 "nr_item seems wrong: %z", bh);
bd4c625c 420 return 0;
1da177e4 421 }
bd4c625c
LT
422 ih = (struct item_head *)(buf + BLKH_SIZE) + nr - 1;
423 used_space = BLKH_SIZE + IH_SIZE * nr + (blocksize - ih_location(ih));
424 if (used_space != blocksize - blkh_free_space(blkh)) {
425 /* free space does not match to calculated amount of use space */
45b03d5e
JM
426 reiserfs_warning(NULL, "reiserfs-5082",
427 "free space seems wrong: %z", bh);
bd4c625c 428 return 0;
1da177e4 429 }
bd4c625c
LT
430 // FIXME: it is_leaf will hit performance too much - we may have
431 // return 1 here
432
433 /* check tables of item heads */
434 ih = (struct item_head *)(buf + BLKH_SIZE);
435 prev_location = blocksize;
436 for (i = 0; i < nr; i++, ih++) {
437 if (le_ih_k_type(ih) == TYPE_ANY) {
45b03d5e
JM
438 reiserfs_warning(NULL, "reiserfs-5083",
439 "wrong item type for item %h",
bd4c625c
LT
440 ih);
441 return 0;
442 }
443 if (ih_location(ih) >= blocksize
444 || ih_location(ih) < IH_SIZE * nr) {
45b03d5e
JM
445 reiserfs_warning(NULL, "reiserfs-5084",
446 "item location seems wrong: %h",
bd4c625c
LT
447 ih);
448 return 0;
449 }
450 if (ih_item_len(ih) < 1
451 || ih_item_len(ih) > MAX_ITEM_LEN(blocksize)) {
45b03d5e
JM
452 reiserfs_warning(NULL, "reiserfs-5085",
453 "item length seems wrong: %h",
bd4c625c
LT
454 ih);
455 return 0;
456 }
457 if (prev_location - ih_location(ih) != ih_item_len(ih)) {
45b03d5e
JM
458 reiserfs_warning(NULL, "reiserfs-5086",
459 "item location seems wrong "
460 "(second one): %h", ih);
bd4c625c
LT
461 return 0;
462 }
463 prev_location = ih_location(ih);
1da177e4 464 }
1da177e4 465
bd4c625c
LT
466 // one may imagine much more checks
467 return 1;
1da177e4
LT
468}
469
1da177e4 470/* returns 1 if buf looks like an internal node, 0 otherwise */
bd4c625c 471static int is_internal(char *buf, int blocksize, struct buffer_head *bh)
1da177e4 472{
bd4c625c
LT
473 struct block_head *blkh;
474 int nr;
475 int used_space;
476
477 blkh = (struct block_head *)buf;
478 nr = blkh_level(blkh);
479 if (nr <= DISK_LEAF_NODE_LEVEL || nr > MAX_HEIGHT) {
480 /* this level is not possible for internal nodes */
45b03d5e
JM
481 reiserfs_warning(NULL, "reiserfs-5087",
482 "this should be caught earlier");
bd4c625c
LT
483 return 0;
484 }
1da177e4 485
bd4c625c
LT
486 nr = blkh_nr_item(blkh);
487 if (nr > (blocksize - BLKH_SIZE - DC_SIZE) / (KEY_SIZE + DC_SIZE)) {
488 /* for internal which is not root we might check min number of keys */
45b03d5e
JM
489 reiserfs_warning(NULL, "reiserfs-5088",
490 "number of key seems wrong: %z", bh);
bd4c625c
LT
491 return 0;
492 }
1da177e4 493
bd4c625c
LT
494 used_space = BLKH_SIZE + KEY_SIZE * nr + DC_SIZE * (nr + 1);
495 if (used_space != blocksize - blkh_free_space(blkh)) {
45b03d5e
JM
496 reiserfs_warning(NULL, "reiserfs-5089",
497 "free space seems wrong: %z", bh);
bd4c625c
LT
498 return 0;
499 }
500 // one may imagine much more checks
501 return 1;
1da177e4
LT
502}
503
1da177e4
LT
504// make sure that bh contains formatted node of reiserfs tree of
505// 'level'-th level
bd4c625c 506static int is_tree_node(struct buffer_head *bh, int level)
1da177e4 507{
bd4c625c 508 if (B_LEVEL(bh) != level) {
45b03d5e
JM
509 reiserfs_warning(NULL, "reiserfs-5090", "node level %d does "
510 "not match to the expected one %d",
bd4c625c
LT
511 B_LEVEL(bh), level);
512 return 0;
513 }
514 if (level == DISK_LEAF_NODE_LEVEL)
515 return is_leaf(bh->b_data, bh->b_size, bh);
1da177e4 516
bd4c625c 517 return is_internal(bh->b_data, bh->b_size, bh);
1da177e4
LT
518}
519
1da177e4
LT
520#define SEARCH_BY_KEY_READA 16
521
522/* The function is NOT SCHEDULE-SAFE! */
bd4c625c
LT
523static void search_by_key_reada(struct super_block *s,
524 struct buffer_head **bh,
3ee16670 525 b_blocknr_t *b, int num)
1da177e4 526{
bd4c625c
LT
527 int i, j;
528
529 for (i = 0; i < num; i++) {
530 bh[i] = sb_getblk(s, b[i]);
531 }
532 for (j = 0; j < i; j++) {
533 /*
534 * note, this needs attention if we are getting rid of the BKL
535 * you have to make sure the prepared bit isn't set on this buffer
536 */
537 if (!buffer_uptodate(bh[j]))
538 ll_rw_block(READA, 1, bh + j);
539 brelse(bh[j]);
540 }
1da177e4
LT
541}
542
543/**************************************************************************
544 * Algorithm SearchByKey *
545 * look for item in the Disk S+Tree by its key *
a9dd3643 546 * Input: sb - super block *
d68caa95 547 * key - pointer to the key to search *
1da177e4 548 * Output: ITEM_FOUND, ITEM_NOT_FOUND or IO_ERROR *
d68caa95 549 * search_path - path from the root to the needed leaf *
1da177e4
LT
550 **************************************************************************/
551
552/* This function fills up the path from the root to the leaf as it
553 descends the tree looking for the key. It uses reiserfs_bread to
554 try to find buffers in the cache given their block number. If it
555 does not find them in the cache it reads them from disk. For each
556 node search_by_key finds using reiserfs_bread it then uses
557 bin_search to look through that node. bin_search will find the
558 position of the block_number of the next node if it is looking
559 through an internal node. If it is looking through a leaf node
560 bin_search will find the position of the item which has key either
561 equal to given key, or which is the maximal key less than the given
562 key. search_by_key returns a path that must be checked for the
563 correctness of the top of the path but need not be checked for the
564 correctness of the bottom of the path */
565/* The function is NOT SCHEDULE-SAFE! */
d68caa95
JM
566int search_by_key(struct super_block *sb, const struct cpu_key *key, /* Key to search. */
567 struct treepath *search_path,/* This structure was
bd4c625c
LT
568 allocated and initialized
569 by the calling
570 function. It is filled up
571 by this function. */
ee93961b 572 int stop_level /* How far down the tree to search. To
bd4c625c
LT
573 stop at leaf level - set to
574 DISK_LEAF_NODE_LEVEL */
575 )
576{
ee93961b 577 b_blocknr_t block_number;
bd4c625c 578 int expected_level;
ad31a4fc 579 struct buffer_head *bh;
d68caa95 580 struct path_element *last_element;
ee93961b 581 int node_level, retval;
bd4c625c
LT
582 int right_neighbor_of_leaf_node;
583 int fs_gen;
584 struct buffer_head *reada_bh[SEARCH_BY_KEY_READA];
3ee16670 585 b_blocknr_t reada_blocks[SEARCH_BY_KEY_READA];
bd4c625c 586 int reada_count = 0;
1da177e4
LT
587
588#ifdef CONFIG_REISERFS_CHECK
ee93961b 589 int repeat_counter = 0;
1da177e4 590#endif
1da177e4 591
a9dd3643 592 PROC_INFO_INC(sb, search_by_key);
bd4c625c
LT
593
594 /* As we add each node to a path we increase its count. This means that
595 we must be careful to release all nodes in a path before we either
596 discard the path struct or re-use the path struct, as we do here. */
1da177e4 597
d68caa95 598 pathrelse(search_path);
1da177e4 599
bd4c625c
LT
600 right_neighbor_of_leaf_node = 0;
601
602 /* With each iteration of this loop we search through the items in the
603 current node, and calculate the next current node(next path element)
604 for the next iteration of this loop.. */
ee93961b 605 block_number = SB_ROOT_BLOCK(sb);
bd4c625c
LT
606 expected_level = -1;
607 while (1) {
1da177e4
LT
608
609#ifdef CONFIG_REISERFS_CHECK
ee93961b 610 if (!(++repeat_counter % 50000))
a9dd3643 611 reiserfs_warning(sb, "PAP-5100",
45b03d5e
JM
612 "%s: there were %d iterations of "
613 "while loop looking for key %K",
ee93961b 614 current->comm, repeat_counter,
d68caa95 615 key);
1da177e4
LT
616#endif
617
bd4c625c 618 /* prep path to have another element added to it. */
d68caa95
JM
619 last_element =
620 PATH_OFFSET_PELEMENT(search_path,
621 ++search_path->path_length);
a9dd3643 622 fs_gen = get_generation(sb);
bd4c625c
LT
623
624 /* Read the next tree node, and set the last element in the path to
625 have a pointer to it. */
d68caa95 626 if ((bh = last_element->pe_buffer =
ee93961b 627 sb_getblk(sb, block_number))) {
ad31a4fc 628 if (!buffer_uptodate(bh) && reada_count > 1)
a9dd3643 629 search_by_key_reada(sb, reada_bh,
bd4c625c 630 reada_blocks, reada_count);
ad31a4fc
JM
631 ll_rw_block(READ, 1, &bh);
632 wait_on_buffer(bh);
633 if (!buffer_uptodate(bh))
bd4c625c
LT
634 goto io_error;
635 } else {
636 io_error:
d68caa95
JM
637 search_path->path_length--;
638 pathrelse(search_path);
bd4c625c
LT
639 return IO_ERROR;
640 }
641 reada_count = 0;
642 if (expected_level == -1)
a9dd3643 643 expected_level = SB_TREE_HEIGHT(sb);
bd4c625c
LT
644 expected_level--;
645
646 /* It is possible that schedule occurred. We must check whether the key
647 to search is still in the tree rooted from the current buffer. If
648 not then repeat search from the root. */
a9dd3643 649 if (fs_changed(fs_gen, sb) &&
ad31a4fc
JM
650 (!B_IS_IN_TREE(bh) ||
651 B_LEVEL(bh) != expected_level ||
d68caa95 652 !key_in_buffer(search_path, key, sb))) {
a9dd3643
JM
653 PROC_INFO_INC(sb, search_by_key_fs_changed);
654 PROC_INFO_INC(sb, search_by_key_restarted);
655 PROC_INFO_INC(sb,
bd4c625c 656 sbk_restarted[expected_level - 1]);
d68caa95 657 pathrelse(search_path);
bd4c625c
LT
658
659 /* Get the root block number so that we can repeat the search
660 starting from the root. */
ee93961b 661 block_number = SB_ROOT_BLOCK(sb);
bd4c625c
LT
662 expected_level = -1;
663 right_neighbor_of_leaf_node = 0;
664
665 /* repeat search from the root */
666 continue;
667 }
1da177e4 668
d68caa95 669 /* only check that the key is in the buffer if key is not
bd4c625c
LT
670 equal to the MAX_KEY. Latter case is only possible in
671 "finish_unfinished()" processing during mount. */
d68caa95
JM
672 RFALSE(comp_keys(&MAX_KEY, key) &&
673 !key_in_buffer(search_path, key, sb),
bd4c625c 674 "PAP-5130: key is not in the buffer");
1da177e4 675#ifdef CONFIG_REISERFS_CHECK
bd4c625c
LT
676 if (cur_tb) {
677 print_cur_tb("5140");
a9dd3643 678 reiserfs_panic(sb, "PAP-5140",
c3a9c210 679 "schedule occurred in do_balance!");
bd4c625c 680 }
1da177e4
LT
681#endif
682
bd4c625c
LT
683 // make sure, that the node contents look like a node of
684 // certain level
ad31a4fc 685 if (!is_tree_node(bh, expected_level)) {
a9dd3643 686 reiserfs_error(sb, "vs-5150",
0030b645 687 "invalid format found in block %ld. "
ad31a4fc 688 "Fsck?", bh->b_blocknr);
d68caa95 689 pathrelse(search_path);
bd4c625c
LT
690 return IO_ERROR;
691 }
1da177e4 692
bd4c625c 693 /* ok, we have acquired next formatted node in the tree */
ee93961b 694 node_level = B_LEVEL(bh);
1da177e4 695
ee93961b 696 PROC_INFO_BH_STAT(sb, bh, node_level - 1);
1da177e4 697
ee93961b 698 RFALSE(node_level < stop_level,
bd4c625c 699 "vs-5152: tree level (%d) is less than stop level (%d)",
ee93961b 700 node_level, stop_level);
1da177e4 701
ee93961b 702 retval = bin_search(key, B_N_PITEM_HEAD(bh, 0),
ad31a4fc 703 B_NR_ITEMS(bh),
ee93961b 704 (node_level ==
bd4c625c
LT
705 DISK_LEAF_NODE_LEVEL) ? IH_SIZE :
706 KEY_SIZE,
d68caa95 707 &(last_element->pe_position));
ee93961b
JM
708 if (node_level == stop_level) {
709 return retval;
bd4c625c 710 }
1da177e4 711
bd4c625c 712 /* we are not in the stop level */
ee93961b 713 if (retval == ITEM_FOUND)
bd4c625c 714 /* item has been found, so we choose the pointer which is to the right of the found one */
d68caa95 715 last_element->pe_position++;
bd4c625c
LT
716
717 /* if item was not found we choose the position which is to
718 the left of the found item. This requires no code,
719 bin_search did it already. */
720
721 /* So we have chosen a position in the current node which is
722 an internal node. Now we calculate child block number by
723 position in the node. */
ee93961b 724 block_number =
d68caa95 725 B_N_CHILD_NUM(bh, last_element->pe_position);
bd4c625c
LT
726
727 /* if we are going to read leaf nodes, try for read ahead as well */
d68caa95 728 if ((search_path->reada & PATH_READA) &&
ee93961b 729 node_level == DISK_LEAF_NODE_LEVEL + 1) {
d68caa95 730 int pos = last_element->pe_position;
ad31a4fc 731 int limit = B_NR_ITEMS(bh);
bd4c625c
LT
732 struct reiserfs_key *le_key;
733
d68caa95 734 if (search_path->reada & PATH_READA_BACK)
bd4c625c
LT
735 limit = 0;
736 while (reada_count < SEARCH_BY_KEY_READA) {
737 if (pos == limit)
738 break;
739 reada_blocks[reada_count++] =
ad31a4fc 740 B_N_CHILD_NUM(bh, pos);
d68caa95 741 if (search_path->reada & PATH_READA_BACK)
bd4c625c
LT
742 pos--;
743 else
744 pos++;
745
746 /*
747 * check to make sure we're in the same object
748 */
ad31a4fc 749 le_key = B_N_PDELIM_KEY(bh, pos);
bd4c625c 750 if (le32_to_cpu(le_key->k_objectid) !=
d68caa95 751 key->on_disk_key.k_objectid) {
bd4c625c
LT
752 break;
753 }
754 }
1da177e4 755 }
bd4c625c 756 }
1da177e4
LT
757}
758
1da177e4 759/* Form the path to an item and position in this item which contains
d68caa95 760 file byte defined by key. If there is no such item
1da177e4 761 corresponding to the key, we point the path to the item with
d68caa95 762 maximal key less than key, and *pos_in_item is set to one
1da177e4 763 past the last entry/byte in the item. If searching for entry in a
d68caa95 764 directory item, and it is not found, *pos_in_item is set to one
1da177e4
LT
765 entry more than the entry with maximal key which is less than the
766 sought key.
767
768 Note that if there is no entry in this same node which is one more,
769 then we point to an imaginary entry. for direct items, the
770 position is in units of bytes, for indirect items the position is
771 in units of blocknr entries, for directory items the position is in
772 units of directory entries. */
773
774/* The function is NOT SCHEDULE-SAFE! */
a9dd3643 775int search_for_position_by_key(struct super_block *sb, /* Pointer to the super block. */
bd4c625c 776 const struct cpu_key *p_cpu_key, /* Key to search (cpu variable) */
d68caa95 777 struct treepath *search_path /* Filled up by this function. */
bd4c625c
LT
778 )
779{
780 struct item_head *p_le_ih; /* pointer to on-disk structure */
ee93961b 781 int blk_size;
bd4c625c
LT
782 loff_t item_offset, offset;
783 struct reiserfs_dir_entry de;
784 int retval;
785
786 /* If searching for directory entry. */
787 if (is_direntry_cpu_key(p_cpu_key))
d68caa95 788 return search_by_entry_key(sb, p_cpu_key, search_path,
bd4c625c
LT
789 &de);
790
791 /* If not searching for directory entry. */
792
793 /* If item is found. */
d68caa95 794 retval = search_item(sb, p_cpu_key, search_path);
bd4c625c
LT
795 if (retval == IO_ERROR)
796 return retval;
797 if (retval == ITEM_FOUND) {
1da177e4 798
bd4c625c
LT
799 RFALSE(!ih_item_len
800 (B_N_PITEM_HEAD
d68caa95
JM
801 (PATH_PLAST_BUFFER(search_path),
802 PATH_LAST_POSITION(search_path))),
bd4c625c 803 "PAP-5165: item length equals zero");
1da177e4 804
d68caa95 805 pos_in_item(search_path) = 0;
bd4c625c
LT
806 return POSITION_FOUND;
807 }
1da177e4 808
d68caa95 809 RFALSE(!PATH_LAST_POSITION(search_path),
bd4c625c 810 "PAP-5170: position equals zero");
1da177e4 811
bd4c625c
LT
812 /* Item is not found. Set path to the previous item. */
813 p_le_ih =
d68caa95
JM
814 B_N_PITEM_HEAD(PATH_PLAST_BUFFER(search_path),
815 --PATH_LAST_POSITION(search_path));
ee93961b 816 blk_size = sb->s_blocksize;
1da177e4 817
bd4c625c
LT
818 if (comp_short_keys(&(p_le_ih->ih_key), p_cpu_key)) {
819 return FILE_NOT_FOUND;
820 }
821 // FIXME: quite ugly this far
1da177e4 822
bd4c625c
LT
823 item_offset = le_ih_k_offset(p_le_ih);
824 offset = cpu_key_k_offset(p_cpu_key);
1da177e4 825
bd4c625c
LT
826 /* Needed byte is contained in the item pointed to by the path. */
827 if (item_offset <= offset &&
ee93961b 828 item_offset + op_bytes_number(p_le_ih, blk_size) > offset) {
d68caa95 829 pos_in_item(search_path) = offset - item_offset;
bd4c625c 830 if (is_indirect_le_ih(p_le_ih)) {
ee93961b 831 pos_in_item(search_path) /= blk_size;
bd4c625c
LT
832 }
833 return POSITION_FOUND;
1da177e4 834 }
1da177e4 835
bd4c625c
LT
836 /* Needed byte is not contained in the item pointed to by the
837 path. Set pos_in_item out of the item. */
838 if (is_indirect_le_ih(p_le_ih))
d68caa95 839 pos_in_item(search_path) =
bd4c625c
LT
840 ih_item_len(p_le_ih) / UNFM_P_SIZE;
841 else
d68caa95 842 pos_in_item(search_path) = ih_item_len(p_le_ih);
bd4c625c
LT
843
844 return POSITION_NOT_FOUND;
845}
1da177e4
LT
846
847/* Compare given item and item pointed to by the path. */
d68caa95 848int comp_items(const struct item_head *stored_ih, const struct treepath *path)
1da177e4 849{
d68caa95 850 struct buffer_head *bh = PATH_PLAST_BUFFER(path);
bd4c625c 851 struct item_head *ih;
1da177e4 852
bd4c625c 853 /* Last buffer at the path is not in the tree. */
ad31a4fc 854 if (!B_IS_IN_TREE(bh))
bd4c625c 855 return 1;
1da177e4 856
bd4c625c 857 /* Last path position is invalid. */
d68caa95 858 if (PATH_LAST_POSITION(path) >= B_NR_ITEMS(bh))
bd4c625c 859 return 1;
1da177e4 860
bd4c625c 861 /* we need only to know, whether it is the same item */
d68caa95 862 ih = get_ih(path);
bd4c625c 863 return memcmp(stored_ih, ih, IH_SIZE);
1da177e4
LT
864}
865
1da177e4
LT
866/* unformatted nodes are not logged anymore, ever. This is safe
867** now
868*/
869#define held_by_others(bh) (atomic_read(&(bh)->b_count) > 1)
870
871// block can not be forgotten as it is in I/O or held by someone
872#define block_in_use(bh) (buffer_locked(bh) || (held_by_others(bh)))
873
1da177e4 874// prepare for delete or cut of direct item
fec6d055 875static inline int prepare_for_direct_item(struct treepath *path,
bd4c625c
LT
876 struct item_head *le_ih,
877 struct inode *inode,
878 loff_t new_file_length, int *cut_size)
1da177e4 879{
bd4c625c
LT
880 loff_t round_len;
881
882 if (new_file_length == max_reiserfs_offset(inode)) {
883 /* item has to be deleted */
884 *cut_size = -(IH_SIZE + ih_item_len(le_ih));
885 return M_DELETE;
886 }
887 // new file gets truncated
888 if (get_inode_item_key_version(inode) == KEY_FORMAT_3_6) {
0222e657 889 //
bd4c625c 890 round_len = ROUND_UP(new_file_length);
ee93961b 891 /* this was new_file_length < le_ih ... */
bd4c625c
LT
892 if (round_len < le_ih_k_offset(le_ih)) {
893 *cut_size = -(IH_SIZE + ih_item_len(le_ih));
894 return M_DELETE; /* Delete this item. */
895 }
896 /* Calculate first position and size for cutting from item. */
897 pos_in_item(path) = round_len - (le_ih_k_offset(le_ih) - 1);
898 *cut_size = -(ih_item_len(le_ih) - pos_in_item(path));
899
900 return M_CUT; /* Cut from this item. */
901 }
902
903 // old file: items may have any length
904
905 if (new_file_length < le_ih_k_offset(le_ih)) {
906 *cut_size = -(IH_SIZE + ih_item_len(le_ih));
907 return M_DELETE; /* Delete this item. */
1da177e4
LT
908 }
909 /* Calculate first position and size for cutting from item. */
bd4c625c
LT
910 *cut_size = -(ih_item_len(le_ih) -
911 (pos_in_item(path) =
912 new_file_length + 1 - le_ih_k_offset(le_ih)));
913 return M_CUT; /* Cut from this item. */
1da177e4
LT
914}
915
fec6d055 916static inline int prepare_for_direntry_item(struct treepath *path,
bd4c625c
LT
917 struct item_head *le_ih,
918 struct inode *inode,
919 loff_t new_file_length,
920 int *cut_size)
1da177e4 921{
bd4c625c
LT
922 if (le_ih_k_offset(le_ih) == DOT_OFFSET &&
923 new_file_length == max_reiserfs_offset(inode)) {
924 RFALSE(ih_entry_count(le_ih) != 2,
925 "PAP-5220: incorrect empty directory item (%h)", le_ih);
926 *cut_size = -(IH_SIZE + ih_item_len(le_ih));
927 return M_DELETE; /* Delete the directory item containing "." and ".." entry. */
928 }
1da177e4 929
bd4c625c
LT
930 if (ih_entry_count(le_ih) == 1) {
931 /* Delete the directory item such as there is one record only
932 in this item */
933 *cut_size = -(IH_SIZE + ih_item_len(le_ih));
934 return M_DELETE;
935 }
936
937 /* Cut one record from the directory item. */
938 *cut_size =
939 -(DEH_SIZE +
940 entry_length(get_last_bh(path), le_ih, pos_in_item(path)));
941 return M_CUT;
942}
1da177e4 943
23f9e0f8
AZ
944#define JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD (2 * JOURNAL_PER_BALANCE_CNT + 1)
945
1da177e4
LT
946/* If the path points to a directory or direct item, calculate mode and the size cut, for balance.
947 If the path points to an indirect item, remove some number of its unformatted nodes.
948 In case of file truncate calculate whether this item must be deleted/truncated or last
949 unformatted node of this item will be converted to a direct item.
950 This function returns a determination of what balance mode the calling function should employ. */
d68caa95 951static char prepare_for_delete_or_cut(struct reiserfs_transaction_handle *th, struct inode *inode, struct treepath *path, const struct cpu_key *item_key, int *removed, /* Number of unformatted nodes which were removed
bd4c625c 952 from end of the file. */
ee93961b 953 int *cut_size, unsigned long long new_file_length /* MAX_KEY_OFFSET in case of delete. */
bd4c625c
LT
954 )
955{
a9dd3643 956 struct super_block *sb = inode->i_sb;
d68caa95
JM
957 struct item_head *p_le_ih = PATH_PITEM_HEAD(path);
958 struct buffer_head *bh = PATH_PLAST_BUFFER(path);
1da177e4 959
bd4c625c 960 BUG_ON(!th->t_trans_id);
1da177e4 961
bd4c625c
LT
962 /* Stat_data item. */
963 if (is_statdata_le_ih(p_le_ih)) {
1da177e4 964
ee93961b 965 RFALSE(new_file_length != max_reiserfs_offset(inode),
bd4c625c 966 "PAP-5210: mode must be M_DELETE");
1da177e4 967
d68caa95 968 *cut_size = -(IH_SIZE + ih_item_len(p_le_ih));
bd4c625c
LT
969 return M_DELETE;
970 }
1da177e4 971
bd4c625c
LT
972 /* Directory item. */
973 if (is_direntry_le_ih(p_le_ih))
d68caa95 974 return prepare_for_direntry_item(path, p_le_ih, inode,
ee93961b 975 new_file_length,
d68caa95 976 cut_size);
1da177e4 977
bd4c625c
LT
978 /* Direct item. */
979 if (is_direct_le_ih(p_le_ih))
d68caa95 980 return prepare_for_direct_item(path, p_le_ih, inode,
ee93961b 981 new_file_length, cut_size);
bd4c625c
LT
982
983 /* Case of an indirect item. */
984 {
a9dd3643 985 int blk_size = sb->s_blocksize;
23f9e0f8
AZ
986 struct item_head s_ih;
987 int need_re_search;
988 int delete = 0;
989 int result = M_CUT;
990 int pos = 0;
991
ee93961b 992 if ( new_file_length == max_reiserfs_offset (inode) ) {
23f9e0f8
AZ
993 /* prepare_for_delete_or_cut() is called by
994 * reiserfs_delete_item() */
ee93961b 995 new_file_length = 0;
23f9e0f8
AZ
996 delete = 1;
997 }
998
999 do {
1000 need_re_search = 0;
d68caa95
JM
1001 *cut_size = 0;
1002 bh = PATH_PLAST_BUFFER(path);
1003 copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
23f9e0f8 1004 pos = I_UNFM_NUM(&s_ih);
bd4c625c 1005
ee93961b 1006 while (le_ih_k_offset (&s_ih) + (pos - 1) * blk_size > new_file_length) {
87588dd6
AV
1007 __le32 *unfm;
1008 __u32 block;
bd4c625c 1009
23f9e0f8
AZ
1010 /* Each unformatted block deletion may involve one additional
1011 * bitmap block into the transaction, thereby the initial
1012 * journal space reservation might not be enough. */
d68caa95
JM
1013 if (!delete && (*cut_size) != 0 &&
1014 reiserfs_transaction_free_space(th) < JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD)
23f9e0f8 1015 break;
bd4c625c 1016
ad31a4fc 1017 unfm = (__le32 *)B_I_PITEM(bh, &s_ih) + pos - 1;
23f9e0f8 1018 block = get_block_num(unfm, 0);
bd4c625c 1019
23f9e0f8 1020 if (block != 0) {
ad31a4fc 1021 reiserfs_prepare_for_journal(sb, bh, 1);
23f9e0f8 1022 put_block_num(unfm, 0, 0);
ad31a4fc 1023 journal_mark_dirty(th, sb, bh);
23f9e0f8
AZ
1024 reiserfs_free_block(th, inode, block, 1);
1025 }
bd4c625c 1026
23f9e0f8 1027 cond_resched();
bd4c625c 1028
d68caa95 1029 if (item_moved (&s_ih, path)) {
23f9e0f8
AZ
1030 need_re_search = 1;
1031 break;
1032 }
1033
1034 pos --;
d68caa95
JM
1035 (*removed)++;
1036 (*cut_size) -= UNFM_P_SIZE;
23f9e0f8
AZ
1037
1038 if (pos == 0) {
d68caa95 1039 (*cut_size) -= IH_SIZE;
23f9e0f8
AZ
1040 result = M_DELETE;
1041 break;
1042 }
1043 }
1044 /* a trick. If the buffer has been logged, this will do nothing. If
1045 ** we've broken the loop without logging it, it will restore the
1046 ** buffer */
ad31a4fc 1047 reiserfs_restore_prepared_buffer(sb, bh);
23f9e0f8 1048 } while (need_re_search &&
d68caa95
JM
1049 search_for_position_by_key(sb, item_key, path) == POSITION_FOUND);
1050 pos_in_item(path) = pos * UNFM_P_SIZE;
23f9e0f8 1051
d68caa95 1052 if (*cut_size == 0) {
23f9e0f8
AZ
1053 /* Nothing were cut. maybe convert last unformatted node to the
1054 * direct item? */
1055 result = M_CONVERT;
1056 }
1057 return result;
bd4c625c 1058 }
1da177e4
LT
1059}
1060
1061/* Calculate number of bytes which will be deleted or cut during balance */
ee93961b 1062static int calc_deleted_bytes_number(struct tree_balance *tb, char mode)
bd4c625c 1063{
ee93961b 1064 int del_size;
a063ae17 1065 struct item_head *p_le_ih = PATH_PITEM_HEAD(tb->tb_path);
bd4c625c
LT
1066
1067 if (is_statdata_le_ih(p_le_ih))
1068 return 0;
1069
ee93961b
JM
1070 del_size =
1071 (mode ==
a063ae17 1072 M_DELETE) ? ih_item_len(p_le_ih) : -tb->insert_size[0];
bd4c625c 1073 if (is_direntry_le_ih(p_le_ih)) {
ee93961b
JM
1074 /* return EMPTY_DIR_SIZE; We delete emty directoris only.
1075 * we can't use EMPTY_DIR_SIZE, as old format dirs have a different
1076 * empty size. ick. FIXME, is this right? */
1077 return del_size;
bd4c625c 1078 }
1da177e4 1079
bd4c625c 1080 if (is_indirect_le_ih(p_le_ih))
ee93961b 1081 del_size = (del_size / UNFM_P_SIZE) *
a063ae17 1082 (PATH_PLAST_BUFFER(tb->tb_path)->b_size);
ee93961b 1083 return del_size;
1da177e4
LT
1084}
1085
bd4c625c 1086static void init_tb_struct(struct reiserfs_transaction_handle *th,
a063ae17 1087 struct tree_balance *tb,
a9dd3643 1088 struct super_block *sb,
ee93961b 1089 struct treepath *path, int size)
bd4c625c 1090{
1da177e4 1091
bd4c625c 1092 BUG_ON(!th->t_trans_id);
1da177e4 1093
a063ae17
JM
1094 memset(tb, '\0', sizeof(struct tree_balance));
1095 tb->transaction_handle = th;
1096 tb->tb_sb = sb;
d68caa95
JM
1097 tb->tb_path = path;
1098 PATH_OFFSET_PBUFFER(path, ILLEGAL_PATH_ELEMENT_OFFSET) = NULL;
1099 PATH_OFFSET_POSITION(path, ILLEGAL_PATH_ELEMENT_OFFSET) = 0;
ee93961b 1100 tb->insert_size[0] = size;
bd4c625c 1101}
1da177e4 1102
bd4c625c 1103void padd_item(char *item, int total_length, int length)
1da177e4 1104{
bd4c625c 1105 int i;
1da177e4 1106
bd4c625c
LT
1107 for (i = total_length; i > length;)
1108 item[--i] = 0;
1da177e4
LT
1109}
1110
1111#ifdef REISERQUOTA_DEBUG
1112char key2type(struct reiserfs_key *ih)
1113{
bd4c625c
LT
1114 if (is_direntry_le_key(2, ih))
1115 return 'd';
1116 if (is_direct_le_key(2, ih))
1117 return 'D';
1118 if (is_indirect_le_key(2, ih))
1119 return 'i';
1120 if (is_statdata_le_key(2, ih))
1121 return 's';
1122 return 'u';
1da177e4
LT
1123}
1124
1125char head2type(struct item_head *ih)
1126{
bd4c625c
LT
1127 if (is_direntry_le_ih(ih))
1128 return 'd';
1129 if (is_direct_le_ih(ih))
1130 return 'D';
1131 if (is_indirect_le_ih(ih))
1132 return 'i';
1133 if (is_statdata_le_ih(ih))
1134 return 's';
1135 return 'u';
1da177e4
LT
1136}
1137#endif
1138
d68caa95
JM
1139/* Delete object item.
1140 * th - active transaction handle
1141 * path - path to the deleted item
1142 * item_key - key to search for the deleted item
1143 * indode - used for updating i_blocks and quotas
1144 * un_bh - NULL or unformatted node pointer
1145 */
1146int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
1147 struct treepath *path, const struct cpu_key *item_key,
1148 struct inode *inode, struct buffer_head *un_bh)
1149{
995c762e 1150 struct super_block *sb = inode->i_sb;
bd4c625c
LT
1151 struct tree_balance s_del_balance;
1152 struct item_head s_ih;
1153 struct item_head *q_ih;
1154 int quota_cut_bytes;
ee93961b 1155 int ret_value, del_size, removed;
1da177e4
LT
1156
1157#ifdef CONFIG_REISERFS_CHECK
ee93961b
JM
1158 char mode;
1159 int iter = 0;
1da177e4
LT
1160#endif
1161
bd4c625c 1162 BUG_ON(!th->t_trans_id);
1da177e4 1163
d68caa95 1164 init_tb_struct(th, &s_del_balance, sb, path,
bd4c625c 1165 0 /*size is unknown */ );
1da177e4 1166
bd4c625c 1167 while (1) {
ee93961b 1168 removed = 0;
1da177e4
LT
1169
1170#ifdef CONFIG_REISERFS_CHECK
ee93961b
JM
1171 iter++;
1172 mode =
1da177e4 1173#endif
d68caa95 1174 prepare_for_delete_or_cut(th, inode, path,
ee93961b
JM
1175 item_key, &removed,
1176 &del_size,
995c762e 1177 max_reiserfs_offset(inode));
bd4c625c 1178
ee93961b 1179 RFALSE(mode != M_DELETE, "PAP-5320: mode must be M_DELETE");
bd4c625c 1180
d68caa95 1181 copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
ee93961b 1182 s_del_balance.insert_size[0] = del_size;
bd4c625c 1183
ee93961b
JM
1184 ret_value = fix_nodes(M_DELETE, &s_del_balance, NULL, NULL);
1185 if (ret_value != REPEAT_SEARCH)
bd4c625c
LT
1186 break;
1187
a9dd3643 1188 PROC_INFO_INC(sb, delete_item_restarted);
bd4c625c
LT
1189
1190 // file system changed, repeat search
ee93961b 1191 ret_value =
d68caa95 1192 search_for_position_by_key(sb, item_key, path);
ee93961b 1193 if (ret_value == IO_ERROR)
bd4c625c 1194 break;
ee93961b 1195 if (ret_value == FILE_NOT_FOUND) {
a9dd3643 1196 reiserfs_warning(sb, "vs-5340",
bd4c625c 1197 "no items of the file %K found",
d68caa95 1198 item_key);
bd4c625c
LT
1199 break;
1200 }
1201 } /* while (1) */
1da177e4 1202
ee93961b 1203 if (ret_value != CARRY_ON) {
bd4c625c
LT
1204 unfix_nodes(&s_del_balance);
1205 return 0;
1206 }
1207 // reiserfs_delete_item returns item length when success
ee93961b 1208 ret_value = calc_deleted_bytes_number(&s_del_balance, M_DELETE);
d68caa95 1209 q_ih = get_ih(path);
bd4c625c
LT
1210 quota_cut_bytes = ih_item_len(q_ih);
1211
1212 /* hack so the quota code doesn't have to guess if the file
1213 ** has a tail. On tail insert, we allocate quota for 1 unformatted node.
1214 ** We test the offset because the tail might have been
1215 ** split into multiple items, and we only want to decrement for
1216 ** the unfm node once
1217 */
995c762e 1218 if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(q_ih)) {
a9dd3643
JM
1219 if ((le_ih_k_offset(q_ih) & (sb->s_blocksize - 1)) == 1) {
1220 quota_cut_bytes = sb->s_blocksize + UNFM_P_SIZE;
bd4c625c
LT
1221 } else {
1222 quota_cut_bytes = 0;
1223 }
1da177e4 1224 }
1da177e4 1225
d68caa95 1226 if (un_bh) {
bd4c625c
LT
1227 int off;
1228 char *data;
1229
1230 /* We are in direct2indirect conversion, so move tail contents
1231 to the unformatted node */
1232 /* note, we do the copy before preparing the buffer because we
1233 ** don't care about the contents of the unformatted node yet.
1234 ** the only thing we really care about is the direct item's data
1235 ** is in the unformatted node.
1236 **
1237 ** Otherwise, we would have to call reiserfs_prepare_for_journal on
1238 ** the unformatted node, which might schedule, meaning we'd have to
1239 ** loop all the way back up to the start of the while loop.
1240 **
1241 ** The unformatted node must be dirtied later on. We can't be
1242 ** sure here if the entire tail has been deleted yet.
1243 **
d68caa95 1244 ** un_bh is from the page cache (all unformatted nodes are
bd4c625c 1245 ** from the page cache) and might be a highmem page. So, we
d68caa95 1246 ** can't use un_bh->b_data.
bd4c625c
LT
1247 ** -clm
1248 */
1249
d68caa95 1250 data = kmap_atomic(un_bh->b_page, KM_USER0);
bd4c625c
LT
1251 off = ((le_ih_k_offset(&s_ih) - 1) & (PAGE_CACHE_SIZE - 1));
1252 memcpy(data + off,
d68caa95 1253 B_I_PITEM(PATH_PLAST_BUFFER(path), &s_ih),
ee93961b 1254 ret_value);
bd4c625c 1255 kunmap_atomic(data, KM_USER0);
1da177e4 1256 }
bd4c625c
LT
1257 /* Perform balancing after all resources have been collected at once. */
1258 do_balance(&s_del_balance, NULL, NULL, M_DELETE);
1da177e4
LT
1259
1260#ifdef REISERQUOTA_DEBUG
a9dd3643 1261 reiserfs_debug(sb, REISERFS_DEBUG_CODE,
bd4c625c 1262 "reiserquota delete_item(): freeing %u, id=%u type=%c",
995c762e 1263 quota_cut_bytes, inode->i_uid, head2type(&s_ih));
1da177e4 1264#endif
e1c50248 1265 vfs_dq_free_space_nodirty(inode, quota_cut_bytes);
1da177e4 1266
bd4c625c 1267 /* Return deleted body length */
ee93961b 1268 return ret_value;
1da177e4
LT
1269}
1270
1da177e4
LT
1271/* Summary Of Mechanisms For Handling Collisions Between Processes:
1272
1273 deletion of the body of the object is performed by iput(), with the
1274 result that if multiple processes are operating on a file, the
1275 deletion of the body of the file is deferred until the last process
1276 that has an open inode performs its iput().
1277
1278 writes and truncates are protected from collisions by use of
1279 semaphores.
1280
1281 creates, linking, and mknod are protected from collisions with other
1282 processes by making the reiserfs_add_entry() the last step in the
1283 creation, and then rolling back all changes if there was a collision.
1284 - Hans
1285*/
1286
1da177e4 1287/* this deletes item which never gets split */
bd4c625c
LT
1288void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
1289 struct inode *inode, struct reiserfs_key *key)
1da177e4 1290{
bd4c625c
LT
1291 struct tree_balance tb;
1292 INITIALIZE_PATH(path);
1293 int item_len = 0;
1294 int tb_init = 0;
1295 struct cpu_key cpu_key;
1296 int retval;
1297 int quota_cut_bytes = 0;
1298
1299 BUG_ON(!th->t_trans_id);
1300
1301 le_key2cpu_key(&cpu_key, key);
1302
1303 while (1) {
1304 retval = search_item(th->t_super, &cpu_key, &path);
1305 if (retval == IO_ERROR) {
0030b645
JM
1306 reiserfs_error(th->t_super, "vs-5350",
1307 "i/o failure occurred trying "
1308 "to delete %K", &cpu_key);
bd4c625c
LT
1309 break;
1310 }
1311 if (retval != ITEM_FOUND) {
1312 pathrelse(&path);
1313 // No need for a warning, if there is just no free space to insert '..' item into the newly-created subdir
1314 if (!
1315 ((unsigned long long)
1316 GET_HASH_VALUE(le_key_k_offset
1317 (le_key_version(key), key)) == 0
1318 && (unsigned long long)
1319 GET_GENERATION_NUMBER(le_key_k_offset
1320 (le_key_version(key),
1321 key)) == 1))
45b03d5e
JM
1322 reiserfs_warning(th->t_super, "vs-5355",
1323 "%k not found", key);
bd4c625c
LT
1324 break;
1325 }
1326 if (!tb_init) {
1327 tb_init = 1;
1328 item_len = ih_item_len(PATH_PITEM_HEAD(&path));
1329 init_tb_struct(th, &tb, th->t_super, &path,
1330 -(IH_SIZE + item_len));
1331 }
1332 quota_cut_bytes = ih_item_len(PATH_PITEM_HEAD(&path));
1da177e4 1333
bd4c625c
LT
1334 retval = fix_nodes(M_DELETE, &tb, NULL, NULL);
1335 if (retval == REPEAT_SEARCH) {
1336 PROC_INFO_INC(th->t_super, delete_solid_item_restarted);
1337 continue;
1338 }
1da177e4 1339
bd4c625c
LT
1340 if (retval == CARRY_ON) {
1341 do_balance(&tb, NULL, NULL, M_DELETE);
1342 if (inode) { /* Should we count quota for item? (we don't count quotas for save-links) */
1da177e4 1343#ifdef REISERQUOTA_DEBUG
bd4c625c
LT
1344 reiserfs_debug(th->t_super, REISERFS_DEBUG_CODE,
1345 "reiserquota delete_solid_item(): freeing %u id=%u type=%c",
1346 quota_cut_bytes, inode->i_uid,
1347 key2type(key));
1da177e4 1348#endif
77db4f25 1349 vfs_dq_free_space_nodirty(inode,
bd4c625c
LT
1350 quota_cut_bytes);
1351 }
1352 break;
1353 }
1354 // IO_ERROR, NO_DISK_SPACE, etc
45b03d5e 1355 reiserfs_warning(th->t_super, "vs-5360",
bd4c625c
LT
1356 "could not delete %K due to fix_nodes failure",
1357 &cpu_key);
1358 unfix_nodes(&tb);
1359 break;
1da177e4
LT
1360 }
1361
bd4c625c 1362 reiserfs_check_path(&path);
1da177e4
LT
1363}
1364
bd4c625c
LT
1365int reiserfs_delete_object(struct reiserfs_transaction_handle *th,
1366 struct inode *inode)
1da177e4 1367{
bd4c625c
LT
1368 int err;
1369 inode->i_size = 0;
1370 BUG_ON(!th->t_trans_id);
1371
1372 /* for directory this deletes item containing "." and ".." */
1373 err =
1374 reiserfs_do_truncate(th, inode, NULL, 0 /*no timestamp updates */ );
1375 if (err)
1376 return err;
1377
1da177e4 1378#if defined( USE_INODE_GENERATION_COUNTER )
bd4c625c
LT
1379 if (!old_format_only(th->t_super)) {
1380 __le32 *inode_generation;
1381
1382 inode_generation =
1383 &REISERFS_SB(th->t_super)->s_rs->s_inode_generation;
9e902df6 1384 le32_add_cpu(inode_generation, 1);
bd4c625c 1385 }
1da177e4
LT
1386/* USE_INODE_GENERATION_COUNTER */
1387#endif
bd4c625c 1388 reiserfs_delete_solid_item(th, inode, INODE_PKEY(inode));
1da177e4 1389
bd4c625c 1390 return err;
1da177e4
LT
1391}
1392
bd4c625c
LT
1393static void unmap_buffers(struct page *page, loff_t pos)
1394{
1395 struct buffer_head *bh;
1396 struct buffer_head *head;
1397 struct buffer_head *next;
1398 unsigned long tail_index;
1399 unsigned long cur_index;
1400
1401 if (page) {
1402 if (page_has_buffers(page)) {
1403 tail_index = pos & (PAGE_CACHE_SIZE - 1);
1404 cur_index = 0;
1405 head = page_buffers(page);
1406 bh = head;
1407 do {
1408 next = bh->b_this_page;
1409
1410 /* we want to unmap the buffers that contain the tail, and
1411 ** all the buffers after it (since the tail must be at the
1412 ** end of the file). We don't want to unmap file data
1413 ** before the tail, since it might be dirty and waiting to
1414 ** reach disk
1415 */
1416 cur_index += bh->b_size;
1417 if (cur_index > tail_index) {
1418 reiserfs_unmap_buffer(bh);
1419 }
1420 bh = next;
1421 } while (bh != head);
1da177e4 1422 }
1da177e4 1423 }
1da177e4
LT
1424}
1425
bd4c625c 1426static int maybe_indirect_to_direct(struct reiserfs_transaction_handle *th,
995c762e 1427 struct inode *inode,
bd4c625c 1428 struct page *page,
d68caa95
JM
1429 struct treepath *path,
1430 const struct cpu_key *item_key,
ee93961b 1431 loff_t new_file_size, char *mode)
bd4c625c 1432{
995c762e 1433 struct super_block *sb = inode->i_sb;
ee93961b 1434 int block_size = sb->s_blocksize;
bd4c625c
LT
1435 int cut_bytes;
1436 BUG_ON(!th->t_trans_id);
ee93961b 1437 BUG_ON(new_file_size != inode->i_size);
1da177e4 1438
bd4c625c
LT
1439 /* the page being sent in could be NULL if there was an i/o error
1440 ** reading in the last block. The user will hit problems trying to
1441 ** read the file, but for now we just skip the indirect2direct
1442 */
995c762e
JM
1443 if (atomic_read(&inode->i_count) > 1 ||
1444 !tail_has_to_be_packed(inode) ||
1445 !page || (REISERFS_I(inode)->i_flags & i_nopack_mask)) {
0222e657 1446 /* leave tail in an unformatted node */
d68caa95 1447 *mode = M_SKIP_BALANCING;
bd4c625c 1448 cut_bytes =
ee93961b 1449 block_size - (new_file_size & (block_size - 1));
d68caa95 1450 pathrelse(path);
bd4c625c
LT
1451 return cut_bytes;
1452 }
d68caa95
JM
1453 /* Perform the conversion to a direct_item. */
1454 /* return indirect_to_direct(inode, path, item_key,
ee93961b 1455 new_file_size, mode); */
d68caa95 1456 return indirect2direct(th, inode, page, path, item_key,
ee93961b 1457 new_file_size, mode);
bd4c625c 1458}
1da177e4
LT
1459
1460/* we did indirect_to_direct conversion. And we have inserted direct
1461 item successesfully, but there were no disk space to cut unfm
1462 pointer being converted. Therefore we have to delete inserted
1463 direct item(s) */
bd4c625c 1464static void indirect_to_direct_roll_back(struct reiserfs_transaction_handle *th,
fec6d055 1465 struct inode *inode, struct treepath *path)
1da177e4 1466{
bd4c625c
LT
1467 struct cpu_key tail_key;
1468 int tail_len;
1469 int removed;
1470 BUG_ON(!th->t_trans_id);
1471
1472 make_cpu_key(&tail_key, inode, inode->i_size + 1, TYPE_DIRECT, 4); // !!!!
1473 tail_key.key_length = 4;
1474
1475 tail_len =
1476 (cpu_key_k_offset(&tail_key) & (inode->i_sb->s_blocksize - 1)) - 1;
1477 while (tail_len) {
1478 /* look for the last byte of the tail */
1479 if (search_for_position_by_key(inode->i_sb, &tail_key, path) ==
1480 POSITION_NOT_FOUND)
c3a9c210
JM
1481 reiserfs_panic(inode->i_sb, "vs-5615",
1482 "found invalid item");
bd4c625c
LT
1483 RFALSE(path->pos_in_item !=
1484 ih_item_len(PATH_PITEM_HEAD(path)) - 1,
1485 "vs-5616: appended bytes found");
1486 PATH_LAST_POSITION(path)--;
1487
1488 removed =
1489 reiserfs_delete_item(th, path, &tail_key, inode,
1490 NULL /*unbh not needed */ );
1491 RFALSE(removed <= 0
1492 || removed > tail_len,
1493 "vs-5617: there was tail %d bytes, removed item length %d bytes",
1494 tail_len, removed);
1495 tail_len -= removed;
1496 set_cpu_key_k_offset(&tail_key,
1497 cpu_key_k_offset(&tail_key) - removed);
1498 }
45b03d5e
JM
1499 reiserfs_warning(inode->i_sb, "reiserfs-5091", "indirect_to_direct "
1500 "conversion has been rolled back due to "
1501 "lack of disk space");
bd4c625c
LT
1502 //mark_file_without_tail (inode);
1503 mark_inode_dirty(inode);
1da177e4
LT
1504}
1505
1da177e4 1506/* (Truncate or cut entry) or delete object item. Returns < 0 on failure */
bd4c625c 1507int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
d68caa95
JM
1508 struct treepath *path,
1509 struct cpu_key *item_key,
995c762e 1510 struct inode *inode,
ee93961b 1511 struct page *page, loff_t new_file_size)
1da177e4 1512{
995c762e 1513 struct super_block *sb = inode->i_sb;
bd4c625c
LT
1514 /* Every function which is going to call do_balance must first
1515 create a tree_balance structure. Then it must fill up this
1516 structure by using the init_tb_struct and fix_nodes functions.
1517 After that we can make tree balancing. */
1518 struct tree_balance s_cut_balance;
1519 struct item_head *p_le_ih;
ee93961b
JM
1520 int cut_size = 0, /* Amount to be cut. */
1521 ret_value = CARRY_ON, removed = 0, /* Number of the removed unformatted nodes. */
1522 is_inode_locked = 0;
1523 char mode; /* Mode of the balance. */
bd4c625c
LT
1524 int retval2 = -1;
1525 int quota_cut_bytes;
1526 loff_t tail_pos = 0;
1527
1528 BUG_ON(!th->t_trans_id);
1529
d68caa95 1530 init_tb_struct(th, &s_cut_balance, inode->i_sb, path,
ee93961b 1531 cut_size);
bd4c625c
LT
1532
1533 /* Repeat this loop until we either cut the item without needing
1534 to balance, or we fix_nodes without schedule occurring */
1535 while (1) {
1536 /* Determine the balance mode, position of the first byte to
1537 be cut, and size to be cut. In case of the indirect item
1538 free unformatted nodes which are pointed to by the cut
1539 pointers. */
1540
ee93961b 1541 mode =
d68caa95 1542 prepare_for_delete_or_cut(th, inode, path,
ee93961b
JM
1543 item_key, &removed,
1544 &cut_size, new_file_size);
1545 if (mode == M_CONVERT) {
bd4c625c
LT
1546 /* convert last unformatted node to direct item or leave
1547 tail in the unformatted node */
ee93961b 1548 RFALSE(ret_value != CARRY_ON,
bd4c625c
LT
1549 "PAP-5570: can not convert twice");
1550
ee93961b 1551 ret_value =
995c762e 1552 maybe_indirect_to_direct(th, inode, page,
d68caa95 1553 path, item_key,
ee93961b
JM
1554 new_file_size, &mode);
1555 if (mode == M_SKIP_BALANCING)
bd4c625c 1556 /* tail has been left in the unformatted node */
ee93961b 1557 return ret_value;
bd4c625c 1558
ee93961b 1559 is_inode_locked = 1;
bd4c625c
LT
1560
1561 /* removing of last unformatted node will change value we
1562 have to return to truncate. Save it */
ee93961b
JM
1563 retval2 = ret_value;
1564 /*retval2 = sb->s_blocksize - (new_file_size & (sb->s_blocksize - 1)); */
bd4c625c
LT
1565
1566 /* So, we have performed the first part of the conversion:
1567 inserting the new direct item. Now we are removing the
1568 last unformatted node pointer. Set key to search for
1569 it. */
d68caa95
JM
1570 set_cpu_key_k_type(item_key, TYPE_INDIRECT);
1571 item_key->key_length = 4;
ee93961b
JM
1572 new_file_size -=
1573 (new_file_size & (sb->s_blocksize - 1));
1574 tail_pos = new_file_size;
1575 set_cpu_key_k_offset(item_key, new_file_size + 1);
bd4c625c 1576 if (search_for_position_by_key
d68caa95
JM
1577 (sb, item_key,
1578 path) == POSITION_NOT_FOUND) {
1579 print_block(PATH_PLAST_BUFFER(path), 3,
1580 PATH_LAST_POSITION(path) - 1,
1581 PATH_LAST_POSITION(path) + 1);
a9dd3643 1582 reiserfs_panic(sb, "PAP-5580", "item to "
c3a9c210 1583 "convert does not exist (%K)",
d68caa95 1584 item_key);
bd4c625c
LT
1585 }
1586 continue;
1587 }
ee93961b 1588 if (cut_size == 0) {
d68caa95 1589 pathrelse(path);
bd4c625c
LT
1590 return 0;
1591 }
1592
ee93961b 1593 s_cut_balance.insert_size[0] = cut_size;
bd4c625c 1594
ee93961b
JM
1595 ret_value = fix_nodes(mode, &s_cut_balance, NULL, NULL);
1596 if (ret_value != REPEAT_SEARCH)
bd4c625c
LT
1597 break;
1598
a9dd3643 1599 PROC_INFO_INC(sb, cut_from_item_restarted);
bd4c625c 1600
ee93961b 1601 ret_value =
d68caa95 1602 search_for_position_by_key(sb, item_key, path);
ee93961b 1603 if (ret_value == POSITION_FOUND)
bd4c625c 1604 continue;
1da177e4 1605
a9dd3643 1606 reiserfs_warning(sb, "PAP-5610", "item %K not found",
d68caa95 1607 item_key);
bd4c625c 1608 unfix_nodes(&s_cut_balance);
ee93961b 1609 return (ret_value == IO_ERROR) ? -EIO : -ENOENT;
bd4c625c
LT
1610 } /* while */
1611
1612 // check fix_nodes results (IO_ERROR or NO_DISK_SPACE)
ee93961b
JM
1613 if (ret_value != CARRY_ON) {
1614 if (is_inode_locked) {
bd4c625c
LT
1615 // FIXME: this seems to be not needed: we are always able
1616 // to cut item
d68caa95 1617 indirect_to_direct_roll_back(th, inode, path);
bd4c625c 1618 }
ee93961b 1619 if (ret_value == NO_DISK_SPACE)
a9dd3643 1620 reiserfs_warning(sb, "reiserfs-5092",
45b03d5e 1621 "NO_DISK_SPACE");
bd4c625c
LT
1622 unfix_nodes(&s_cut_balance);
1623 return -EIO;
1da177e4 1624 }
bd4c625c
LT
1625
1626 /* go ahead and perform balancing */
1627
ee93961b 1628 RFALSE(mode == M_PASTE || mode == M_INSERT, "invalid mode");
bd4c625c
LT
1629
1630 /* Calculate number of bytes that need to be cut from the item. */
1631 quota_cut_bytes =
ee93961b 1632 (mode ==
d68caa95 1633 M_DELETE) ? ih_item_len(get_ih(path)) : -s_cut_balance.
bd4c625c
LT
1634 insert_size[0];
1635 if (retval2 == -1)
ee93961b 1636 ret_value = calc_deleted_bytes_number(&s_cut_balance, mode);
bd4c625c 1637 else
ee93961b 1638 ret_value = retval2;
bd4c625c
LT
1639
1640 /* For direct items, we only change the quota when deleting the last
1641 ** item.
1642 */
1643 p_le_ih = PATH_PITEM_HEAD(s_cut_balance.tb_path);
995c762e 1644 if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(p_le_ih)) {
ee93961b 1645 if (mode == M_DELETE &&
a9dd3643 1646 (le_ih_k_offset(p_le_ih) & (sb->s_blocksize - 1)) ==
bd4c625c
LT
1647 1) {
1648 // FIXME: this is to keep 3.5 happy
995c762e 1649 REISERFS_I(inode)->i_first_direct_byte = U32_MAX;
a9dd3643 1650 quota_cut_bytes = sb->s_blocksize + UNFM_P_SIZE;
bd4c625c
LT
1651 } else {
1652 quota_cut_bytes = 0;
1653 }
1da177e4 1654 }
1da177e4 1655#ifdef CONFIG_REISERFS_CHECK
ee93961b 1656 if (is_inode_locked) {
bd4c625c
LT
1657 struct item_head *le_ih =
1658 PATH_PITEM_HEAD(s_cut_balance.tb_path);
1659 /* we are going to complete indirect2direct conversion. Make
1660 sure, that we exactly remove last unformatted node pointer
1661 of the item */
1662 if (!is_indirect_le_ih(le_ih))
a9dd3643 1663 reiserfs_panic(sb, "vs-5652",
bd4c625c
LT
1664 "item must be indirect %h", le_ih);
1665
ee93961b 1666 if (mode == M_DELETE && ih_item_len(le_ih) != UNFM_P_SIZE)
a9dd3643 1667 reiserfs_panic(sb, "vs-5653", "completing "
c3a9c210
JM
1668 "indirect2direct conversion indirect "
1669 "item %h being deleted must be of "
1670 "4 byte long", le_ih);
bd4c625c 1671
ee93961b 1672 if (mode == M_CUT
bd4c625c 1673 && s_cut_balance.insert_size[0] != -UNFM_P_SIZE) {
a9dd3643 1674 reiserfs_panic(sb, "vs-5654", "can not complete "
c3a9c210
JM
1675 "indirect2direct conversion of %h "
1676 "(CUT, insert_size==%d)",
bd4c625c
LT
1677 le_ih, s_cut_balance.insert_size[0]);
1678 }
1679 /* it would be useful to make sure, that right neighboring
1680 item is direct item of this file */
1da177e4 1681 }
1da177e4 1682#endif
bd4c625c 1683
ee93961b
JM
1684 do_balance(&s_cut_balance, NULL, NULL, mode);
1685 if (is_inode_locked) {
bd4c625c
LT
1686 /* we've done an indirect->direct conversion. when the data block
1687 ** was freed, it was removed from the list of blocks that must
1688 ** be flushed before the transaction commits, make sure to
1689 ** unmap and invalidate it
1690 */
1691 unmap_buffers(page, tail_pos);
995c762e 1692 REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask;
bd4c625c 1693 }
1da177e4 1694#ifdef REISERQUOTA_DEBUG
995c762e 1695 reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
bd4c625c 1696 "reiserquota cut_from_item(): freeing %u id=%u type=%c",
995c762e 1697 quota_cut_bytes, inode->i_uid, '?');
1da177e4 1698#endif
e1c50248 1699 vfs_dq_free_space_nodirty(inode, quota_cut_bytes);
ee93961b 1700 return ret_value;
1da177e4
LT
1701}
1702
bd4c625c
LT
1703static void truncate_directory(struct reiserfs_transaction_handle *th,
1704 struct inode *inode)
1da177e4 1705{
bd4c625c
LT
1706 BUG_ON(!th->t_trans_id);
1707 if (inode->i_nlink)
0030b645 1708 reiserfs_error(inode->i_sb, "vs-5655", "link count != 0");
bd4c625c
LT
1709
1710 set_le_key_k_offset(KEY_FORMAT_3_5, INODE_PKEY(inode), DOT_OFFSET);
1711 set_le_key_k_type(KEY_FORMAT_3_5, INODE_PKEY(inode), TYPE_DIRENTRY);
1712 reiserfs_delete_solid_item(th, inode, INODE_PKEY(inode));
1713 reiserfs_update_sd(th, inode);
1714 set_le_key_k_offset(KEY_FORMAT_3_5, INODE_PKEY(inode), SD_OFFSET);
1715 set_le_key_k_type(KEY_FORMAT_3_5, INODE_PKEY(inode), TYPE_STAT_DATA);
1da177e4
LT
1716}
1717
bd4c625c
LT
1718/* Truncate file to the new size. Note, this must be called with a transaction
1719 already started */
995c762e
JM
1720int reiserfs_do_truncate(struct reiserfs_transaction_handle *th,
1721 struct inode *inode, /* ->i_size contains new size */
bd4c625c
LT
1722 struct page *page, /* up to date for last block */
1723 int update_timestamps /* when it is called by
1724 file_release to convert
1725 the tail - no timestamps
1726 should be updated */
1727 )
1728{
1729 INITIALIZE_PATH(s_search_path); /* Path to the current object item. */
1730 struct item_head *p_le_ih; /* Pointer to an item header. */
1731 struct cpu_key s_item_key; /* Key to search for a previous file item. */
ee93961b
JM
1732 loff_t file_size, /* Old file size. */
1733 new_file_size; /* New file size. */
1734 int deleted; /* Number of deleted or truncated bytes. */
bd4c625c
LT
1735 int retval;
1736 int err = 0;
1737
1738 BUG_ON(!th->t_trans_id);
1739 if (!
995c762e
JM
1740 (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)
1741 || S_ISLNK(inode->i_mode)))
bd4c625c
LT
1742 return 0;
1743
995c762e 1744 if (S_ISDIR(inode->i_mode)) {
bd4c625c 1745 // deletion of directory - no need to update timestamps
995c762e 1746 truncate_directory(th, inode);
bd4c625c
LT
1747 return 0;
1748 }
1da177e4 1749
bd4c625c 1750 /* Get new file size. */
ee93961b 1751 new_file_size = inode->i_size;
1da177e4 1752
bd4c625c 1753 // FIXME: note, that key type is unimportant here
995c762e 1754 make_cpu_key(&s_item_key, inode, max_reiserfs_offset(inode),
bd4c625c 1755 TYPE_DIRECT, 3);
1da177e4 1756
bd4c625c 1757 retval =
995c762e 1758 search_for_position_by_key(inode->i_sb, &s_item_key,
bd4c625c
LT
1759 &s_search_path);
1760 if (retval == IO_ERROR) {
995c762e 1761 reiserfs_error(inode->i_sb, "vs-5657",
0030b645
JM
1762 "i/o failure occurred trying to truncate %K",
1763 &s_item_key);
bd4c625c
LT
1764 err = -EIO;
1765 goto out;
1766 }
1767 if (retval == POSITION_FOUND || retval == FILE_NOT_FOUND) {
995c762e 1768 reiserfs_error(inode->i_sb, "PAP-5660",
0030b645
JM
1769 "wrong result %d of search for %K", retval,
1770 &s_item_key);
bd4c625c
LT
1771
1772 err = -EIO;
1773 goto out;
1774 }
1da177e4 1775
bd4c625c
LT
1776 s_search_path.pos_in_item--;
1777
1778 /* Get real file size (total length of all file items) */
1779 p_le_ih = PATH_PITEM_HEAD(&s_search_path);
1780 if (is_statdata_le_ih(p_le_ih))
ee93961b 1781 file_size = 0;
bd4c625c
LT
1782 else {
1783 loff_t offset = le_ih_k_offset(p_le_ih);
1784 int bytes =
995c762e 1785 op_bytes_number(p_le_ih, inode->i_sb->s_blocksize);
bd4c625c
LT
1786
1787 /* this may mismatch with real file size: if last direct item
1788 had no padding zeros and last unformatted node had no free
1789 space, this file would have this file size */
ee93961b 1790 file_size = offset + bytes - 1;
bd4c625c
LT
1791 }
1792 /*
1793 * are we doing a full truncate or delete, if so
1794 * kick in the reada code
1795 */
ee93961b 1796 if (new_file_size == 0)
bd4c625c
LT
1797 s_search_path.reada = PATH_READA | PATH_READA_BACK;
1798
ee93961b 1799 if (file_size == 0 || file_size < new_file_size) {
bd4c625c 1800 goto update_and_out;
1da177e4
LT
1801 }
1802
bd4c625c 1803 /* Update key to search for the last file item. */
ee93961b 1804 set_cpu_key_k_offset(&s_item_key, file_size);
bd4c625c
LT
1805
1806 do {
1807 /* Cut or delete file item. */
ee93961b 1808 deleted =
bd4c625c 1809 reiserfs_cut_from_item(th, &s_search_path, &s_item_key,
ee93961b
JM
1810 inode, page, new_file_size);
1811 if (deleted < 0) {
995c762e 1812 reiserfs_warning(inode->i_sb, "vs-5665",
45b03d5e 1813 "reiserfs_cut_from_item failed");
bd4c625c
LT
1814 reiserfs_check_path(&s_search_path);
1815 return 0;
1816 }
1da177e4 1817
ee93961b 1818 RFALSE(deleted > file_size,
bd4c625c 1819 "PAP-5670: reiserfs_cut_from_item: too many bytes deleted: deleted %d, file_size %lu, item_key %K",
ee93961b 1820 deleted, file_size, &s_item_key);
1da177e4 1821
bd4c625c 1822 /* Change key to search the last file item. */
ee93961b 1823 file_size -= deleted;
1da177e4 1824
ee93961b 1825 set_cpu_key_k_offset(&s_item_key, file_size);
1da177e4 1826
bd4c625c
LT
1827 /* While there are bytes to truncate and previous file item is presented in the tree. */
1828
1829 /*
0222e657 1830 ** This loop could take a really long time, and could log
bd4c625c
LT
1831 ** many more blocks than a transaction can hold. So, we do a polite
1832 ** journal end here, and if the transaction needs ending, we make
1833 ** sure the file is consistent before ending the current trans
1834 ** and starting a new one
1835 */
23f9e0f8
AZ
1836 if (journal_transaction_should_end(th, 0) ||
1837 reiserfs_transaction_free_space(th) <= JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD) {
bd4c625c 1838 int orig_len_alloc = th->t_blocks_allocated;
3cd6dbe6 1839 pathrelse(&s_search_path);
bd4c625c
LT
1840
1841 if (update_timestamps) {
995c762e
JM
1842 inode->i_mtime = CURRENT_TIME_SEC;
1843 inode->i_ctime = CURRENT_TIME_SEC;
bd4c625c 1844 }
995c762e 1845 reiserfs_update_sd(th, inode);
bd4c625c 1846
995c762e 1847 err = journal_end(th, inode->i_sb, orig_len_alloc);
bd4c625c
LT
1848 if (err)
1849 goto out;
995c762e 1850 err = journal_begin(th, inode->i_sb,
23f9e0f8 1851 JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD + JOURNAL_PER_BALANCE_CNT * 4) ;
bd4c625c
LT
1852 if (err)
1853 goto out;
995c762e 1854 reiserfs_update_inode_transaction(inode);
bd4c625c 1855 }
ee93961b 1856 } while (file_size > ROUND_UP(new_file_size) &&
995c762e 1857 search_for_position_by_key(inode->i_sb, &s_item_key,
bd4c625c
LT
1858 &s_search_path) == POSITION_FOUND);
1859
ee93961b 1860 RFALSE(file_size > ROUND_UP(new_file_size),
bd4c625c 1861 "PAP-5680: truncate did not finish: new_file_size %Ld, current %Ld, oid %d",
ee93961b 1862 new_file_size, file_size, s_item_key.on_disk_key.k_objectid);
bd4c625c
LT
1863
1864 update_and_out:
1865 if (update_timestamps) {
1866 // this is truncate, not file closing
995c762e
JM
1867 inode->i_mtime = CURRENT_TIME_SEC;
1868 inode->i_ctime = CURRENT_TIME_SEC;
1da177e4 1869 }
995c762e 1870 reiserfs_update_sd(th, inode);
1da177e4 1871
bd4c625c
LT
1872 out:
1873 pathrelse(&s_search_path);
1874 return err;
1875}
1da177e4
LT
1876
1877#ifdef CONFIG_REISERFS_CHECK
1878// this makes sure, that we __append__, not overwrite or add holes
fec6d055 1879static void check_research_for_paste(struct treepath *path,
d68caa95 1880 const struct cpu_key *key)
1da177e4 1881{
bd4c625c
LT
1882 struct item_head *found_ih = get_ih(path);
1883
1884 if (is_direct_le_ih(found_ih)) {
1885 if (le_ih_k_offset(found_ih) +
1886 op_bytes_number(found_ih,
1887 get_last_bh(path)->b_size) !=
d68caa95 1888 cpu_key_k_offset(key)
bd4c625c
LT
1889 || op_bytes_number(found_ih,
1890 get_last_bh(path)->b_size) !=
1891 pos_in_item(path))
c3a9c210
JM
1892 reiserfs_panic(NULL, "PAP-5720", "found direct item "
1893 "%h or position (%d) does not match "
1894 "to key %K", found_ih,
d68caa95 1895 pos_in_item(path), key);
bd4c625c
LT
1896 }
1897 if (is_indirect_le_ih(found_ih)) {
1898 if (le_ih_k_offset(found_ih) +
1899 op_bytes_number(found_ih,
1900 get_last_bh(path)->b_size) !=
d68caa95 1901 cpu_key_k_offset(key)
bd4c625c
LT
1902 || I_UNFM_NUM(found_ih) != pos_in_item(path)
1903 || get_ih_free_space(found_ih) != 0)
c3a9c210
JM
1904 reiserfs_panic(NULL, "PAP-5730", "found indirect "
1905 "item (%h) or position (%d) does not "
1906 "match to key (%K)",
d68caa95 1907 found_ih, pos_in_item(path), key);
bd4c625c 1908 }
1da177e4 1909}
bd4c625c 1910#endif /* config reiserfs check */
1da177e4
LT
1911
1912/* Paste bytes to the existing item. Returns bytes number pasted into the item. */
d68caa95
JM
1913int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th, struct treepath *search_path, /* Path to the pasted item. */
1914 const struct cpu_key *key, /* Key to search for the needed item. */
bd4c625c 1915 struct inode *inode, /* Inode item belongs to */
d68caa95 1916 const char *body, /* Pointer to the bytes to paste. */
ee93961b 1917 int pasted_size)
bd4c625c
LT
1918{ /* Size of pasted bytes. */
1919 struct tree_balance s_paste_balance;
1920 int retval;
1921 int fs_gen;
1922
1923 BUG_ON(!th->t_trans_id);
1da177e4 1924
bd4c625c 1925 fs_gen = get_generation(inode->i_sb);
1da177e4
LT
1926
1927#ifdef REISERQUOTA_DEBUG
bd4c625c
LT
1928 reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
1929 "reiserquota paste_into_item(): allocating %u id=%u type=%c",
ee93961b 1930 pasted_size, inode->i_uid,
d68caa95 1931 key2type(&(key->on_disk_key)));
1da177e4
LT
1932#endif
1933
e1c50248 1934 if (vfs_dq_alloc_space_nodirty(inode, pasted_size)) {
d68caa95 1935 pathrelse(search_path);
bd4c625c
LT
1936 return -EDQUOT;
1937 }
d68caa95 1938 init_tb_struct(th, &s_paste_balance, th->t_super, search_path,
ee93961b 1939 pasted_size);
1da177e4 1940#ifdef DISPLACE_NEW_PACKING_LOCALITIES
d68caa95 1941 s_paste_balance.key = key->on_disk_key;
1da177e4
LT
1942#endif
1943
bd4c625c
LT
1944 /* DQUOT_* can schedule, must check before the fix_nodes */
1945 if (fs_changed(fs_gen, inode->i_sb)) {
1946 goto search_again;
1da177e4 1947 }
bd4c625c
LT
1948
1949 while ((retval =
1950 fix_nodes(M_PASTE, &s_paste_balance, NULL,
d68caa95 1951 body)) == REPEAT_SEARCH) {
bd4c625c
LT
1952 search_again:
1953 /* file system changed while we were in the fix_nodes */
1954 PROC_INFO_INC(th->t_super, paste_into_item_restarted);
1955 retval =
d68caa95
JM
1956 search_for_position_by_key(th->t_super, key,
1957 search_path);
bd4c625c
LT
1958 if (retval == IO_ERROR) {
1959 retval = -EIO;
1960 goto error_out;
1961 }
1962 if (retval == POSITION_FOUND) {
45b03d5e
JM
1963 reiserfs_warning(inode->i_sb, "PAP-5710",
1964 "entry or pasted byte (%K) exists",
d68caa95 1965 key);
bd4c625c
LT
1966 retval = -EEXIST;
1967 goto error_out;
1968 }
1da177e4 1969#ifdef CONFIG_REISERFS_CHECK
d68caa95 1970 check_research_for_paste(search_path, key);
1da177e4 1971#endif
bd4c625c 1972 }
1da177e4 1973
bd4c625c
LT
1974 /* Perform balancing after all resources are collected by fix_nodes, and
1975 accessing them will not risk triggering schedule. */
1976 if (retval == CARRY_ON) {
d68caa95 1977 do_balance(&s_paste_balance, NULL /*ih */ , body, M_PASTE);
bd4c625c
LT
1978 return 0;
1979 }
1980 retval = (retval == NO_DISK_SPACE) ? -ENOSPC : -EIO;
1981 error_out:
1982 /* this also releases the path */
1983 unfix_nodes(&s_paste_balance);
1da177e4 1984#ifdef REISERQUOTA_DEBUG
bd4c625c
LT
1985 reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
1986 "reiserquota paste_into_item(): freeing %u id=%u type=%c",
ee93961b 1987 pasted_size, inode->i_uid,
d68caa95 1988 key2type(&(key->on_disk_key)));
1da177e4 1989#endif
e1c50248 1990 vfs_dq_free_space_nodirty(inode, pasted_size);
bd4c625c 1991 return retval;
1da177e4
LT
1992}
1993
d68caa95
JM
1994/* Insert new item into the buffer at the path.
1995 * th - active transaction handle
1996 * path - path to the inserted item
1997 * ih - pointer to the item header to insert
1998 * body - pointer to the bytes to insert
1999 */
2000int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
2001 struct treepath *path, const struct cpu_key *key,
2002 struct item_head *ih, struct inode *inode,
2003 const char *body)
2004{
bd4c625c
LT
2005 struct tree_balance s_ins_balance;
2006 int retval;
2007 int fs_gen = 0;
2008 int quota_bytes = 0;
2009
2010 BUG_ON(!th->t_trans_id);
2011
2012 if (inode) { /* Do we count quotas for item? */
2013 fs_gen = get_generation(inode->i_sb);
d68caa95 2014 quota_bytes = ih_item_len(ih);
bd4c625c
LT
2015
2016 /* hack so the quota code doesn't have to guess if the file has
2017 ** a tail, links are always tails, so there's no guessing needed
2018 */
d68caa95 2019 if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(ih))
bd4c625c 2020 quota_bytes = inode->i_sb->s_blocksize + UNFM_P_SIZE;
1da177e4 2021#ifdef REISERQUOTA_DEBUG
bd4c625c
LT
2022 reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
2023 "reiserquota insert_item(): allocating %u id=%u type=%c",
d68caa95 2024 quota_bytes, inode->i_uid, head2type(ih));
1da177e4 2025#endif
bd4c625c
LT
2026 /* We can't dirty inode here. It would be immediately written but
2027 * appropriate stat item isn't inserted yet... */
77db4f25 2028 if (vfs_dq_alloc_space_nodirty(inode, quota_bytes)) {
d68caa95 2029 pathrelse(path);
bd4c625c
LT
2030 return -EDQUOT;
2031 }
1da177e4 2032 }
d68caa95
JM
2033 init_tb_struct(th, &s_ins_balance, th->t_super, path,
2034 IH_SIZE + ih_item_len(ih));
1da177e4 2035#ifdef DISPLACE_NEW_PACKING_LOCALITIES
bd4c625c 2036 s_ins_balance.key = key->on_disk_key;
1da177e4 2037#endif
bd4c625c
LT
2038 /* DQUOT_* can schedule, must check to be sure calling fix_nodes is safe */
2039 if (inode && fs_changed(fs_gen, inode->i_sb)) {
2040 goto search_again;
1da177e4 2041 }
bd4c625c
LT
2042
2043 while ((retval =
d68caa95
JM
2044 fix_nodes(M_INSERT, &s_ins_balance, ih,
2045 body)) == REPEAT_SEARCH) {
bd4c625c
LT
2046 search_again:
2047 /* file system changed while we were in the fix_nodes */
2048 PROC_INFO_INC(th->t_super, insert_item_restarted);
d68caa95 2049 retval = search_item(th->t_super, key, path);
bd4c625c
LT
2050 if (retval == IO_ERROR) {
2051 retval = -EIO;
2052 goto error_out;
2053 }
2054 if (retval == ITEM_FOUND) {
45b03d5e 2055 reiserfs_warning(th->t_super, "PAP-5760",
bd4c625c
LT
2056 "key %K already exists in the tree",
2057 key);
2058 retval = -EEXIST;
2059 goto error_out;
2060 }
1da177e4 2061 }
1da177e4 2062
bd4c625c
LT
2063 /* make balancing after all resources will be collected at a time */
2064 if (retval == CARRY_ON) {
d68caa95 2065 do_balance(&s_ins_balance, ih, body, M_INSERT);
bd4c625c
LT
2066 return 0;
2067 }
1da177e4 2068
bd4c625c
LT
2069 retval = (retval == NO_DISK_SPACE) ? -ENOSPC : -EIO;
2070 error_out:
2071 /* also releases the path */
2072 unfix_nodes(&s_ins_balance);
1da177e4 2073#ifdef REISERQUOTA_DEBUG
bd4c625c
LT
2074 reiserfs_debug(th->t_super, REISERFS_DEBUG_CODE,
2075 "reiserquota insert_item(): freeing %u id=%u type=%c",
d68caa95 2076 quota_bytes, inode->i_uid, head2type(ih));
1da177e4 2077#endif
bd4c625c 2078 if (inode)
77db4f25 2079 vfs_dq_free_space_nodirty(inode, quota_bytes);
bd4c625c 2080 return retval;
1da177e4 2081}
This page took 0.609571 seconds and 5 git commands to generate.