brintos

brintos / linux-shallow public Read only

0
0
Text · 45.2 KiB · 7e7b531 Raw
1726 lines · c
1/*2 * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README3 *4 * Trivial changes by Alan Cox to remove EHASHCOLLISION for compatibility5 *6 * Trivial Changes:7 * Rights granted to Hans Reiser to redistribute under other terms providing8 * he accepts all liability including but not limited to patent, fitness9 * for purpose, and direct or indirect claims arising from failure to perform.10 *11 * NO WARRANTY12 */13 14#include <linux/time.h>15#include <linux/bitops.h>16#include <linux/slab.h>17#include "reiserfs.h"18#include "acl.h"19#include "xattr.h"20#include <linux/quotaops.h>21 22#define INC_DIR_INODE_NLINK(i) if (i->i_nlink != 1) { inc_nlink(i); if (i->i_nlink >= REISERFS_LINK_MAX) set_nlink(i, 1); }23#define DEC_DIR_INODE_NLINK(i) if (i->i_nlink != 1) drop_nlink(i);24 25/*26 * directory item contains array of entry headers. This performs27 * binary search through that array28 */29static int bin_search_in_dir_item(struct reiserfs_dir_entry *de, loff_t off)30{31	struct item_head *ih = de->de_ih;32	struct reiserfs_de_head *deh = de->de_deh;33	int rbound, lbound, j;34 35	lbound = 0;36	rbound = ih_entry_count(ih) - 1;37 38	for (j = (rbound + lbound) / 2; lbound <= rbound;39	     j = (rbound + lbound) / 2) {40		if (off < deh_offset(deh + j)) {41			rbound = j - 1;42			continue;43		}44		if (off > deh_offset(deh + j)) {45			lbound = j + 1;46			continue;47		}48		/* this is not name found, but matched third key component */49		de->de_entry_num = j;50		return NAME_FOUND;51	}52 53	de->de_entry_num = lbound;54	return NAME_NOT_FOUND;55}56 57/*58 * comment?  maybe something like set de to point to what the path points to?59 */60static inline void set_de_item_location(struct reiserfs_dir_entry *de,61					struct treepath *path)62{63	de->de_bh = get_last_bh(path);64	de->de_ih = tp_item_head(path);65	de->de_deh = B_I_DEH(de->de_bh, de->de_ih);66	de->de_item_num = PATH_LAST_POSITION(path);67}68 69/*70 * de_bh, de_ih, de_deh (points to first element of array), de_item_num is set71 */72inline void set_de_name_and_namelen(struct reiserfs_dir_entry *de)73{74	struct reiserfs_de_head *deh = de->de_deh + de->de_entry_num;75 76	BUG_ON(de->de_entry_num >= ih_entry_count(de->de_ih));77 78	de->de_entrylen = entry_length(de->de_bh, de->de_ih, de->de_entry_num);79	de->de_namelen = de->de_entrylen - (de_with_sd(deh) ? SD_SIZE : 0);80	de->de_name = ih_item_body(de->de_bh, de->de_ih) + deh_location(deh);81	if (de->de_name[de->de_namelen - 1] == 0)82		de->de_namelen = strlen(de->de_name);83}84 85/* what entry points to */86static inline void set_de_object_key(struct reiserfs_dir_entry *de)87{88	BUG_ON(de->de_entry_num >= ih_entry_count(de->de_ih));89	de->de_dir_id = deh_dir_id(&de->de_deh[de->de_entry_num]);90	de->de_objectid = deh_objectid(&de->de_deh[de->de_entry_num]);91}92 93static inline void store_de_entry_key(struct reiserfs_dir_entry *de)94{95	struct reiserfs_de_head *deh = de->de_deh + de->de_entry_num;96 97	BUG_ON(de->de_entry_num >= ih_entry_count(de->de_ih));98 99	/* store key of the found entry */100	de->de_entry_key.version = KEY_FORMAT_3_5;101	de->de_entry_key.on_disk_key.k_dir_id =102	    le32_to_cpu(de->de_ih->ih_key.k_dir_id);103	de->de_entry_key.on_disk_key.k_objectid =104	    le32_to_cpu(de->de_ih->ih_key.k_objectid);105	set_cpu_key_k_offset(&de->de_entry_key, deh_offset(deh));106	set_cpu_key_k_type(&de->de_entry_key, TYPE_DIRENTRY);107}108 109/*110 * We assign a key to each directory item, and place multiple entries in a111 * single directory item.  A directory item has a key equal to the key of112 * the first directory entry in it.113 114 * This function first calls search_by_key, then, if item whose first entry115 * matches is not found it looks for the entry inside directory item found116 * by search_by_key. Fills the path to the entry, and to the entry position117 * in the item118 */119/* The function is NOT SCHEDULE-SAFE! */120int search_by_entry_key(struct super_block *sb, const struct cpu_key *key,121			struct treepath *path, struct reiserfs_dir_entry *de)122{123	int retval;124 125	retval = search_item(sb, key, path);126	switch (retval) {127	case ITEM_NOT_FOUND:128		if (!PATH_LAST_POSITION(path)) {129			reiserfs_error(sb, "vs-7000", "search_by_key "130				       "returned item position == 0");131			pathrelse(path);132			return IO_ERROR;133		}134		PATH_LAST_POSITION(path)--;135		break;136 137	case ITEM_FOUND:138		break;139 140	case IO_ERROR:141		return retval;142 143	default:144		pathrelse(path);145		reiserfs_error(sb, "vs-7002", "no path to here");146		return IO_ERROR;147	}148 149	set_de_item_location(de, path);150 151#ifdef CONFIG_REISERFS_CHECK152	if (!is_direntry_le_ih(de->de_ih) ||153	    COMP_SHORT_KEYS(&de->de_ih->ih_key, key)) {154		print_block(de->de_bh, 0, -1, -1);155		reiserfs_panic(sb, "vs-7005", "found item %h is not directory "156			       "item or does not belong to the same directory "157			       "as key %K", de->de_ih, key);158	}159#endif				/* CONFIG_REISERFS_CHECK */160 161	/*162	 * binary search in directory item by third component of the163	 * key. sets de->de_entry_num of de164	 */165	retval = bin_search_in_dir_item(de, cpu_key_k_offset(key));166	path->pos_in_item = de->de_entry_num;167	if (retval != NAME_NOT_FOUND) {168		/*169		 * ugly, but rename needs de_bh, de_deh, de_name,170		 * de_namelen, de_objectid set171		 */172		set_de_name_and_namelen(de);173		set_de_object_key(de);174	}175	return retval;176}177 178/* Keyed 32-bit hash function using TEA in a Davis-Meyer function */179 180/*181 * The third component is hashed, and you can choose from more than182 * one hash function.  Per directory hashes are not yet implemented183 * but are thought about. This function should be moved to hashes.c184 * Jedi, please do so.  -Hans185 */186static __u32 get_third_component(struct super_block *s,187				 const char *name, int len)188{189	__u32 res;190 191	if (!len || (len == 1 && name[0] == '.'))192		return DOT_OFFSET;193	if (len == 2 && name[0] == '.' && name[1] == '.')194		return DOT_DOT_OFFSET;195 196	res = REISERFS_SB(s)->s_hash_function(name, len);197 198	/* take bits from 7-th to 30-th including both bounds */199	res = GET_HASH_VALUE(res);200	if (res == 0)201		/*202		 * needed to have no names before "." and ".." those have hash203		 * value == 0 and generation conters 1 and 2 accordingly204		 */205		res = 128;206	return res + MAX_GENERATION_NUMBER;207}208 209static int reiserfs_match(struct reiserfs_dir_entry *de,210			  const char *name, int namelen)211{212	int retval = NAME_NOT_FOUND;213 214	if ((namelen == de->de_namelen) &&215	    !memcmp(de->de_name, name, de->de_namelen))216		retval =217		    (de_visible(de->de_deh + de->de_entry_num) ? NAME_FOUND :218		     NAME_FOUND_INVISIBLE);219 220	return retval;221}222 223/* de's de_bh, de_ih, de_deh, de_item_num, de_entry_num are set already */224 225/* used when hash collisions exist */226 227static int linear_search_in_dir_item(struct cpu_key *key,228				     struct reiserfs_dir_entry *de,229				     const char *name, int namelen)230{231	struct reiserfs_de_head *deh = de->de_deh;232	int retval;233	int i;234 235	i = de->de_entry_num;236 237	if (i == ih_entry_count(de->de_ih) ||238	    GET_HASH_VALUE(deh_offset(deh + i)) !=239	    GET_HASH_VALUE(cpu_key_k_offset(key))) {240		i--;241	}242 243	RFALSE(de->de_deh != B_I_DEH(de->de_bh, de->de_ih),244	       "vs-7010: array of entry headers not found");245 246	deh += i;247 248	for (; i >= 0; i--, deh--) {249		/* hash value does not match, no need to check whole name */250		if (GET_HASH_VALUE(deh_offset(deh)) !=251		    GET_HASH_VALUE(cpu_key_k_offset(key))) {252			return NAME_NOT_FOUND;253		}254 255		/* mark that this generation number is used */256		if (de->de_gen_number_bit_string)257			set_bit(GET_GENERATION_NUMBER(deh_offset(deh)),258				de->de_gen_number_bit_string);259 260		/* calculate pointer to name and namelen */261		de->de_entry_num = i;262		set_de_name_and_namelen(de);263 264		/*265		 * de's de_name, de_namelen, de_recordlen are set.266		 * Fill the rest.267		 */268		if ((retval =269		     reiserfs_match(de, name, namelen)) != NAME_NOT_FOUND) {270 271			/* key of pointed object */272			set_de_object_key(de);273 274			store_de_entry_key(de);275 276			/* retval can be NAME_FOUND or NAME_FOUND_INVISIBLE */277			return retval;278		}279	}280 281	if (GET_GENERATION_NUMBER(le_ih_k_offset(de->de_ih)) == 0)282		/*283		 * we have reached left most entry in the node. In common we284		 * have to go to the left neighbor, but if generation counter285		 * is 0 already, we know for sure, that there is no name with286		 * the same hash value287		 */288		/*289		 * FIXME: this work correctly only because hash value can not290		 *  be 0. Btw, in case of Yura's hash it is probably possible,291		 * so, this is a bug292		 */293		return NAME_NOT_FOUND;294 295	RFALSE(de->de_item_num,296	       "vs-7015: two diritems of the same directory in one node?");297 298	return GOTO_PREVIOUS_ITEM;299}300 301/*302 * may return NAME_FOUND, NAME_FOUND_INVISIBLE, NAME_NOT_FOUND303 * FIXME: should add something like IOERROR304 */305static int reiserfs_find_entry(struct inode *dir, const char *name, int namelen,306			       struct treepath *path_to_entry,307			       struct reiserfs_dir_entry *de)308{309	struct cpu_key key_to_search;310	int retval;311 312	if (namelen > REISERFS_MAX_NAME(dir->i_sb->s_blocksize))313		return NAME_NOT_FOUND;314 315	/* we will search for this key in the tree */316	make_cpu_key(&key_to_search, dir,317		     get_third_component(dir->i_sb, name, namelen),318		     TYPE_DIRENTRY, 3);319 320	while (1) {321		retval =322		    search_by_entry_key(dir->i_sb, &key_to_search,323					path_to_entry, de);324		if (retval == IO_ERROR) {325			reiserfs_error(dir->i_sb, "zam-7001", "io error");326			return IO_ERROR;327		}328 329		/* compare names for all entries having given hash value */330		retval =331		    linear_search_in_dir_item(&key_to_search, de, name,332					      namelen);333		/*334		 * there is no need to scan directory anymore.335		 * Given entry found or does not exist336		 */337		if (retval != GOTO_PREVIOUS_ITEM) {338			path_to_entry->pos_in_item = de->de_entry_num;339			return retval;340		}341 342		/*343		 * there is left neighboring item of this directory344		 * and given entry can be there345		 */346		set_cpu_key_k_offset(&key_to_search,347				     le_ih_k_offset(de->de_ih) - 1);348		pathrelse(path_to_entry);349 350	}			/* while (1) */351}352 353static struct dentry *reiserfs_lookup(struct inode *dir, struct dentry *dentry,354				      unsigned int flags)355{356	int retval;357	struct inode *inode = NULL;358	struct reiserfs_dir_entry de;359	INITIALIZE_PATH(path_to_entry);360 361	if (REISERFS_MAX_NAME(dir->i_sb->s_blocksize) < dentry->d_name.len)362		return ERR_PTR(-ENAMETOOLONG);363 364	reiserfs_write_lock(dir->i_sb);365 366	de.de_gen_number_bit_string = NULL;367	retval =368	    reiserfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,369				&path_to_entry, &de);370	pathrelse(&path_to_entry);371	if (retval == NAME_FOUND) {372		inode = reiserfs_iget(dir->i_sb,373				      (struct cpu_key *)&de.de_dir_id);374		if (!inode || IS_ERR(inode)) {375			reiserfs_write_unlock(dir->i_sb);376			return ERR_PTR(-EACCES);377		}378 379		/*380		 * Propagate the private flag so we know we're381		 * in the priv tree.  Also clear xattr support382		 * since we don't have xattrs on xattr files.383		 */384		if (IS_PRIVATE(dir))385			reiserfs_init_priv_inode(inode);386	}387	reiserfs_write_unlock(dir->i_sb);388	if (retval == IO_ERROR) {389		return ERR_PTR(-EIO);390	}391 392	return d_splice_alias(inode, dentry);393}394 395/*396 * looks up the dentry of the parent directory for child.397 * taken from ext2_get_parent398 */399struct dentry *reiserfs_get_parent(struct dentry *child)400{401	int retval;402	struct inode *inode = NULL;403	struct reiserfs_dir_entry de;404	INITIALIZE_PATH(path_to_entry);405	struct inode *dir = d_inode(child);406 407	if (dir->i_nlink == 0) {408		return ERR_PTR(-ENOENT);409	}410	de.de_gen_number_bit_string = NULL;411 412	reiserfs_write_lock(dir->i_sb);413	retval = reiserfs_find_entry(dir, "..", 2, &path_to_entry, &de);414	pathrelse(&path_to_entry);415	if (retval != NAME_FOUND) {416		reiserfs_write_unlock(dir->i_sb);417		return ERR_PTR(-ENOENT);418	}419	inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&de.de_dir_id);420	reiserfs_write_unlock(dir->i_sb);421 422	return d_obtain_alias(inode);423}424 425/* add entry to the directory (entry can be hidden).426 427insert definition of when hidden directories are used here -Hans428 429 Does not mark dir   inode dirty, do it after successesfull call to it */430 431static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,432			      struct inode *dir, const char *name, int namelen,433			      struct inode *inode, int visible)434{435	struct cpu_key entry_key;436	struct reiserfs_de_head *deh;437	INITIALIZE_PATH(path);438	struct reiserfs_dir_entry de;439	DECLARE_BITMAP(bit_string, MAX_GENERATION_NUMBER + 1);440	int gen_number;441 442	/*443	 * 48 bytes now and we avoid kmalloc if we444	 * create file with short name445	 */446	char small_buf[32 + DEH_SIZE];447 448	char *buffer;449	int buflen, paste_size;450	int retval;451 452	BUG_ON(!th->t_trans_id);453 454	/* each entry has unique key. compose it */455	make_cpu_key(&entry_key, dir,456		     get_third_component(dir->i_sb, name, namelen),457		     TYPE_DIRENTRY, 3);458 459	/* get memory for composing the entry */460	buflen = DEH_SIZE + ROUND_UP(namelen);461	if (buflen > sizeof(small_buf)) {462		buffer = kmalloc(buflen, GFP_NOFS);463		if (!buffer)464			return -ENOMEM;465	} else466		buffer = small_buf;467 468	paste_size =469	    (get_inode_sd_version(dir) ==470	     STAT_DATA_V1) ? (DEH_SIZE + namelen) : buflen;471 472	/*473	 * fill buffer : directory entry head, name[, dir objectid | ,474	 * stat data | ,stat data, dir objectid ]475	 */476	deh = (struct reiserfs_de_head *)buffer;477	deh->deh_location = 0;	/* JDM Endian safe if 0 */478	put_deh_offset(deh, cpu_key_k_offset(&entry_key));479	deh->deh_state = 0;	/* JDM Endian safe if 0 */480	/* put key (ino analog) to de */481 482	/* safe: k_dir_id is le */483	deh->deh_dir_id = INODE_PKEY(inode)->k_dir_id;484	/* safe: k_objectid is le */485	deh->deh_objectid = INODE_PKEY(inode)->k_objectid;486 487	/* copy name */488	memcpy((char *)(deh + 1), name, namelen);489	/* padd by 0s to the 4 byte boundary */490	padd_item((char *)(deh + 1), ROUND_UP(namelen), namelen);491 492	/*493	 * entry is ready to be pasted into tree, set 'visibility'494	 * and 'stat data in entry' attributes495	 */496	mark_de_without_sd(deh);497	visible ? mark_de_visible(deh) : mark_de_hidden(deh);498 499	/* find the proper place for the new entry */500	memset(bit_string, 0, sizeof(bit_string));501	de.de_gen_number_bit_string = bit_string;502	retval = reiserfs_find_entry(dir, name, namelen, &path, &de);503	if (retval != NAME_NOT_FOUND) {504		if (buffer != small_buf)505			kfree(buffer);506		pathrelse(&path);507 508		if (retval == IO_ERROR) {509			return -EIO;510		}511 512		if (retval != NAME_FOUND) {513			reiserfs_error(dir->i_sb, "zam-7002",514				       "reiserfs_find_entry() returned "515				       "unexpected value (%d)", retval);516		}517 518		return -EEXIST;519	}520 521	gen_number =522	    find_first_zero_bit(bit_string,523				MAX_GENERATION_NUMBER + 1);524	if (gen_number > MAX_GENERATION_NUMBER) {525		/* there is no free generation number */526		reiserfs_warning(dir->i_sb, "reiserfs-7010",527				 "Congratulations! we have got hash function "528				 "screwed up");529		if (buffer != small_buf)530			kfree(buffer);531		pathrelse(&path);532		return -EBUSY;533	}534	/* adjust offset of directory enrty */535	put_deh_offset(deh, SET_GENERATION_NUMBER(deh_offset(deh), gen_number));536	set_cpu_key_k_offset(&entry_key, deh_offset(deh));537 538	/* update max-hash-collisions counter in reiserfs_sb_info */539	PROC_INFO_MAX(th->t_super, max_hash_collisions, gen_number);540 541	/* we need to re-search for the insertion point */542	if (gen_number != 0) {543		if (search_by_entry_key(dir->i_sb, &entry_key, &path, &de) !=544		    NAME_NOT_FOUND) {545			reiserfs_warning(dir->i_sb, "vs-7032",546					 "entry with this key (%K) already "547					 "exists", &entry_key);548 549			if (buffer != small_buf)550				kfree(buffer);551			pathrelse(&path);552			return -EBUSY;553		}554	}555 556	/* perform the insertion of the entry that we have prepared */557	retval =558	    reiserfs_paste_into_item(th, &path, &entry_key, dir, buffer,559				     paste_size);560	if (buffer != small_buf)561		kfree(buffer);562	if (retval) {563		reiserfs_check_path(&path);564		return retval;565	}566 567	dir->i_size += paste_size;568	inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));569	if (!S_ISDIR(inode->i_mode) && visible)570		/* reiserfs_mkdir or reiserfs_rename will do that by itself */571		reiserfs_update_sd(th, dir);572 573	reiserfs_check_path(&path);574	return 0;575}576 577/*578 * quota utility function, call if you've had to abort after calling579 * new_inode_init, and have not called reiserfs_new_inode yet.580 * This should only be called on inodes that do not have stat data581 * inserted into the tree yet.582 */583static int drop_new_inode(struct inode *inode)584{585	dquot_drop(inode);586	make_bad_inode(inode);587	inode->i_flags |= S_NOQUOTA;588	iput(inode);589	return 0;590}591 592/*593 * utility function that does setup for reiserfs_new_inode.594 * dquot_initialize needs lots of credits so it's better to have it595 * outside of a transaction, so we had to pull some bits of596 * reiserfs_new_inode out into this func.597 */598static int new_inode_init(struct inode *inode, struct inode *dir, umode_t mode)599{600	/*601	 * Make inode invalid - just in case we are going to drop it before602	 * the initialization happens603	 */604	INODE_PKEY(inode)->k_objectid = 0;605 606	/*607	 * the quota init calls have to know who to charge the quota to, so608	 * we have to set uid and gid here609	 */610	inode_init_owner(&nop_mnt_idmap, inode, dir, mode);611	return dquot_initialize(inode);612}613 614static int reiserfs_create(struct mnt_idmap *idmap, struct inode *dir,615			   struct dentry *dentry, umode_t mode, bool excl)616{617	int retval;618	struct inode *inode;619	/*620	 * We need blocks for transaction + (user+group)*(quotas621	 * for new inode + update of quota for directory owner)622	 */623	int jbegin_count =624	    JOURNAL_PER_BALANCE_CNT * 2 +625	    2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +626		 REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));627	struct reiserfs_transaction_handle th;628	struct reiserfs_security_handle security;629 630	retval = dquot_initialize(dir);631	if (retval)632		return retval;633 634	if (!(inode = new_inode(dir->i_sb))) {635		return -ENOMEM;636	}637	retval = new_inode_init(inode, dir, mode);638	if (retval) {639		drop_new_inode(inode);640		return retval;641	}642 643	jbegin_count += reiserfs_cache_default_acl(dir);644	retval = reiserfs_security_init(dir, inode, &dentry->d_name, &security);645	if (retval < 0) {646		drop_new_inode(inode);647		return retval;648	}649	jbegin_count += retval;650	reiserfs_write_lock(dir->i_sb);651 652	retval = journal_begin(&th, dir->i_sb, jbegin_count);653	if (retval) {654		drop_new_inode(inode);655		goto out_failed;656	}657 658	retval =659	    reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry,660			       inode, &security);661	if (retval)662		goto out_failed;663 664	inode->i_op = &reiserfs_file_inode_operations;665	inode->i_fop = &reiserfs_file_operations;666	inode->i_mapping->a_ops = &reiserfs_address_space_operations;667 668	retval =669	    reiserfs_add_entry(&th, dir, dentry->d_name.name,670			       dentry->d_name.len, inode, 1 /*visible */ );671	if (retval) {672		int err;673		drop_nlink(inode);674		reiserfs_update_sd(&th, inode);675		err = journal_end(&th);676		if (err)677			retval = err;678		unlock_new_inode(inode);679		iput(inode);680		goto out_failed;681	}682	reiserfs_update_inode_transaction(inode);683	reiserfs_update_inode_transaction(dir);684 685	d_instantiate_new(dentry, inode);686	retval = journal_end(&th);687 688out_failed:689	reiserfs_write_unlock(dir->i_sb);690	reiserfs_security_free(&security);691	return retval;692}693 694static int reiserfs_mknod(struct mnt_idmap *idmap, struct inode *dir,695			  struct dentry *dentry, umode_t mode, dev_t rdev)696{697	int retval;698	struct inode *inode;699	struct reiserfs_transaction_handle th;700	struct reiserfs_security_handle security;701	/*702	 * We need blocks for transaction + (user+group)*(quotas703	 * for new inode + update of quota for directory owner)704	 */705	int jbegin_count =706	    JOURNAL_PER_BALANCE_CNT * 3 +707	    2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +708		 REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));709 710	retval = dquot_initialize(dir);711	if (retval)712		return retval;713 714	if (!(inode = new_inode(dir->i_sb))) {715		return -ENOMEM;716	}717	retval = new_inode_init(inode, dir, mode);718	if (retval) {719		drop_new_inode(inode);720		return retval;721	}722 723	jbegin_count += reiserfs_cache_default_acl(dir);724	retval = reiserfs_security_init(dir, inode, &dentry->d_name, &security);725	if (retval < 0) {726		drop_new_inode(inode);727		return retval;728	}729	jbegin_count += retval;730	reiserfs_write_lock(dir->i_sb);731 732	retval = journal_begin(&th, dir->i_sb, jbegin_count);733	if (retval) {734		drop_new_inode(inode);735		goto out_failed;736	}737 738	retval =739	    reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry,740			       inode, &security);741	if (retval) {742		goto out_failed;743	}744 745	inode->i_op = &reiserfs_special_inode_operations;746	init_special_inode(inode, inode->i_mode, rdev);747 748	/* FIXME: needed for block and char devices only */749	reiserfs_update_sd(&th, inode);750 751	reiserfs_update_inode_transaction(inode);752	reiserfs_update_inode_transaction(dir);753 754	retval =755	    reiserfs_add_entry(&th, dir, dentry->d_name.name,756			       dentry->d_name.len, inode, 1 /*visible */ );757	if (retval) {758		int err;759		drop_nlink(inode);760		reiserfs_update_sd(&th, inode);761		err = journal_end(&th);762		if (err)763			retval = err;764		unlock_new_inode(inode);765		iput(inode);766		goto out_failed;767	}768 769	d_instantiate_new(dentry, inode);770	retval = journal_end(&th);771 772out_failed:773	reiserfs_write_unlock(dir->i_sb);774	reiserfs_security_free(&security);775	return retval;776}777 778static int reiserfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,779			  struct dentry *dentry, umode_t mode)780{781	int retval;782	struct inode *inode;783	struct reiserfs_transaction_handle th;784	struct reiserfs_security_handle security;785	/*786	 * We need blocks for transaction + (user+group)*(quotas787	 * for new inode + update of quota for directory owner)788	 */789	int jbegin_count =790	    JOURNAL_PER_BALANCE_CNT * 3 +791	    2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +792		 REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));793 794	retval = dquot_initialize(dir);795	if (retval)796		return retval;797 798#ifdef DISPLACE_NEW_PACKING_LOCALITIES799	/*800	 * set flag that new packing locality created and new blocks801	 * for the content of that directory are not displaced yet802	 */803	REISERFS_I(dir)->new_packing_locality = 1;804#endif805	mode = S_IFDIR | mode;806	if (!(inode = new_inode(dir->i_sb))) {807		return -ENOMEM;808	}809	retval = new_inode_init(inode, dir, mode);810	if (retval) {811		drop_new_inode(inode);812		return retval;813	}814 815	jbegin_count += reiserfs_cache_default_acl(dir);816	retval = reiserfs_security_init(dir, inode, &dentry->d_name, &security);817	if (retval < 0) {818		drop_new_inode(inode);819		return retval;820	}821	jbegin_count += retval;822	reiserfs_write_lock(dir->i_sb);823 824	retval = journal_begin(&th, dir->i_sb, jbegin_count);825	if (retval) {826		drop_new_inode(inode);827		goto out_failed;828	}829 830	/*831	 * inc the link count now, so another writer doesn't overflow832	 * it while we sleep later on.833	 */834	INC_DIR_INODE_NLINK(dir)835 836	retval = reiserfs_new_inode(&th, dir, mode, NULL /*symlink */,837				    old_format_only(dir->i_sb) ?838				    EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE,839				    dentry, inode, &security);840	if (retval) {841		DEC_DIR_INODE_NLINK(dir)842		goto out_failed;843	}844 845	reiserfs_update_inode_transaction(inode);846	reiserfs_update_inode_transaction(dir);847 848	inode->i_op = &reiserfs_dir_inode_operations;849	inode->i_fop = &reiserfs_dir_operations;850 851	/* note, _this_ add_entry will not update dir's stat data */852	retval =853	    reiserfs_add_entry(&th, dir, dentry->d_name.name,854			       dentry->d_name.len, inode, 1 /*visible */ );855	if (retval) {856		int err;857		clear_nlink(inode);858		DEC_DIR_INODE_NLINK(dir);859		reiserfs_update_sd(&th, inode);860		err = journal_end(&th);861		if (err)862			retval = err;863		unlock_new_inode(inode);864		iput(inode);865		goto out_failed;866	}867	/* the above add_entry did not update dir's stat data */868	reiserfs_update_sd(&th, dir);869 870	d_instantiate_new(dentry, inode);871	retval = journal_end(&th);872out_failed:873	reiserfs_write_unlock(dir->i_sb);874	reiserfs_security_free(&security);875	return retval;876}877 878static inline int reiserfs_empty_dir(struct inode *inode)879{880	/*881	 * we can cheat because an old format dir cannot have882	 * EMPTY_DIR_SIZE, and a new format dir cannot have883	 * EMPTY_DIR_SIZE_V1.  So, if the inode is either size,884	 * regardless of disk format version, the directory is empty.885	 */886	if (inode->i_size != EMPTY_DIR_SIZE &&887	    inode->i_size != EMPTY_DIR_SIZE_V1) {888		return 0;889	}890	return 1;891}892 893static int reiserfs_rmdir(struct inode *dir, struct dentry *dentry)894{895	int retval, err;896	struct inode *inode;897	struct reiserfs_transaction_handle th;898	int jbegin_count;899	INITIALIZE_PATH(path);900	struct reiserfs_dir_entry de;901 902	/*903	 * we will be doing 2 balancings and update 2 stat data, we904	 * change quotas of the owner of the directory and of the owner905	 * of the parent directory.  The quota structure is possibly906	 * deleted only on last iput => outside of this transaction907	 */908	jbegin_count =909	    JOURNAL_PER_BALANCE_CNT * 2 + 2 +910	    4 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);911 912	retval = dquot_initialize(dir);913	if (retval)914		return retval;915 916	reiserfs_write_lock(dir->i_sb);917	retval = journal_begin(&th, dir->i_sb, jbegin_count);918	if (retval)919		goto out_rmdir;920 921	de.de_gen_number_bit_string = NULL;922	if ((retval =923	     reiserfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,924				 &path, &de)) == NAME_NOT_FOUND) {925		retval = -ENOENT;926		goto end_rmdir;927	} else if (retval == IO_ERROR) {928		retval = -EIO;929		goto end_rmdir;930	}931 932	inode = d_inode(dentry);933 934	reiserfs_update_inode_transaction(inode);935	reiserfs_update_inode_transaction(dir);936 937	if (de.de_objectid != inode->i_ino) {938		/*939		 * FIXME: compare key of an object and a key found in the entry940		 */941		retval = -EIO;942		goto end_rmdir;943	}944	if (!reiserfs_empty_dir(inode)) {945		retval = -ENOTEMPTY;946		goto end_rmdir;947	}948 949	/* cut entry from dir directory */950	retval = reiserfs_cut_from_item(&th, &path, &de.de_entry_key,951					dir, NULL,	/* page */952					0 /*new file size - not used here */ );953	if (retval < 0)954		goto end_rmdir;955 956	if (inode->i_nlink != 2 && inode->i_nlink != 1)957		reiserfs_error(inode->i_sb, "reiserfs-7040",958			       "empty directory has nlink != 2 (%d)",959			       inode->i_nlink);960 961	clear_nlink(inode);962	inode_set_mtime_to_ts(dir,963			      inode_set_ctime_to_ts(dir, inode_set_ctime_current(inode)));964	reiserfs_update_sd(&th, inode);965 966	DEC_DIR_INODE_NLINK(dir)967	dir->i_size -= (DEH_SIZE + de.de_entrylen);968	reiserfs_update_sd(&th, dir);969 970	/* prevent empty directory from getting lost */971	add_save_link(&th, inode, 0 /* not truncate */ );972 973	retval = journal_end(&th);974	reiserfs_check_path(&path);975out_rmdir:976	reiserfs_write_unlock(dir->i_sb);977	return retval;978 979end_rmdir:980	/*981	 * we must release path, because we did not call982	 * reiserfs_cut_from_item, or reiserfs_cut_from_item does not983	 * release path if operation was not complete984	 */985	pathrelse(&path);986	err = journal_end(&th);987	reiserfs_write_unlock(dir->i_sb);988	return err ? err : retval;989}990 991static int reiserfs_unlink(struct inode *dir, struct dentry *dentry)992{993	int retval, err;994	struct inode *inode;995	struct reiserfs_dir_entry de;996	INITIALIZE_PATH(path);997	struct reiserfs_transaction_handle th;998	int jbegin_count;999	unsigned long savelink;1000 1001	retval = dquot_initialize(dir);1002	if (retval)1003		return retval;1004 1005	inode = d_inode(dentry);1006 1007	/*1008	 * in this transaction we can be doing at max two balancings and1009	 * update two stat datas, we change quotas of the owner of the1010	 * directory and of the owner of the parent directory. The quota1011	 * structure is possibly deleted only on iput => outside of1012	 * this transaction1013	 */1014	jbegin_count =1015	    JOURNAL_PER_BALANCE_CNT * 2 + 2 +1016	    4 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);1017 1018	reiserfs_write_lock(dir->i_sb);1019	retval = journal_begin(&th, dir->i_sb, jbegin_count);1020	if (retval)1021		goto out_unlink;1022 1023	de.de_gen_number_bit_string = NULL;1024	if ((retval =1025	     reiserfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len,1026				 &path, &de)) == NAME_NOT_FOUND) {1027		retval = -ENOENT;1028		goto end_unlink;1029	} else if (retval == IO_ERROR) {1030		retval = -EIO;1031		goto end_unlink;1032	}1033 1034	reiserfs_update_inode_transaction(inode);1035	reiserfs_update_inode_transaction(dir);1036 1037	if (de.de_objectid != inode->i_ino) {1038		/*1039		 * FIXME: compare key of an object and a key found in the entry1040		 */1041		retval = -EIO;1042		goto end_unlink;1043	}1044 1045	if (!inode->i_nlink) {1046		reiserfs_warning(inode->i_sb, "reiserfs-7042",1047				 "deleting nonexistent file (%lu), %d",1048				 inode->i_ino, inode->i_nlink);1049		set_nlink(inode, 1);1050	}1051 1052	drop_nlink(inode);1053 1054	/*1055	 * we schedule before doing the add_save_link call, save the link1056	 * count so we don't race1057	 */1058	savelink = inode->i_nlink;1059 1060	retval =1061	    reiserfs_cut_from_item(&th, &path, &de.de_entry_key, dir, NULL,1062				   0);1063	if (retval < 0) {1064		inc_nlink(inode);1065		goto end_unlink;1066	}1067	inode_set_ctime_current(inode);1068	reiserfs_update_sd(&th, inode);1069 1070	dir->i_size -= (de.de_entrylen + DEH_SIZE);1071	inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));1072	reiserfs_update_sd(&th, dir);1073 1074	if (!savelink)1075		/* prevent file from getting lost */1076		add_save_link(&th, inode, 0 /* not truncate */ );1077 1078	retval = journal_end(&th);1079	reiserfs_check_path(&path);1080	reiserfs_write_unlock(dir->i_sb);1081	return retval;1082 1083end_unlink:1084	pathrelse(&path);1085	err = journal_end(&th);1086	reiserfs_check_path(&path);1087	if (err)1088		retval = err;1089out_unlink:1090	reiserfs_write_unlock(dir->i_sb);1091	return retval;1092}1093 1094static int reiserfs_symlink(struct mnt_idmap *idmap,1095			    struct inode *parent_dir, struct dentry *dentry,1096			    const char *symname)1097{1098	int retval;1099	struct inode *inode;1100	char *name;1101	int item_len;1102	struct reiserfs_transaction_handle th;1103	struct reiserfs_security_handle security;1104	int mode = S_IFLNK | S_IRWXUGO;1105	/*1106	 * We need blocks for transaction + (user+group)*(quotas for1107	 * new inode + update of quota for directory owner)1108	 */1109	int jbegin_count =1110	    JOURNAL_PER_BALANCE_CNT * 3 +1111	    2 * (REISERFS_QUOTA_INIT_BLOCKS(parent_dir->i_sb) +1112		 REISERFS_QUOTA_TRANS_BLOCKS(parent_dir->i_sb));1113 1114	retval = dquot_initialize(parent_dir);1115	if (retval)1116		return retval;1117 1118	if (!(inode = new_inode(parent_dir->i_sb))) {1119		return -ENOMEM;1120	}1121	retval = new_inode_init(inode, parent_dir, mode);1122	if (retval) {1123		drop_new_inode(inode);1124		return retval;1125	}1126 1127	retval = reiserfs_security_init(parent_dir, inode, &dentry->d_name,1128					&security);1129	if (retval < 0) {1130		drop_new_inode(inode);1131		return retval;1132	}1133	jbegin_count += retval;1134 1135	reiserfs_write_lock(parent_dir->i_sb);1136	item_len = ROUND_UP(strlen(symname));1137	if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) {1138		retval = -ENAMETOOLONG;1139		drop_new_inode(inode);1140		goto out_failed;1141	}1142 1143	name = kmalloc(item_len, GFP_NOFS);1144	if (!name) {1145		drop_new_inode(inode);1146		retval = -ENOMEM;1147		goto out_failed;1148	}1149	memcpy(name, symname, strlen(symname));1150	padd_item(name, item_len, strlen(symname));1151 1152	retval = journal_begin(&th, parent_dir->i_sb, jbegin_count);1153	if (retval) {1154		drop_new_inode(inode);1155		kfree(name);1156		goto out_failed;1157	}1158 1159	retval =1160	    reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname),1161			       dentry, inode, &security);1162	kfree(name);1163	if (retval) {		/* reiserfs_new_inode iputs for us */1164		goto out_failed;1165	}1166 1167	reiserfs_update_inode_transaction(inode);1168	reiserfs_update_inode_transaction(parent_dir);1169 1170	inode->i_op = &reiserfs_symlink_inode_operations;1171	inode_nohighmem(inode);1172	inode->i_mapping->a_ops = &reiserfs_address_space_operations;1173 1174	retval = reiserfs_add_entry(&th, parent_dir, dentry->d_name.name,1175				    dentry->d_name.len, inode, 1 /*visible */ );1176	if (retval) {1177		int err;1178		drop_nlink(inode);1179		reiserfs_update_sd(&th, inode);1180		err = journal_end(&th);1181		if (err)1182			retval = err;1183		unlock_new_inode(inode);1184		iput(inode);1185		goto out_failed;1186	}1187 1188	d_instantiate_new(dentry, inode);1189	retval = journal_end(&th);1190out_failed:1191	reiserfs_write_unlock(parent_dir->i_sb);1192	reiserfs_security_free(&security);1193	return retval;1194}1195 1196static int reiserfs_link(struct dentry *old_dentry, struct inode *dir,1197			 struct dentry *dentry)1198{1199	int retval;1200	struct inode *inode = d_inode(old_dentry);1201	struct reiserfs_transaction_handle th;1202	/*1203	 * We need blocks for transaction + update of quotas for1204	 * the owners of the directory1205	 */1206	int jbegin_count =1207	    JOURNAL_PER_BALANCE_CNT * 3 +1208	    2 * REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb);1209 1210	retval = dquot_initialize(dir);1211	if (retval)1212		return retval;1213 1214	reiserfs_write_lock(dir->i_sb);1215	if (inode->i_nlink >= REISERFS_LINK_MAX) {1216		/* FIXME: sd_nlink is 32 bit for new files */1217		reiserfs_write_unlock(dir->i_sb);1218		return -EMLINK;1219	}1220 1221	/* inc before scheduling so reiserfs_unlink knows we are here */1222	inc_nlink(inode);1223 1224	retval = journal_begin(&th, dir->i_sb, jbegin_count);1225	if (retval) {1226		drop_nlink(inode);1227		reiserfs_write_unlock(dir->i_sb);1228		return retval;1229	}1230 1231	/* create new entry */1232	retval =1233	    reiserfs_add_entry(&th, dir, dentry->d_name.name,1234			       dentry->d_name.len, inode, 1 /*visible */ );1235 1236	reiserfs_update_inode_transaction(inode);1237	reiserfs_update_inode_transaction(dir);1238 1239	if (retval) {1240		int err;1241		drop_nlink(inode);1242		err = journal_end(&th);1243		reiserfs_write_unlock(dir->i_sb);1244		return err ? err : retval;1245	}1246 1247	inode_set_ctime_current(inode);1248	reiserfs_update_sd(&th, inode);1249 1250	ihold(inode);1251	d_instantiate(dentry, inode);1252	retval = journal_end(&th);1253	reiserfs_write_unlock(dir->i_sb);1254	return retval;1255}1256 1257/* de contains information pointing to an entry which */1258static int de_still_valid(const char *name, int len,1259			  struct reiserfs_dir_entry *de)1260{1261	struct reiserfs_dir_entry tmp = *de;1262 1263	/* recalculate pointer to name and name length */1264	set_de_name_and_namelen(&tmp);1265	/* FIXME: could check more */1266	if (tmp.de_namelen != len || memcmp(name, de->de_name, len))1267		return 0;1268	return 1;1269}1270 1271static int entry_points_to_object(const char *name, int len,1272				  struct reiserfs_dir_entry *de,1273				  struct inode *inode)1274{1275	if (!de_still_valid(name, len, de))1276		return 0;1277 1278	if (inode) {1279		if (!de_visible(de->de_deh + de->de_entry_num))1280			reiserfs_panic(inode->i_sb, "vs-7042",1281				       "entry must be visible");1282		return (de->de_objectid == inode->i_ino) ? 1 : 0;1283	}1284 1285	/* this must be added hidden entry */1286	if (de_visible(de->de_deh + de->de_entry_num))1287		reiserfs_panic(NULL, "vs-7043", "entry must be visible");1288 1289	return 1;1290}1291 1292/* sets key of objectid the entry has to point to */1293static void set_ino_in_dir_entry(struct reiserfs_dir_entry *de,1294				 struct reiserfs_key *key)1295{1296	/* JDM These operations are endian safe - both are le */1297	de->de_deh[de->de_entry_num].deh_dir_id = key->k_dir_id;1298	de->de_deh[de->de_entry_num].deh_objectid = key->k_objectid;1299}1300 1301/*1302 * process, that is going to call fix_nodes/do_balance must hold only1303 * one path. If it holds 2 or more, it can get into endless waiting in1304 * get_empty_nodes or its clones1305 */1306static int reiserfs_rename(struct mnt_idmap *idmap,1307			   struct inode *old_dir, struct dentry *old_dentry,1308			   struct inode *new_dir, struct dentry *new_dentry,1309			   unsigned int flags)1310{1311	int retval;1312	INITIALIZE_PATH(old_entry_path);1313	INITIALIZE_PATH(new_entry_path);1314	INITIALIZE_PATH(dot_dot_entry_path);1315	struct item_head new_entry_ih, old_entry_ih, dot_dot_ih;1316	struct reiserfs_dir_entry old_de, new_de, dot_dot_de;1317	struct inode *old_inode, *new_dentry_inode;1318	struct reiserfs_transaction_handle th;1319	int jbegin_count;1320	unsigned long savelink = 1;1321	bool update_dir_parent = false;1322 1323	if (flags & ~RENAME_NOREPLACE)1324		return -EINVAL;1325 1326	/*1327	 * three balancings: (1) old name removal, (2) new name insertion1328	 * and (3) maybe "save" link insertion1329	 * stat data updates: (1) old directory,1330	 * (2) new directory and (3) maybe old object stat data (when it is1331	 * directory) and (4) maybe stat data of object to which new entry1332	 * pointed initially and (5) maybe block containing ".." of1333	 * renamed directory1334	 * quota updates: two parent directories1335	 */1336	jbegin_count =1337	    JOURNAL_PER_BALANCE_CNT * 3 + 5 +1338	    4 * REISERFS_QUOTA_TRANS_BLOCKS(old_dir->i_sb);1339 1340	retval = dquot_initialize(old_dir);1341	if (retval)1342		return retval;1343	retval = dquot_initialize(new_dir);1344	if (retval)1345		return retval;1346 1347	old_inode = d_inode(old_dentry);1348	new_dentry_inode = d_inode(new_dentry);1349 1350	/*1351	 * make sure that oldname still exists and points to an object we1352	 * are going to rename1353	 */1354	old_de.de_gen_number_bit_string = NULL;1355	reiserfs_write_lock(old_dir->i_sb);1356	retval =1357	    reiserfs_find_entry(old_dir, old_dentry->d_name.name,1358				old_dentry->d_name.len, &old_entry_path,1359				&old_de);1360	pathrelse(&old_entry_path);1361	if (retval == IO_ERROR) {1362		reiserfs_write_unlock(old_dir->i_sb);1363		return -EIO;1364	}1365 1366	if (retval != NAME_FOUND || old_de.de_objectid != old_inode->i_ino) {1367		reiserfs_write_unlock(old_dir->i_sb);1368		return -ENOENT;1369	}1370 1371	if (S_ISDIR(old_inode->i_mode)) {1372		/*1373		 * make sure that directory being renamed has correct ".."1374		 * and that its new parent directory has not too many links1375		 * already1376		 */1377		if (new_dentry_inode) {1378			if (!reiserfs_empty_dir(new_dentry_inode)) {1379				reiserfs_write_unlock(old_dir->i_sb);1380				return -ENOTEMPTY;1381			}1382		}1383 1384		if (old_dir != new_dir) {1385			/*1386			 * directory is renamed, its parent directory will be1387			 * changed, so find ".." entry1388			 */1389			dot_dot_de.de_gen_number_bit_string = NULL;1390			retval =1391			    reiserfs_find_entry(old_inode, "..", 2,1392					&dot_dot_entry_path,1393					&dot_dot_de);1394			pathrelse(&dot_dot_entry_path);1395			if (retval != NAME_FOUND) {1396				reiserfs_write_unlock(old_dir->i_sb);1397				return -EIO;1398			}1399 1400			/* inode number of .. must equal old_dir->i_ino */1401			if (dot_dot_de.de_objectid != old_dir->i_ino) {1402				reiserfs_write_unlock(old_dir->i_sb);1403				return -EIO;1404			}1405			update_dir_parent = true;1406		}1407	}1408 1409	retval = journal_begin(&th, old_dir->i_sb, jbegin_count);1410	if (retval) {1411		reiserfs_write_unlock(old_dir->i_sb);1412		return retval;1413	}1414 1415	/* add new entry (or find the existing one) */1416	retval =1417	    reiserfs_add_entry(&th, new_dir, new_dentry->d_name.name,1418			       new_dentry->d_name.len, old_inode, 0);1419	if (retval == -EEXIST) {1420		if (!new_dentry_inode) {1421			reiserfs_panic(old_dir->i_sb, "vs-7050",1422				       "new entry is found, new inode == 0");1423		}1424	} else if (retval) {1425		int err = journal_end(&th);1426		reiserfs_write_unlock(old_dir->i_sb);1427		return err ? err : retval;1428	}1429 1430	reiserfs_update_inode_transaction(old_dir);1431	reiserfs_update_inode_transaction(new_dir);1432 1433	/*1434	 * this makes it so an fsync on an open fd for the old name will1435	 * commit the rename operation1436	 */1437	reiserfs_update_inode_transaction(old_inode);1438 1439	if (new_dentry_inode)1440		reiserfs_update_inode_transaction(new_dentry_inode);1441 1442	while (1) {1443		/*1444		 * look for old name using corresponding entry key1445		 * (found by reiserfs_find_entry)1446		 */1447		if ((retval =1448		     search_by_entry_key(new_dir->i_sb, &old_de.de_entry_key,1449					 &old_entry_path,1450					 &old_de)) != NAME_FOUND) {1451			pathrelse(&old_entry_path);1452			journal_end(&th);1453			reiserfs_write_unlock(old_dir->i_sb);1454			return -EIO;1455		}1456 1457		copy_item_head(&old_entry_ih, tp_item_head(&old_entry_path));1458 1459		reiserfs_prepare_for_journal(old_inode->i_sb, old_de.de_bh, 1);1460 1461		/* look for new name by reiserfs_find_entry */1462		new_de.de_gen_number_bit_string = NULL;1463		retval =1464		    reiserfs_find_entry(new_dir, new_dentry->d_name.name,1465					new_dentry->d_name.len, &new_entry_path,1466					&new_de);1467		/*1468		 * reiserfs_add_entry should not return IO_ERROR,1469		 * because it is called with essentially same parameters from1470		 * reiserfs_add_entry above, and we'll catch any i/o errors1471		 * before we get here.1472		 */1473		if (retval != NAME_FOUND_INVISIBLE && retval != NAME_FOUND) {1474			pathrelse(&new_entry_path);1475			pathrelse(&old_entry_path);1476			journal_end(&th);1477			reiserfs_write_unlock(old_dir->i_sb);1478			return -EIO;1479		}1480 1481		copy_item_head(&new_entry_ih, tp_item_head(&new_entry_path));1482 1483		reiserfs_prepare_for_journal(old_inode->i_sb, new_de.de_bh, 1);1484 1485		if (update_dir_parent) {1486			if ((retval =1487			     search_by_entry_key(new_dir->i_sb,1488						 &dot_dot_de.de_entry_key,1489						 &dot_dot_entry_path,1490						 &dot_dot_de)) != NAME_FOUND) {1491				pathrelse(&dot_dot_entry_path);1492				pathrelse(&new_entry_path);1493				pathrelse(&old_entry_path);1494				journal_end(&th);1495				reiserfs_write_unlock(old_dir->i_sb);1496				return -EIO;1497			}1498			copy_item_head(&dot_dot_ih,1499				       tp_item_head(&dot_dot_entry_path));1500			/* node containing ".." gets into transaction */1501			reiserfs_prepare_for_journal(old_inode->i_sb,1502						     dot_dot_de.de_bh, 1);1503		}1504		/*1505		 * we should check seals here, not do1506		 * this stuff, yes? Then, having1507		 * gathered everything into RAM we1508		 * should lock the buffers, yes?  -Hans1509		 */1510		/*1511		 * probably.  our rename needs to hold more1512		 * than one path at once.  The seals would1513		 * have to be written to deal with multi-path1514		 * issues -chris1515		 */1516		/*1517		 * sanity checking before doing the rename - avoid races many1518		 * of the above checks could have scheduled.  We have to be1519		 * sure our items haven't been shifted by another process.1520		 */1521		if (item_moved(&new_entry_ih, &new_entry_path) ||1522		    !entry_points_to_object(new_dentry->d_name.name,1523					    new_dentry->d_name.len,1524					    &new_de, new_dentry_inode) ||1525		    item_moved(&old_entry_ih, &old_entry_path) ||1526		    !entry_points_to_object(old_dentry->d_name.name,1527					    old_dentry->d_name.len,1528					    &old_de, old_inode)) {1529			reiserfs_restore_prepared_buffer(old_inode->i_sb,1530							 new_de.de_bh);1531			reiserfs_restore_prepared_buffer(old_inode->i_sb,1532							 old_de.de_bh);1533			if (update_dir_parent)1534				reiserfs_restore_prepared_buffer(old_inode->1535								 i_sb,1536								 dot_dot_de.1537								 de_bh);1538			continue;1539		}1540		if (update_dir_parent) {1541			if (item_moved(&dot_dot_ih, &dot_dot_entry_path) ||1542			    !entry_points_to_object("..", 2, &dot_dot_de,1543						    old_dir)) {1544				reiserfs_restore_prepared_buffer(old_inode->1545								 i_sb,1546								 old_de.de_bh);1547				reiserfs_restore_prepared_buffer(old_inode->1548								 i_sb,1549								 new_de.de_bh);1550				reiserfs_restore_prepared_buffer(old_inode->1551								 i_sb,1552								 dot_dot_de.1553								 de_bh);1554				continue;1555			}1556		}1557 1558		RFALSE(update_dir_parent &&1559		       !buffer_journal_prepared(dot_dot_de.de_bh), "");1560 1561		break;1562	}1563 1564	/*1565	 * ok, all the changes can be done in one fell swoop when we1566	 * have claimed all the buffers needed.1567	 */1568 1569	mark_de_visible(new_de.de_deh + new_de.de_entry_num);1570	set_ino_in_dir_entry(&new_de, INODE_PKEY(old_inode));1571	journal_mark_dirty(&th, new_de.de_bh);1572 1573	mark_de_hidden(old_de.de_deh + old_de.de_entry_num);1574	journal_mark_dirty(&th, old_de.de_bh);1575	/*1576	 * thanks to Alex Adriaanse <alex_a@caltech.edu> for patch1577	 * which adds ctime update of renamed object1578	 */1579	simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry);1580 1581	if (new_dentry_inode) {1582		/* adjust link number of the victim */1583		if (S_ISDIR(new_dentry_inode->i_mode)) {1584			clear_nlink(new_dentry_inode);1585		} else {1586			drop_nlink(new_dentry_inode);1587		}1588		savelink = new_dentry_inode->i_nlink;1589	}1590 1591	if (update_dir_parent) {1592		/* adjust ".." of renamed directory */1593		set_ino_in_dir_entry(&dot_dot_de, INODE_PKEY(new_dir));1594		journal_mark_dirty(&th, dot_dot_de.de_bh);1595	}1596	if (S_ISDIR(old_inode->i_mode)) {1597		/*1598		 * there (in new_dir) was no directory, so it got new link1599		 * (".."  of renamed directory)1600		 */1601		if (!new_dentry_inode)1602			INC_DIR_INODE_NLINK(new_dir);1603 1604		/* old directory lost one link - ".. " of renamed directory */1605		DEC_DIR_INODE_NLINK(old_dir);1606	}1607	/*1608	 * looks like in 2.3.99pre3 brelse is atomic.1609	 * so we can use pathrelse1610	 */1611	pathrelse(&new_entry_path);1612	pathrelse(&dot_dot_entry_path);1613 1614	/*1615	 * FIXME: this reiserfs_cut_from_item's return value may screw up1616	 * anybody, but it will panic if will not be able to find the1617	 * entry. This needs one more clean up1618	 */1619	if (reiserfs_cut_from_item1620	    (&th, &old_entry_path, &old_de.de_entry_key, old_dir, NULL,1621	     0) < 0)1622		reiserfs_error(old_dir->i_sb, "vs-7060",1623			       "couldn't not cut old name. Fsck later?");1624 1625	old_dir->i_size -= DEH_SIZE + old_de.de_entrylen;1626 1627	reiserfs_update_sd(&th, old_dir);1628	reiserfs_update_sd(&th, new_dir);1629	reiserfs_update_sd(&th, old_inode);1630 1631	if (new_dentry_inode) {1632		if (savelink == 0)1633			add_save_link(&th, new_dentry_inode,1634				      0 /* not truncate */ );1635		reiserfs_update_sd(&th, new_dentry_inode);1636	}1637 1638	retval = journal_end(&th);1639	reiserfs_write_unlock(old_dir->i_sb);1640	return retval;1641}1642 1643static const struct inode_operations reiserfs_priv_dir_inode_operations = {1644	.create = reiserfs_create,1645	.lookup = reiserfs_lookup,1646	.link = reiserfs_link,1647	.unlink = reiserfs_unlink,1648	.symlink = reiserfs_symlink,1649	.mkdir = reiserfs_mkdir,1650	.rmdir = reiserfs_rmdir,1651	.mknod = reiserfs_mknod,1652	.rename = reiserfs_rename,1653	.setattr = reiserfs_setattr,1654	.permission = reiserfs_permission,1655	.fileattr_get = reiserfs_fileattr_get,1656	.fileattr_set = reiserfs_fileattr_set,1657};1658 1659static const struct inode_operations reiserfs_priv_symlink_inode_operations = {1660	.get_link	= page_get_link,1661	.setattr = reiserfs_setattr,1662	.permission = reiserfs_permission,1663};1664 1665static const struct inode_operations reiserfs_priv_special_inode_operations = {1666	.setattr = reiserfs_setattr,1667	.permission = reiserfs_permission,1668};1669 1670void reiserfs_init_priv_inode(struct inode *inode)1671{1672	inode->i_flags |= S_PRIVATE;1673	inode->i_opflags &= ~IOP_XATTR;1674 1675	if (S_ISREG(inode->i_mode))1676		inode->i_op = &reiserfs_priv_file_inode_operations;1677	else if (S_ISDIR(inode->i_mode))1678		inode->i_op = &reiserfs_priv_dir_inode_operations;1679	else if (S_ISLNK(inode->i_mode))1680		inode->i_op = &reiserfs_priv_symlink_inode_operations;1681	else1682		inode->i_op = &reiserfs_priv_special_inode_operations;1683}1684 1685/* directories can handle most operations...  */1686const struct inode_operations reiserfs_dir_inode_operations = {1687	.create = reiserfs_create,1688	.lookup = reiserfs_lookup,1689	.link = reiserfs_link,1690	.unlink = reiserfs_unlink,1691	.symlink = reiserfs_symlink,1692	.mkdir = reiserfs_mkdir,1693	.rmdir = reiserfs_rmdir,1694	.mknod = reiserfs_mknod,1695	.rename = reiserfs_rename,1696	.setattr = reiserfs_setattr,1697	.listxattr = reiserfs_listxattr,1698	.permission = reiserfs_permission,1699	.get_inode_acl = reiserfs_get_acl,1700	.set_acl = reiserfs_set_acl,1701	.fileattr_get = reiserfs_fileattr_get,1702	.fileattr_set = reiserfs_fileattr_set,1703};1704 1705/*1706 * symlink operations.. same as page_symlink_inode_operations, with xattr1707 * stuff added1708 */1709const struct inode_operations reiserfs_symlink_inode_operations = {1710	.get_link	= page_get_link,1711	.setattr = reiserfs_setattr,1712	.listxattr = reiserfs_listxattr,1713	.permission = reiserfs_permission,1714};1715 1716/*1717 * special file operations.. just xattr/acl stuff1718 */1719const struct inode_operations reiserfs_special_inode_operations = {1720	.setattr = reiserfs_setattr,1721	.listxattr = reiserfs_listxattr,1722	.permission = reiserfs_permission,1723	.get_inode_acl = reiserfs_get_acl,1724	.set_acl = reiserfs_set_acl,1725};1726