brintos

brintos / linux-shallow public Read only

0
0
Text · 111.4 KiB · 790db7e Raw
4243 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 *  linux/fs/ext4/namei.c4 *5 * Copyright (C) 1992, 1993, 1994, 19956 * Remy Card (card@masi.ibp.fr)7 * Laboratoire MASI - Institut Blaise Pascal8 * Universite Pierre et Marie Curie (Paris VI)9 *10 *  from11 *12 *  linux/fs/minix/namei.c13 *14 *  Copyright (C) 1991, 1992  Linus Torvalds15 *16 *  Big-endian to little-endian byte-swapping/bitmaps by17 *        David S. Miller (davem@caip.rutgers.edu), 199518 *  Directory entry file type support and forward compatibility hooks19 *	for B-tree directories by Theodore Ts'o (tytso@mit.edu), 199820 *  Hash Tree Directory indexing (c)21 *	Daniel Phillips, 200122 *  Hash Tree Directory indexing porting23 *	Christopher Li, 200224 *  Hash Tree Directory indexing cleanup25 *	Theodore Ts'o, 200226 */27 28#include <linux/fs.h>29#include <linux/pagemap.h>30#include <linux/time.h>31#include <linux/fcntl.h>32#include <linux/stat.h>33#include <linux/string.h>34#include <linux/quotaops.h>35#include <linux/buffer_head.h>36#include <linux/bio.h>37#include <linux/iversion.h>38#include <linux/unicode.h>39#include "ext4.h"40#include "ext4_jbd2.h"41 42#include "xattr.h"43#include "acl.h"44 45#include <trace/events/ext4.h>46/*47 * define how far ahead to read directories while searching them.48 */49#define NAMEI_RA_CHUNKS  250#define NAMEI_RA_BLOCKS  451#define NAMEI_RA_SIZE	     (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)52 53static struct buffer_head *ext4_append(handle_t *handle,54					struct inode *inode,55					ext4_lblk_t *block)56{57	struct ext4_map_blocks map;58	struct buffer_head *bh;59	int err;60 61	if (unlikely(EXT4_SB(inode->i_sb)->s_max_dir_size_kb &&62		     ((inode->i_size >> 10) >=63		      EXT4_SB(inode->i_sb)->s_max_dir_size_kb)))64		return ERR_PTR(-ENOSPC);65 66	*block = inode->i_size >> inode->i_sb->s_blocksize_bits;67	map.m_lblk = *block;68	map.m_len = 1;69 70	/*71	 * We're appending new directory block. Make sure the block is not72	 * allocated yet, otherwise we will end up corrupting the73	 * directory.74	 */75	err = ext4_map_blocks(NULL, inode, &map, 0);76	if (err < 0)77		return ERR_PTR(err);78	if (err) {79		EXT4_ERROR_INODE(inode, "Logical block already allocated");80		return ERR_PTR(-EFSCORRUPTED);81	}82 83	bh = ext4_bread(handle, inode, *block, EXT4_GET_BLOCKS_CREATE);84	if (IS_ERR(bh))85		return bh;86	inode->i_size += inode->i_sb->s_blocksize;87	EXT4_I(inode)->i_disksize = inode->i_size;88	err = ext4_mark_inode_dirty(handle, inode);89	if (err)90		goto out;91	BUFFER_TRACE(bh, "get_write_access");92	err = ext4_journal_get_write_access(handle, inode->i_sb, bh,93					    EXT4_JTR_NONE);94	if (err)95		goto out;96	return bh;97 98out:99	brelse(bh);100	ext4_std_error(inode->i_sb, err);101	return ERR_PTR(err);102}103 104static int ext4_dx_csum_verify(struct inode *inode,105			       struct ext4_dir_entry *dirent);106 107/*108 * Hints to ext4_read_dirblock regarding whether we expect a directory109 * block being read to be an index block, or a block containing110 * directory entries (and if the latter, whether it was found via a111 * logical block in an htree index block).  This is used to control112 * what sort of sanity checkinig ext4_read_dirblock() will do on the113 * directory block read from the storage device.  EITHER will means114 * the caller doesn't know what kind of directory block will be read,115 * so no specific verification will be done.116 */117typedef enum {118	EITHER, INDEX, DIRENT, DIRENT_HTREE119} dirblock_type_t;120 121#define ext4_read_dirblock(inode, block, type) \122	__ext4_read_dirblock((inode), (block), (type), __func__, __LINE__)123 124static struct buffer_head *__ext4_read_dirblock(struct inode *inode,125						ext4_lblk_t block,126						dirblock_type_t type,127						const char *func,128						unsigned int line)129{130	struct buffer_head *bh;131	struct ext4_dir_entry *dirent;132	int is_dx_block = 0;133 134	if (block >= inode->i_size >> inode->i_blkbits) {135		ext4_error_inode(inode, func, line, block,136		       "Attempting to read directory block (%u) that is past i_size (%llu)",137		       block, inode->i_size);138		return ERR_PTR(-EFSCORRUPTED);139	}140 141	if (ext4_simulate_fail(inode->i_sb, EXT4_SIM_DIRBLOCK_EIO))142		bh = ERR_PTR(-EIO);143	else144		bh = ext4_bread(NULL, inode, block, 0);145	if (IS_ERR(bh)) {146		__ext4_warning(inode->i_sb, func, line,147			       "inode #%lu: lblock %lu: comm %s: "148			       "error %ld reading directory block",149			       inode->i_ino, (unsigned long)block,150			       current->comm, PTR_ERR(bh));151 152		return bh;153	}154	/* The first directory block must not be a hole. */155	if (!bh && (type == INDEX || type == DIRENT_HTREE || block == 0)) {156		ext4_error_inode(inode, func, line, block,157				 "Directory hole found for htree %s block %u",158				 (type == INDEX) ? "index" : "leaf", block);159		return ERR_PTR(-EFSCORRUPTED);160	}161	if (!bh)162		return NULL;163	dirent = (struct ext4_dir_entry *) bh->b_data;164	/* Determine whether or not we have an index block */165	if (is_dx(inode)) {166		if (block == 0)167			is_dx_block = 1;168		else if (ext4_rec_len_from_disk(dirent->rec_len,169						inode->i_sb->s_blocksize) ==170			 inode->i_sb->s_blocksize)171			is_dx_block = 1;172	}173	if (!is_dx_block && type == INDEX) {174		ext4_error_inode(inode, func, line, block,175		       "directory leaf block found instead of index block");176		brelse(bh);177		return ERR_PTR(-EFSCORRUPTED);178	}179	if (!ext4_has_metadata_csum(inode->i_sb) ||180	    buffer_verified(bh))181		return bh;182 183	/*184	 * An empty leaf block can get mistaken for a index block; for185	 * this reason, we can only check the index checksum when the186	 * caller is sure it should be an index block.187	 */188	if (is_dx_block && type == INDEX) {189		if (ext4_dx_csum_verify(inode, dirent) &&190		    !ext4_simulate_fail(inode->i_sb, EXT4_SIM_DIRBLOCK_CRC))191			set_buffer_verified(bh);192		else {193			ext4_error_inode_err(inode, func, line, block,194					     EFSBADCRC,195					     "Directory index failed checksum");196			brelse(bh);197			return ERR_PTR(-EFSBADCRC);198		}199	}200	if (!is_dx_block) {201		if (ext4_dirblock_csum_verify(inode, bh) &&202		    !ext4_simulate_fail(inode->i_sb, EXT4_SIM_DIRBLOCK_CRC))203			set_buffer_verified(bh);204		else {205			ext4_error_inode_err(inode, func, line, block,206					     EFSBADCRC,207					     "Directory block failed checksum");208			brelse(bh);209			return ERR_PTR(-EFSBADCRC);210		}211	}212	return bh;213}214 215#ifdef DX_DEBUG216#define dxtrace(command) command217#else218#define dxtrace(command)219#endif220 221struct fake_dirent222{223	__le32 inode;224	__le16 rec_len;225	u8 name_len;226	u8 file_type;227};228 229struct dx_countlimit230{231	__le16 limit;232	__le16 count;233};234 235struct dx_entry236{237	__le32 hash;238	__le32 block;239};240 241/*242 * dx_root_info is laid out so that if it should somehow get overlaid by a243 * dirent the two low bits of the hash version will be zero.  Therefore, the244 * hash version mod 4 should never be 0.  Sincerely, the paranoia department.245 */246 247struct dx_root248{249	struct fake_dirent dot;250	char dot_name[4];251	struct fake_dirent dotdot;252	char dotdot_name[4];253	struct dx_root_info254	{255		__le32 reserved_zero;256		u8 hash_version;257		u8 info_length; /* 8 */258		u8 indirect_levels;259		u8 unused_flags;260	}261	info;262	struct dx_entry	entries[];263};264 265struct dx_node266{267	struct fake_dirent fake;268	struct dx_entry	entries[];269};270 271 272struct dx_frame273{274	struct buffer_head *bh;275	struct dx_entry *entries;276	struct dx_entry *at;277};278 279struct dx_map_entry280{281	u32 hash;282	u16 offs;283	u16 size;284};285 286/*287 * This goes at the end of each htree block.288 */289struct dx_tail {290	u32 dt_reserved;291	__le32 dt_checksum;	/* crc32c(uuid+inum+dirblock) */292};293 294static inline ext4_lblk_t dx_get_block(struct dx_entry *entry);295static void dx_set_block(struct dx_entry *entry, ext4_lblk_t value);296static inline unsigned dx_get_hash(struct dx_entry *entry);297static void dx_set_hash(struct dx_entry *entry, unsigned value);298static unsigned dx_get_count(struct dx_entry *entries);299static unsigned dx_get_limit(struct dx_entry *entries);300static void dx_set_count(struct dx_entry *entries, unsigned value);301static void dx_set_limit(struct dx_entry *entries, unsigned value);302static unsigned dx_root_limit(struct inode *dir, unsigned infosize);303static unsigned dx_node_limit(struct inode *dir);304static struct dx_frame *dx_probe(struct ext4_filename *fname,305				 struct inode *dir,306				 struct dx_hash_info *hinfo,307				 struct dx_frame *frame);308static void dx_release(struct dx_frame *frames);309static int dx_make_map(struct inode *dir, struct buffer_head *bh,310		       struct dx_hash_info *hinfo,311		       struct dx_map_entry *map_tail);312static void dx_sort_map(struct dx_map_entry *map, unsigned count);313static struct ext4_dir_entry_2 *dx_move_dirents(struct inode *dir, char *from,314					char *to, struct dx_map_entry *offsets,315					int count, unsigned int blocksize);316static struct ext4_dir_entry_2 *dx_pack_dirents(struct inode *dir, char *base,317						unsigned int blocksize);318static void dx_insert_block(struct dx_frame *frame,319					u32 hash, ext4_lblk_t block);320static int ext4_htree_next_block(struct inode *dir, __u32 hash,321				 struct dx_frame *frame,322				 struct dx_frame *frames,323				 __u32 *start_hash);324static struct buffer_head * ext4_dx_find_entry(struct inode *dir,325		struct ext4_filename *fname,326		struct ext4_dir_entry_2 **res_dir);327static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname,328			     struct inode *dir, struct inode *inode);329 330/* checksumming functions */331void ext4_initialize_dirent_tail(struct buffer_head *bh,332				 unsigned int blocksize)333{334	struct ext4_dir_entry_tail *t = EXT4_DIRENT_TAIL(bh->b_data, blocksize);335 336	memset(t, 0, sizeof(struct ext4_dir_entry_tail));337	t->det_rec_len = ext4_rec_len_to_disk(338			sizeof(struct ext4_dir_entry_tail), blocksize);339	t->det_reserved_ft = EXT4_FT_DIR_CSUM;340}341 342/* Walk through a dirent block to find a checksum "dirent" at the tail */343static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,344						   struct buffer_head *bh)345{346	struct ext4_dir_entry_tail *t;347	int blocksize = EXT4_BLOCK_SIZE(inode->i_sb);348 349#ifdef PARANOID350	struct ext4_dir_entry *d, *top;351 352	d = (struct ext4_dir_entry *)bh->b_data;353	top = (struct ext4_dir_entry *)(bh->b_data +354		(blocksize - sizeof(struct ext4_dir_entry_tail)));355	while (d < top && ext4_rec_len_from_disk(d->rec_len, blocksize))356		d = (struct ext4_dir_entry *)(((void *)d) +357		    ext4_rec_len_from_disk(d->rec_len, blocksize));358 359	if (d != top)360		return NULL;361 362	t = (struct ext4_dir_entry_tail *)d;363#else364	t = EXT4_DIRENT_TAIL(bh->b_data, EXT4_BLOCK_SIZE(inode->i_sb));365#endif366 367	if (t->det_reserved_zero1 ||368	    (ext4_rec_len_from_disk(t->det_rec_len, blocksize) !=369	     sizeof(struct ext4_dir_entry_tail)) ||370	    t->det_reserved_zero2 ||371	    t->det_reserved_ft != EXT4_FT_DIR_CSUM)372		return NULL;373 374	return t;375}376 377static __le32 ext4_dirblock_csum(struct inode *inode, void *dirent, int size)378{379	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);380	struct ext4_inode_info *ei = EXT4_I(inode);381	__u32 csum;382 383	csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)dirent, size);384	return cpu_to_le32(csum);385}386 387#define warn_no_space_for_csum(inode)					\388	__warn_no_space_for_csum((inode), __func__, __LINE__)389 390static void __warn_no_space_for_csum(struct inode *inode, const char *func,391				     unsigned int line)392{393	__ext4_warning_inode(inode, func, line,394		"No space for directory leaf checksum. Please run e2fsck -D.");395}396 397int ext4_dirblock_csum_verify(struct inode *inode, struct buffer_head *bh)398{399	struct ext4_dir_entry_tail *t;400 401	if (!ext4_has_metadata_csum(inode->i_sb))402		return 1;403 404	t = get_dirent_tail(inode, bh);405	if (!t) {406		warn_no_space_for_csum(inode);407		return 0;408	}409 410	if (t->det_checksum != ext4_dirblock_csum(inode, bh->b_data,411						  (char *)t - bh->b_data))412		return 0;413 414	return 1;415}416 417static void ext4_dirblock_csum_set(struct inode *inode,418				 struct buffer_head *bh)419{420	struct ext4_dir_entry_tail *t;421 422	if (!ext4_has_metadata_csum(inode->i_sb))423		return;424 425	t = get_dirent_tail(inode, bh);426	if (!t) {427		warn_no_space_for_csum(inode);428		return;429	}430 431	t->det_checksum = ext4_dirblock_csum(inode, bh->b_data,432					     (char *)t - bh->b_data);433}434 435int ext4_handle_dirty_dirblock(handle_t *handle,436			       struct inode *inode,437			       struct buffer_head *bh)438{439	ext4_dirblock_csum_set(inode, bh);440	return ext4_handle_dirty_metadata(handle, inode, bh);441}442 443static struct dx_countlimit *get_dx_countlimit(struct inode *inode,444					       struct ext4_dir_entry *dirent,445					       int *offset)446{447	struct ext4_dir_entry *dp;448	struct dx_root_info *root;449	int count_offset;450	int blocksize = EXT4_BLOCK_SIZE(inode->i_sb);451	unsigned int rlen = ext4_rec_len_from_disk(dirent->rec_len, blocksize);452 453	if (rlen == blocksize)454		count_offset = 8;455	else if (rlen == 12) {456		dp = (struct ext4_dir_entry *)(((void *)dirent) + 12);457		if (ext4_rec_len_from_disk(dp->rec_len, blocksize) != blocksize - 12)458			return NULL;459		root = (struct dx_root_info *)(((void *)dp + 12));460		if (root->reserved_zero ||461		    root->info_length != sizeof(struct dx_root_info))462			return NULL;463		count_offset = 32;464	} else465		return NULL;466 467	if (offset)468		*offset = count_offset;469	return (struct dx_countlimit *)(((void *)dirent) + count_offset);470}471 472static __le32 ext4_dx_csum(struct inode *inode, struct ext4_dir_entry *dirent,473			   int count_offset, int count, struct dx_tail *t)474{475	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);476	struct ext4_inode_info *ei = EXT4_I(inode);477	__u32 csum;478	int size;479	__u32 dummy_csum = 0;480	int offset = offsetof(struct dx_tail, dt_checksum);481 482	size = count_offset + (count * sizeof(struct dx_entry));483	csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)dirent, size);484	csum = ext4_chksum(sbi, csum, (__u8 *)t, offset);485	csum = ext4_chksum(sbi, csum, (__u8 *)&dummy_csum, sizeof(dummy_csum));486 487	return cpu_to_le32(csum);488}489 490static int ext4_dx_csum_verify(struct inode *inode,491			       struct ext4_dir_entry *dirent)492{493	struct dx_countlimit *c;494	struct dx_tail *t;495	int count_offset, limit, count;496 497	if (!ext4_has_metadata_csum(inode->i_sb))498		return 1;499 500	c = get_dx_countlimit(inode, dirent, &count_offset);501	if (!c) {502		EXT4_ERROR_INODE(inode, "dir seems corrupt?  Run e2fsck -D.");503		return 0;504	}505	limit = le16_to_cpu(c->limit);506	count = le16_to_cpu(c->count);507	if (count_offset + (limit * sizeof(struct dx_entry)) >508	    EXT4_BLOCK_SIZE(inode->i_sb) - sizeof(struct dx_tail)) {509		warn_no_space_for_csum(inode);510		return 0;511	}512	t = (struct dx_tail *)(((struct dx_entry *)c) + limit);513 514	if (t->dt_checksum != ext4_dx_csum(inode, dirent, count_offset,515					    count, t))516		return 0;517	return 1;518}519 520static void ext4_dx_csum_set(struct inode *inode, struct ext4_dir_entry *dirent)521{522	struct dx_countlimit *c;523	struct dx_tail *t;524	int count_offset, limit, count;525 526	if (!ext4_has_metadata_csum(inode->i_sb))527		return;528 529	c = get_dx_countlimit(inode, dirent, &count_offset);530	if (!c) {531		EXT4_ERROR_INODE(inode, "dir seems corrupt?  Run e2fsck -D.");532		return;533	}534	limit = le16_to_cpu(c->limit);535	count = le16_to_cpu(c->count);536	if (count_offset + (limit * sizeof(struct dx_entry)) >537	    EXT4_BLOCK_SIZE(inode->i_sb) - sizeof(struct dx_tail)) {538		warn_no_space_for_csum(inode);539		return;540	}541	t = (struct dx_tail *)(((struct dx_entry *)c) + limit);542 543	t->dt_checksum = ext4_dx_csum(inode, dirent, count_offset, count, t);544}545 546static inline int ext4_handle_dirty_dx_node(handle_t *handle,547					    struct inode *inode,548					    struct buffer_head *bh)549{550	ext4_dx_csum_set(inode, (struct ext4_dir_entry *)bh->b_data);551	return ext4_handle_dirty_metadata(handle, inode, bh);552}553 554/*555 * p is at least 6 bytes before the end of page556 */557static inline struct ext4_dir_entry_2 *558ext4_next_entry(struct ext4_dir_entry_2 *p, unsigned long blocksize)559{560	return (struct ext4_dir_entry_2 *)((char *)p +561		ext4_rec_len_from_disk(p->rec_len, blocksize));562}563 564/*565 * Future: use high four bits of block for coalesce-on-delete flags566 * Mask them off for now.567 */568 569static inline ext4_lblk_t dx_get_block(struct dx_entry *entry)570{571	return le32_to_cpu(entry->block) & 0x0fffffff;572}573 574static inline void dx_set_block(struct dx_entry *entry, ext4_lblk_t value)575{576	entry->block = cpu_to_le32(value);577}578 579static inline unsigned dx_get_hash(struct dx_entry *entry)580{581	return le32_to_cpu(entry->hash);582}583 584static inline void dx_set_hash(struct dx_entry *entry, unsigned value)585{586	entry->hash = cpu_to_le32(value);587}588 589static inline unsigned dx_get_count(struct dx_entry *entries)590{591	return le16_to_cpu(((struct dx_countlimit *) entries)->count);592}593 594static inline unsigned dx_get_limit(struct dx_entry *entries)595{596	return le16_to_cpu(((struct dx_countlimit *) entries)->limit);597}598 599static inline void dx_set_count(struct dx_entry *entries, unsigned value)600{601	((struct dx_countlimit *) entries)->count = cpu_to_le16(value);602}603 604static inline void dx_set_limit(struct dx_entry *entries, unsigned value)605{606	((struct dx_countlimit *) entries)->limit = cpu_to_le16(value);607}608 609static inline unsigned dx_root_limit(struct inode *dir, unsigned infosize)610{611	unsigned int entry_space = dir->i_sb->s_blocksize -612			ext4_dir_rec_len(1, NULL) -613			ext4_dir_rec_len(2, NULL) - infosize;614 615	if (ext4_has_metadata_csum(dir->i_sb))616		entry_space -= sizeof(struct dx_tail);617	return entry_space / sizeof(struct dx_entry);618}619 620static inline unsigned dx_node_limit(struct inode *dir)621{622	unsigned int entry_space = dir->i_sb->s_blocksize -623			ext4_dir_rec_len(0, dir);624 625	if (ext4_has_metadata_csum(dir->i_sb))626		entry_space -= sizeof(struct dx_tail);627	return entry_space / sizeof(struct dx_entry);628}629 630/*631 * Debug632 */633#ifdef DX_DEBUG634static void dx_show_index(char * label, struct dx_entry *entries)635{636	int i, n = dx_get_count (entries);637	printk(KERN_DEBUG "%s index", label);638	for (i = 0; i < n; i++) {639		printk(KERN_CONT " %x->%lu",640		       i ? dx_get_hash(entries + i) : 0,641		       (unsigned long)dx_get_block(entries + i));642	}643	printk(KERN_CONT "\n");644}645 646struct stats647{648	unsigned names;649	unsigned space;650	unsigned bcount;651};652 653static struct stats dx_show_leaf(struct inode *dir,654				struct dx_hash_info *hinfo,655				struct ext4_dir_entry_2 *de,656				int size, int show_names)657{658	unsigned names = 0, space = 0;659	char *base = (char *) de;660	struct dx_hash_info h = *hinfo;661 662	printk("names: ");663	while ((char *) de < base + size)664	{665		if (de->inode)666		{667			if (show_names)668			{669#ifdef CONFIG_FS_ENCRYPTION670				int len;671				char *name;672				struct fscrypt_str fname_crypto_str =673					FSTR_INIT(NULL, 0);674				int res = 0;675 676				name  = de->name;677				len = de->name_len;678				if (!IS_ENCRYPTED(dir)) {679					/* Directory is not encrypted */680					(void) ext4fs_dirhash(dir, de->name,681						de->name_len, &h);682					printk("%*.s:(U)%x.%u ", len,683					       name, h.hash,684					       (unsigned) ((char *) de685							   - base));686				} else {687					struct fscrypt_str de_name =688						FSTR_INIT(name, len);689 690					/* Directory is encrypted */691					res = fscrypt_fname_alloc_buffer(692						len, &fname_crypto_str);693					if (res)694						printk(KERN_WARNING "Error "695							"allocating crypto "696							"buffer--skipping "697							"crypto\n");698					res = fscrypt_fname_disk_to_usr(dir,699						0, 0, &de_name,700						&fname_crypto_str);701					if (res) {702						printk(KERN_WARNING "Error "703							"converting filename "704							"from disk to usr"705							"\n");706						name = "??";707						len = 2;708					} else {709						name = fname_crypto_str.name;710						len = fname_crypto_str.len;711					}712					if (IS_CASEFOLDED(dir))713						h.hash = EXT4_DIRENT_HASH(de);714					else715						(void) ext4fs_dirhash(dir,716							de->name,717							de->name_len, &h);718					printk("%*.s:(E)%x.%u ", len, name,719					       h.hash, (unsigned) ((char *) de720								   - base));721					fscrypt_fname_free_buffer(722							&fname_crypto_str);723				}724#else725				int len = de->name_len;726				char *name = de->name;727				(void) ext4fs_dirhash(dir, de->name,728						      de->name_len, &h);729				printk("%*.s:%x.%u ", len, name, h.hash,730				       (unsigned) ((char *) de - base));731#endif732			}733			space += ext4_dir_rec_len(de->name_len, dir);734			names++;735		}736		de = ext4_next_entry(de, size);737	}738	printk(KERN_CONT "(%i)\n", names);739	return (struct stats) { names, space, 1 };740}741 742struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir,743			     struct dx_entry *entries, int levels)744{745	unsigned blocksize = dir->i_sb->s_blocksize;746	unsigned count = dx_get_count(entries), names = 0, space = 0, i;747	unsigned bcount = 0;748	struct buffer_head *bh;749	printk("%i indexed blocks...\n", count);750	for (i = 0; i < count; i++, entries++)751	{752		ext4_lblk_t block = dx_get_block(entries);753		ext4_lblk_t hash  = i ? dx_get_hash(entries): 0;754		u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash;755		struct stats stats;756		printk("%s%3u:%03u hash %8x/%8x ",levels?"":"   ", i, block, hash, range);757		bh = ext4_bread(NULL,dir, block, 0);758		if (!bh || IS_ERR(bh))759			continue;760		stats = levels?761		   dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1):762		   dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *)763			bh->b_data, blocksize, 0);764		names += stats.names;765		space += stats.space;766		bcount += stats.bcount;767		brelse(bh);768	}769	if (bcount)770		printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n",771		       levels ? "" : "   ", names, space/bcount,772		       (space/bcount)*100/blocksize);773	return (struct stats) { names, space, bcount};774}775 776/*777 * Linear search cross check778 */779static inline void htree_rep_invariant_check(struct dx_entry *at,780					     struct dx_entry *target,781					     u32 hash, unsigned int n)782{783	while (n--) {784		dxtrace(printk(KERN_CONT ","));785		if (dx_get_hash(++at) > hash) {786			at--;787			break;788		}789	}790	ASSERT(at == target - 1);791}792#else /* DX_DEBUG */793static inline void htree_rep_invariant_check(struct dx_entry *at,794					     struct dx_entry *target,795					     u32 hash, unsigned int n)796{797}798#endif /* DX_DEBUG */799 800/*801 * Probe for a directory leaf block to search.802 *803 * dx_probe can return ERR_BAD_DX_DIR, which means there was a format804 * error in the directory index, and the caller should fall back to805 * searching the directory normally.  The callers of dx_probe **MUST**806 * check for this error code, and make sure it never gets reflected807 * back to userspace.808 */809static struct dx_frame *810dx_probe(struct ext4_filename *fname, struct inode *dir,811	 struct dx_hash_info *hinfo, struct dx_frame *frame_in)812{813	unsigned count, indirect, level, i;814	struct dx_entry *at, *entries, *p, *q, *m;815	struct dx_root *root;816	struct dx_frame *frame = frame_in;817	struct dx_frame *ret_err = ERR_PTR(ERR_BAD_DX_DIR);818	u32 hash;819	ext4_lblk_t block;820	ext4_lblk_t blocks[EXT4_HTREE_LEVEL];821 822	memset(frame_in, 0, EXT4_HTREE_LEVEL * sizeof(frame_in[0]));823	frame->bh = ext4_read_dirblock(dir, 0, INDEX);824	if (IS_ERR(frame->bh))825		return (struct dx_frame *) frame->bh;826 827	root = (struct dx_root *) frame->bh->b_data;828	if (root->info.hash_version != DX_HASH_TEA &&829	    root->info.hash_version != DX_HASH_HALF_MD4 &&830	    root->info.hash_version != DX_HASH_LEGACY &&831	    root->info.hash_version != DX_HASH_SIPHASH) {832		ext4_warning_inode(dir, "Unrecognised inode hash code %u",833				   root->info.hash_version);834		goto fail;835	}836	if (ext4_hash_in_dirent(dir)) {837		if (root->info.hash_version != DX_HASH_SIPHASH) {838			ext4_warning_inode(dir,839				"Hash in dirent, but hash is not SIPHASH");840			goto fail;841		}842	} else {843		if (root->info.hash_version == DX_HASH_SIPHASH) {844			ext4_warning_inode(dir,845				"Hash code is SIPHASH, but hash not in dirent");846			goto fail;847		}848	}849	if (fname)850		hinfo = &fname->hinfo;851	hinfo->hash_version = root->info.hash_version;852	if (hinfo->hash_version <= DX_HASH_TEA)853		hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;854	hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed;855	/* hash is already computed for encrypted casefolded directory */856	if (fname && fname_name(fname) &&857	    !(IS_ENCRYPTED(dir) && IS_CASEFOLDED(dir))) {858		int ret = ext4fs_dirhash(dir, fname_name(fname),859					 fname_len(fname), hinfo);860		if (ret < 0) {861			ret_err = ERR_PTR(ret);862			goto fail;863		}864	}865	hash = hinfo->hash;866 867	if (root->info.unused_flags & 1) {868		ext4_warning_inode(dir, "Unimplemented hash flags: %#06x",869				   root->info.unused_flags);870		goto fail;871	}872 873	indirect = root->info.indirect_levels;874	if (indirect >= ext4_dir_htree_level(dir->i_sb)) {875		ext4_warning(dir->i_sb,876			     "Directory (ino: %lu) htree depth %#06x exceed"877			     "supported value", dir->i_ino,878			     ext4_dir_htree_level(dir->i_sb));879		if (ext4_dir_htree_level(dir->i_sb) < EXT4_HTREE_LEVEL) {880			ext4_warning(dir->i_sb, "Enable large directory "881						"feature to access it");882		}883		goto fail;884	}885 886	entries = (struct dx_entry *)(((char *)&root->info) +887				      root->info.info_length);888 889	if (dx_get_limit(entries) != dx_root_limit(dir,890						   root->info.info_length)) {891		ext4_warning_inode(dir, "dx entry: limit %u != root limit %u",892				   dx_get_limit(entries),893				   dx_root_limit(dir, root->info.info_length));894		goto fail;895	}896 897	dxtrace(printk("Look up %x", hash));898	level = 0;899	blocks[0] = 0;900	while (1) {901		count = dx_get_count(entries);902		if (!count || count > dx_get_limit(entries)) {903			ext4_warning_inode(dir,904					   "dx entry: count %u beyond limit %u",905					   count, dx_get_limit(entries));906			goto fail;907		}908 909		p = entries + 1;910		q = entries + count - 1;911		while (p <= q) {912			m = p + (q - p) / 2;913			dxtrace(printk(KERN_CONT "."));914			if (dx_get_hash(m) > hash)915				q = m - 1;916			else917				p = m + 1;918		}919 920		htree_rep_invariant_check(entries, p, hash, count - 1);921 922		at = p - 1;923		dxtrace(printk(KERN_CONT " %x->%u\n",924			       at == entries ? 0 : dx_get_hash(at),925			       dx_get_block(at)));926		frame->entries = entries;927		frame->at = at;928 929		block = dx_get_block(at);930		for (i = 0; i <= level; i++) {931			if (blocks[i] == block) {932				ext4_warning_inode(dir,933					"dx entry: tree cycle block %u points back to block %u",934					blocks[level], block);935				goto fail;936			}937		}938		if (++level > indirect)939			return frame;940		blocks[level] = block;941		frame++;942		frame->bh = ext4_read_dirblock(dir, block, INDEX);943		if (IS_ERR(frame->bh)) {944			ret_err = (struct dx_frame *) frame->bh;945			frame->bh = NULL;946			goto fail;947		}948 949		entries = ((struct dx_node *) frame->bh->b_data)->entries;950 951		if (dx_get_limit(entries) != dx_node_limit(dir)) {952			ext4_warning_inode(dir,953				"dx entry: limit %u != node limit %u",954				dx_get_limit(entries), dx_node_limit(dir));955			goto fail;956		}957	}958fail:959	while (frame >= frame_in) {960		brelse(frame->bh);961		frame--;962	}963 964	if (ret_err == ERR_PTR(ERR_BAD_DX_DIR))965		ext4_warning_inode(dir,966			"Corrupt directory, running e2fsck is recommended");967	return ret_err;968}969 970static void dx_release(struct dx_frame *frames)971{972	struct dx_root_info *info;973	int i;974	unsigned int indirect_levels;975 976	if (frames[0].bh == NULL)977		return;978 979	info = &((struct dx_root *)frames[0].bh->b_data)->info;980	/* save local copy, "info" may be freed after brelse() */981	indirect_levels = info->indirect_levels;982	for (i = 0; i <= indirect_levels; i++) {983		if (frames[i].bh == NULL)984			break;985		brelse(frames[i].bh);986		frames[i].bh = NULL;987	}988}989 990/*991 * This function increments the frame pointer to search the next leaf992 * block, and reads in the necessary intervening nodes if the search993 * should be necessary.  Whether or not the search is necessary is994 * controlled by the hash parameter.  If the hash value is even, then995 * the search is only continued if the next block starts with that996 * hash value.  This is used if we are searching for a specific file.997 *998 * If the hash value is HASH_NB_ALWAYS, then always go to the next block.999 *1000 * This function returns 1 if the caller should continue to search,1001 * or 0 if it should not.  If there is an error reading one of the1002 * index blocks, it will a negative error code.1003 *1004 * If start_hash is non-null, it will be filled in with the starting1005 * hash of the next page.1006 */1007static int ext4_htree_next_block(struct inode *dir, __u32 hash,1008				 struct dx_frame *frame,1009				 struct dx_frame *frames,1010				 __u32 *start_hash)1011{1012	struct dx_frame *p;1013	struct buffer_head *bh;1014	int num_frames = 0;1015	__u32 bhash;1016 1017	p = frame;1018	/*1019	 * Find the next leaf page by incrementing the frame pointer.1020	 * If we run out of entries in the interior node, loop around and1021	 * increment pointer in the parent node.  When we break out of1022	 * this loop, num_frames indicates the number of interior1023	 * nodes need to be read.1024	 */1025	while (1) {1026		if (++(p->at) < p->entries + dx_get_count(p->entries))1027			break;1028		if (p == frames)1029			return 0;1030		num_frames++;1031		p--;1032	}1033 1034	/*1035	 * If the hash is 1, then continue only if the next page has a1036	 * continuation hash of any value.  This is used for readdir1037	 * handling.  Otherwise, check to see if the hash matches the1038	 * desired continuation hash.  If it doesn't, return since1039	 * there's no point to read in the successive index pages.1040	 */1041	bhash = dx_get_hash(p->at);1042	if (start_hash)1043		*start_hash = bhash;1044	if ((hash & 1) == 0) {1045		if ((bhash & ~1) != hash)1046			return 0;1047	}1048	/*1049	 * If the hash is HASH_NB_ALWAYS, we always go to the next1050	 * block so no check is necessary1051	 */1052	while (num_frames--) {1053		bh = ext4_read_dirblock(dir, dx_get_block(p->at), INDEX);1054		if (IS_ERR(bh))1055			return PTR_ERR(bh);1056		p++;1057		brelse(p->bh);1058		p->bh = bh;1059		p->at = p->entries = ((struct dx_node *) bh->b_data)->entries;1060	}1061	return 1;1062}1063 1064 1065/*1066 * This function fills a red-black tree with information from a1067 * directory block.  It returns the number directory entries loaded1068 * into the tree.  If there is an error it is returned in err.1069 */1070static int htree_dirblock_to_tree(struct file *dir_file,1071				  struct inode *dir, ext4_lblk_t block,1072				  struct dx_hash_info *hinfo,1073				  __u32 start_hash, __u32 start_minor_hash)1074{1075	struct buffer_head *bh;1076	struct ext4_dir_entry_2 *de, *top;1077	int err = 0, count = 0;1078	struct fscrypt_str fname_crypto_str = FSTR_INIT(NULL, 0), tmp_str;1079	int csum = ext4_has_metadata_csum(dir->i_sb);1080 1081	dxtrace(printk(KERN_INFO "In htree dirblock_to_tree: block %lu\n",1082							(unsigned long)block));1083	bh = ext4_read_dirblock(dir, block, DIRENT_HTREE);1084	if (IS_ERR(bh))1085		return PTR_ERR(bh);1086 1087	de = (struct ext4_dir_entry_2 *) bh->b_data;1088	/* csum entries are not larger in the casefolded encrypted case */1089	top = (struct ext4_dir_entry_2 *) ((char *) de +1090					   dir->i_sb->s_blocksize -1091					   ext4_dir_rec_len(0,1092							   csum ? NULL : dir));1093	/* Check if the directory is encrypted */1094	if (IS_ENCRYPTED(dir)) {1095		err = fscrypt_prepare_readdir(dir);1096		if (err < 0) {1097			brelse(bh);1098			return err;1099		}1100		err = fscrypt_fname_alloc_buffer(EXT4_NAME_LEN,1101						 &fname_crypto_str);1102		if (err < 0) {1103			brelse(bh);1104			return err;1105		}1106	}1107 1108	for (; de < top; de = ext4_next_entry(de, dir->i_sb->s_blocksize)) {1109		if (ext4_check_dir_entry(dir, NULL, de, bh,1110				bh->b_data, bh->b_size,1111				(block<<EXT4_BLOCK_SIZE_BITS(dir->i_sb))1112					 + ((char *)de - bh->b_data))) {1113			/* silently ignore the rest of the block */1114			break;1115		}1116		if (ext4_hash_in_dirent(dir)) {1117			if (de->name_len && de->inode) {1118				hinfo->hash = EXT4_DIRENT_HASH(de);1119				hinfo->minor_hash = EXT4_DIRENT_MINOR_HASH(de);1120			} else {1121				hinfo->hash = 0;1122				hinfo->minor_hash = 0;1123			}1124		} else {1125			err = ext4fs_dirhash(dir, de->name,1126					     de->name_len, hinfo);1127			if (err < 0) {1128				count = err;1129				goto errout;1130			}1131		}1132		if ((hinfo->hash < start_hash) ||1133		    ((hinfo->hash == start_hash) &&1134		     (hinfo->minor_hash < start_minor_hash)))1135			continue;1136		if (de->inode == 0)1137			continue;1138		if (!IS_ENCRYPTED(dir)) {1139			tmp_str.name = de->name;1140			tmp_str.len = de->name_len;1141			err = ext4_htree_store_dirent(dir_file,1142				   hinfo->hash, hinfo->minor_hash, de,1143				   &tmp_str);1144		} else {1145			int save_len = fname_crypto_str.len;1146			struct fscrypt_str de_name = FSTR_INIT(de->name,1147								de->name_len);1148 1149			/* Directory is encrypted */1150			err = fscrypt_fname_disk_to_usr(dir, hinfo->hash,1151					hinfo->minor_hash, &de_name,1152					&fname_crypto_str);1153			if (err) {1154				count = err;1155				goto errout;1156			}1157			err = ext4_htree_store_dirent(dir_file,1158				   hinfo->hash, hinfo->minor_hash, de,1159					&fname_crypto_str);1160			fname_crypto_str.len = save_len;1161		}1162		if (err != 0) {1163			count = err;1164			goto errout;1165		}1166		count++;1167	}1168errout:1169	brelse(bh);1170	fscrypt_fname_free_buffer(&fname_crypto_str);1171	return count;1172}1173 1174 1175/*1176 * This function fills a red-black tree with information from a1177 * directory.  We start scanning the directory in hash order, starting1178 * at start_hash and start_minor_hash.1179 *1180 * This function returns the number of entries inserted into the tree,1181 * or a negative error code.1182 */1183int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,1184			 __u32 start_minor_hash, __u32 *next_hash)1185{1186	struct dx_hash_info hinfo;1187	struct ext4_dir_entry_2 *de;1188	struct dx_frame frames[EXT4_HTREE_LEVEL], *frame;1189	struct inode *dir;1190	ext4_lblk_t block;1191	int count = 0;1192	int ret, err;1193	__u32 hashval;1194	struct fscrypt_str tmp_str;1195 1196	dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n",1197		       start_hash, start_minor_hash));1198	dir = file_inode(dir_file);1199	if (!(ext4_test_inode_flag(dir, EXT4_INODE_INDEX))) {1200		if (ext4_hash_in_dirent(dir))1201			hinfo.hash_version = DX_HASH_SIPHASH;1202		else1203			hinfo.hash_version =1204					EXT4_SB(dir->i_sb)->s_def_hash_version;1205		if (hinfo.hash_version <= DX_HASH_TEA)1206			hinfo.hash_version +=1207				EXT4_SB(dir->i_sb)->s_hash_unsigned;1208		hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;1209		if (ext4_has_inline_data(dir)) {1210			int has_inline_data = 1;1211			count = ext4_inlinedir_to_tree(dir_file, dir, 0,1212						       &hinfo, start_hash,1213						       start_minor_hash,1214						       &has_inline_data);1215			if (has_inline_data) {1216				*next_hash = ~0;1217				return count;1218			}1219		}1220		count = htree_dirblock_to_tree(dir_file, dir, 0, &hinfo,1221					       start_hash, start_minor_hash);1222		*next_hash = ~0;1223		return count;1224	}1225	hinfo.hash = start_hash;1226	hinfo.minor_hash = 0;1227	frame = dx_probe(NULL, dir, &hinfo, frames);1228	if (IS_ERR(frame))1229		return PTR_ERR(frame);1230 1231	/* Add '.' and '..' from the htree header */1232	if (!start_hash && !start_minor_hash) {1233		de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data;1234		tmp_str.name = de->name;1235		tmp_str.len = de->name_len;1236		err = ext4_htree_store_dirent(dir_file, 0, 0,1237					      de, &tmp_str);1238		if (err != 0)1239			goto errout;1240		count++;1241	}1242	if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) {1243		de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data;1244		de = ext4_next_entry(de, dir->i_sb->s_blocksize);1245		tmp_str.name = de->name;1246		tmp_str.len = de->name_len;1247		err = ext4_htree_store_dirent(dir_file, 2, 0,1248					      de, &tmp_str);1249		if (err != 0)1250			goto errout;1251		count++;1252	}1253 1254	while (1) {1255		if (fatal_signal_pending(current)) {1256			err = -ERESTARTSYS;1257			goto errout;1258		}1259		cond_resched();1260		block = dx_get_block(frame->at);1261		ret = htree_dirblock_to_tree(dir_file, dir, block, &hinfo,1262					     start_hash, start_minor_hash);1263		if (ret < 0) {1264			err = ret;1265			goto errout;1266		}1267		count += ret;1268		hashval = ~0;1269		ret = ext4_htree_next_block(dir, HASH_NB_ALWAYS,1270					    frame, frames, &hashval);1271		*next_hash = hashval;1272		if (ret < 0) {1273			err = ret;1274			goto errout;1275		}1276		/*1277		 * Stop if:  (a) there are no more entries, or1278		 * (b) we have inserted at least one entry and the1279		 * next hash value is not a continuation1280		 */1281		if ((ret == 0) ||1282		    (count && ((hashval & 1) == 0)))1283			break;1284	}1285	dx_release(frames);1286	dxtrace(printk(KERN_DEBUG "Fill tree: returned %d entries, "1287		       "next hash: %x\n", count, *next_hash));1288	return count;1289errout:1290	dx_release(frames);1291	return (err);1292}1293 1294static inline int search_dirblock(struct buffer_head *bh,1295				  struct inode *dir,1296				  struct ext4_filename *fname,1297				  unsigned int offset,1298				  struct ext4_dir_entry_2 **res_dir)1299{1300	return ext4_search_dir(bh, bh->b_data, dir->i_sb->s_blocksize, dir,1301			       fname, offset, res_dir);1302}1303 1304/*1305 * Directory block splitting, compacting1306 */1307 1308/*1309 * Create map of hash values, offsets, and sizes, stored at end of block.1310 * Returns number of entries mapped.1311 */1312static int dx_make_map(struct inode *dir, struct buffer_head *bh,1313		       struct dx_hash_info *hinfo,1314		       struct dx_map_entry *map_tail)1315{1316	int count = 0;1317	struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *)bh->b_data;1318	unsigned int buflen = bh->b_size;1319	char *base = bh->b_data;1320	struct dx_hash_info h = *hinfo;1321	int blocksize = EXT4_BLOCK_SIZE(dir->i_sb);1322 1323	if (ext4_has_metadata_csum(dir->i_sb))1324		buflen -= sizeof(struct ext4_dir_entry_tail);1325 1326	while ((char *) de < base + buflen) {1327		if (ext4_check_dir_entry(dir, NULL, de, bh, base, buflen,1328					 ((char *)de) - base))1329			return -EFSCORRUPTED;1330		if (de->name_len && de->inode) {1331			if (ext4_hash_in_dirent(dir))1332				h.hash = EXT4_DIRENT_HASH(de);1333			else {1334				int err = ext4fs_dirhash(dir, de->name,1335						     de->name_len, &h);1336				if (err < 0)1337					return err;1338			}1339			map_tail--;1340			map_tail->hash = h.hash;1341			map_tail->offs = ((char *) de - base)>>2;1342			map_tail->size = ext4_rec_len_from_disk(de->rec_len,1343								blocksize);1344			count++;1345			cond_resched();1346		}1347		de = ext4_next_entry(de, blocksize);1348	}1349	return count;1350}1351 1352/* Sort map by hash value */1353static void dx_sort_map (struct dx_map_entry *map, unsigned count)1354{1355	struct dx_map_entry *p, *q, *top = map + count - 1;1356	int more;1357	/* Combsort until bubble sort doesn't suck */1358	while (count > 2) {1359		count = count*10/13;1360		if (count - 9 < 2) /* 9, 10 -> 11 */1361			count = 11;1362		for (p = top, q = p - count; q >= map; p--, q--)1363			if (p->hash < q->hash)1364				swap(*p, *q);1365	}1366	/* Garden variety bubble sort */1367	do {1368		more = 0;1369		q = top;1370		while (q-- > map) {1371			if (q[1].hash >= q[0].hash)1372				continue;1373			swap(*(q+1), *q);1374			more = 1;1375		}1376	} while(more);1377}1378 1379static void dx_insert_block(struct dx_frame *frame, u32 hash, ext4_lblk_t block)1380{1381	struct dx_entry *entries = frame->entries;1382	struct dx_entry *old = frame->at, *new = old + 1;1383	int count = dx_get_count(entries);1384 1385	ASSERT(count < dx_get_limit(entries));1386	ASSERT(old < entries + count);1387	memmove(new + 1, new, (char *)(entries + count) - (char *)(new));1388	dx_set_hash(new, hash);1389	dx_set_block(new, block);1390	dx_set_count(entries, count + 1);1391}1392 1393#if IS_ENABLED(CONFIG_UNICODE)1394int ext4_fname_setup_ci_filename(struct inode *dir, const struct qstr *iname,1395				  struct ext4_filename *name)1396{1397	struct qstr *cf_name = &name->cf_name;1398	unsigned char *buf;1399	struct dx_hash_info *hinfo = &name->hinfo;1400	int len;1401 1402	if (!IS_CASEFOLDED(dir) ||1403	    (IS_ENCRYPTED(dir) && !fscrypt_has_encryption_key(dir))) {1404		cf_name->name = NULL;1405		return 0;1406	}1407 1408	buf = kmalloc(EXT4_NAME_LEN, GFP_NOFS);1409	if (!buf)1410		return -ENOMEM;1411 1412	len = utf8_casefold(dir->i_sb->s_encoding, iname, buf, EXT4_NAME_LEN);1413	if (len <= 0) {1414		kfree(buf);1415		buf = NULL;1416	}1417	cf_name->name = buf;1418	cf_name->len = (unsigned) len;1419 1420	if (!IS_ENCRYPTED(dir))1421		return 0;1422 1423	hinfo->hash_version = DX_HASH_SIPHASH;1424	hinfo->seed = NULL;1425	if (cf_name->name)1426		return ext4fs_dirhash(dir, cf_name->name, cf_name->len, hinfo);1427	else1428		return ext4fs_dirhash(dir, iname->name, iname->len, hinfo);1429}1430#endif1431 1432/*1433 * Test whether a directory entry matches the filename being searched for.1434 *1435 * Return: %true if the directory entry matches, otherwise %false.1436 */1437static bool ext4_match(struct inode *parent,1438			      const struct ext4_filename *fname,1439			      struct ext4_dir_entry_2 *de)1440{1441	struct fscrypt_name f;1442 1443	if (!de->inode)1444		return false;1445 1446	f.usr_fname = fname->usr_fname;1447	f.disk_name = fname->disk_name;1448#ifdef CONFIG_FS_ENCRYPTION1449	f.crypto_buf = fname->crypto_buf;1450#endif1451 1452#if IS_ENABLED(CONFIG_UNICODE)1453	if (IS_CASEFOLDED(parent) &&1454	    (!IS_ENCRYPTED(parent) || fscrypt_has_encryption_key(parent))) {1455		/*1456		 * Just checking IS_ENCRYPTED(parent) below is not1457		 * sufficient to decide whether one can use the hash for1458		 * skipping the string comparison, because the key might1459		 * have been added right after1460		 * ext4_fname_setup_ci_filename().  In this case, a hash1461		 * mismatch will be a false negative.  Therefore, make1462		 * sure cf_name was properly initialized before1463		 * considering the calculated hash.1464		 */1465		if (IS_ENCRYPTED(parent) && fname->cf_name.name &&1466		    (fname->hinfo.hash != EXT4_DIRENT_HASH(de) ||1467		     fname->hinfo.minor_hash != EXT4_DIRENT_MINOR_HASH(de)))1468			return false;1469		/*1470		 * Treat comparison errors as not a match.  The1471		 * only case where it happens is on a disk1472		 * corruption or ENOMEM.1473		 */1474 1475		return generic_ci_match(parent, fname->usr_fname,1476					&fname->cf_name, de->name,1477					de->name_len) > 0;1478	}1479#endif1480 1481	return fscrypt_match_name(&f, de->name, de->name_len);1482}1483 1484/*1485 * Returns 0 if not found, -EFSCORRUPTED on failure, and 1 on success1486 */1487int ext4_search_dir(struct buffer_head *bh, char *search_buf, int buf_size,1488		    struct inode *dir, struct ext4_filename *fname,1489		    unsigned int offset, struct ext4_dir_entry_2 **res_dir)1490{1491	struct ext4_dir_entry_2 * de;1492	char * dlimit;1493	int de_len;1494 1495	de = (struct ext4_dir_entry_2 *)search_buf;1496	dlimit = search_buf + buf_size;1497	while ((char *) de < dlimit - EXT4_BASE_DIR_LEN) {1498		/* this code is executed quadratically often */1499		/* do minimal checking `by hand' */1500		if (de->name + de->name_len <= dlimit &&1501		    ext4_match(dir, fname, de)) {1502			/* found a match - just to be sure, do1503			 * a full check */1504			if (ext4_check_dir_entry(dir, NULL, de, bh, search_buf,1505						 buf_size, offset))1506				return -EFSCORRUPTED;1507			*res_dir = de;1508			return 1;1509		}1510		/* prevent looping on a bad block */1511		de_len = ext4_rec_len_from_disk(de->rec_len,1512						dir->i_sb->s_blocksize);1513		if (de_len <= 0)1514			return -EFSCORRUPTED;1515		offset += de_len;1516		de = (struct ext4_dir_entry_2 *) ((char *) de + de_len);1517	}1518	return 0;1519}1520 1521static int is_dx_internal_node(struct inode *dir, ext4_lblk_t block,1522			       struct ext4_dir_entry *de)1523{1524	struct super_block *sb = dir->i_sb;1525 1526	if (!is_dx(dir))1527		return 0;1528	if (block == 0)1529		return 1;1530	if (de->inode == 0 &&1531	    ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize) ==1532			sb->s_blocksize)1533		return 1;1534	return 0;1535}1536 1537/*1538 *	__ext4_find_entry()1539 *1540 * finds an entry in the specified directory with the wanted name. It1541 * returns the cache buffer in which the entry was found, and the entry1542 * itself (as a parameter - res_dir). It does NOT read the inode of the1543 * entry - you'll have to do that yourself if you want to.1544 *1545 * The returned buffer_head has ->b_count elevated.  The caller is expected1546 * to brelse() it when appropriate.1547 */1548static struct buffer_head *__ext4_find_entry(struct inode *dir,1549					     struct ext4_filename *fname,1550					     struct ext4_dir_entry_2 **res_dir,1551					     int *inlined)1552{1553	struct super_block *sb;1554	struct buffer_head *bh_use[NAMEI_RA_SIZE];1555	struct buffer_head *bh, *ret = NULL;1556	ext4_lblk_t start, block;1557	const u8 *name = fname->usr_fname->name;1558	size_t ra_max = 0;	/* Number of bh's in the readahead1559				   buffer, bh_use[] */1560	size_t ra_ptr = 0;	/* Current index into readahead1561				   buffer */1562	ext4_lblk_t  nblocks;1563	int i, namelen, retval;1564 1565	*res_dir = NULL;1566	sb = dir->i_sb;1567	namelen = fname->usr_fname->len;1568	if (namelen > EXT4_NAME_LEN)1569		return NULL;1570 1571	if (ext4_has_inline_data(dir)) {1572		int has_inline_data = 1;1573		ret = ext4_find_inline_entry(dir, fname, res_dir,1574					     &has_inline_data);1575		if (inlined)1576			*inlined = has_inline_data;1577		if (has_inline_data || IS_ERR(ret))1578			goto cleanup_and_exit;1579	}1580 1581	if ((namelen <= 2) && (name[0] == '.') &&1582	    (name[1] == '.' || name[1] == '\0')) {1583		/*1584		 * "." or ".." will only be in the first block1585		 * NFS may look up ".."; "." should be handled by the VFS1586		 */1587		block = start = 0;1588		nblocks = 1;1589		goto restart;1590	}1591	if (is_dx(dir)) {1592		ret = ext4_dx_find_entry(dir, fname, res_dir);1593		/*1594		 * On success, or if the error was file not found,1595		 * return.  Otherwise, fall back to doing a search the1596		 * old fashioned way.1597		 */1598		if (!IS_ERR(ret) || PTR_ERR(ret) != ERR_BAD_DX_DIR)1599			goto cleanup_and_exit;1600		dxtrace(printk(KERN_DEBUG "ext4_find_entry: dx failed, "1601			       "falling back\n"));1602		ret = NULL;1603	}1604	nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);1605	if (!nblocks) {1606		ret = NULL;1607		goto cleanup_and_exit;1608	}1609	start = EXT4_I(dir)->i_dir_start_lookup;1610	if (start >= nblocks)1611		start = 0;1612	block = start;1613restart:1614	do {1615		/*1616		 * We deal with the read-ahead logic here.1617		 */1618		cond_resched();1619		if (ra_ptr >= ra_max) {1620			/* Refill the readahead buffer */1621			ra_ptr = 0;1622			if (block < start)1623				ra_max = start - block;1624			else1625				ra_max = nblocks - block;1626			ra_max = min(ra_max, ARRAY_SIZE(bh_use));1627			retval = ext4_bread_batch(dir, block, ra_max,1628						  false /* wait */, bh_use);1629			if (retval) {1630				ret = ERR_PTR(retval);1631				ra_max = 0;1632				goto cleanup_and_exit;1633			}1634		}1635		if ((bh = bh_use[ra_ptr++]) == NULL)1636			goto next;1637		wait_on_buffer(bh);1638		if (!buffer_uptodate(bh)) {1639			EXT4_ERROR_INODE_ERR(dir, EIO,1640					     "reading directory lblock %lu",1641					     (unsigned long) block);1642			brelse(bh);1643			ret = ERR_PTR(-EIO);1644			goto cleanup_and_exit;1645		}1646		if (!buffer_verified(bh) &&1647		    !is_dx_internal_node(dir, block,1648					 (struct ext4_dir_entry *)bh->b_data) &&1649		    !ext4_dirblock_csum_verify(dir, bh)) {1650			EXT4_ERROR_INODE_ERR(dir, EFSBADCRC,1651					     "checksumming directory "1652					     "block %lu", (unsigned long)block);1653			brelse(bh);1654			ret = ERR_PTR(-EFSBADCRC);1655			goto cleanup_and_exit;1656		}1657		set_buffer_verified(bh);1658		i = search_dirblock(bh, dir, fname,1659			    block << EXT4_BLOCK_SIZE_BITS(sb), res_dir);1660		if (i == 1) {1661			EXT4_I(dir)->i_dir_start_lookup = block;1662			ret = bh;1663			goto cleanup_and_exit;1664		} else {1665			brelse(bh);1666			if (i < 0) {1667				ret = ERR_PTR(i);1668				goto cleanup_and_exit;1669			}1670		}1671	next:1672		if (++block >= nblocks)1673			block = 0;1674	} while (block != start);1675 1676	/*1677	 * If the directory has grown while we were searching, then1678	 * search the last part of the directory before giving up.1679	 */1680	block = nblocks;1681	nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);1682	if (block < nblocks) {1683		start = 0;1684		goto restart;1685	}1686 1687cleanup_and_exit:1688	/* Clean up the read-ahead blocks */1689	for (; ra_ptr < ra_max; ra_ptr++)1690		brelse(bh_use[ra_ptr]);1691	return ret;1692}1693 1694static struct buffer_head *ext4_find_entry(struct inode *dir,1695					   const struct qstr *d_name,1696					   struct ext4_dir_entry_2 **res_dir,1697					   int *inlined)1698{1699	int err;1700	struct ext4_filename fname;1701	struct buffer_head *bh;1702 1703	err = ext4_fname_setup_filename(dir, d_name, 1, &fname);1704	if (err == -ENOENT)1705		return NULL;1706	if (err)1707		return ERR_PTR(err);1708 1709	bh = __ext4_find_entry(dir, &fname, res_dir, inlined);1710 1711	ext4_fname_free_filename(&fname);1712	return bh;1713}1714 1715static struct buffer_head *ext4_lookup_entry(struct inode *dir,1716					     struct dentry *dentry,1717					     struct ext4_dir_entry_2 **res_dir)1718{1719	int err;1720	struct ext4_filename fname;1721	struct buffer_head *bh;1722 1723	err = ext4_fname_prepare_lookup(dir, dentry, &fname);1724	if (err == -ENOENT)1725		return NULL;1726	if (err)1727		return ERR_PTR(err);1728 1729	bh = __ext4_find_entry(dir, &fname, res_dir, NULL);1730 1731	ext4_fname_free_filename(&fname);1732	return bh;1733}1734 1735static struct buffer_head * ext4_dx_find_entry(struct inode *dir,1736			struct ext4_filename *fname,1737			struct ext4_dir_entry_2 **res_dir)1738{1739	struct super_block * sb = dir->i_sb;1740	struct dx_frame frames[EXT4_HTREE_LEVEL], *frame;1741	struct buffer_head *bh;1742	ext4_lblk_t block;1743	int retval;1744 1745#ifdef CONFIG_FS_ENCRYPTION1746	*res_dir = NULL;1747#endif1748	frame = dx_probe(fname, dir, NULL, frames);1749	if (IS_ERR(frame))1750		return (struct buffer_head *) frame;1751	do {1752		block = dx_get_block(frame->at);1753		bh = ext4_read_dirblock(dir, block, DIRENT_HTREE);1754		if (IS_ERR(bh))1755			goto errout;1756 1757		retval = search_dirblock(bh, dir, fname,1758					 block << EXT4_BLOCK_SIZE_BITS(sb),1759					 res_dir);1760		if (retval == 1)1761			goto success;1762		brelse(bh);1763		if (retval < 0) {1764			bh = ERR_PTR(ERR_BAD_DX_DIR);1765			goto errout;1766		}1767 1768		/* Check to see if we should continue to search */1769		retval = ext4_htree_next_block(dir, fname->hinfo.hash, frame,1770					       frames, NULL);1771		if (retval < 0) {1772			ext4_warning_inode(dir,1773				"error %d reading directory index block",1774				retval);1775			bh = ERR_PTR(retval);1776			goto errout;1777		}1778	} while (retval == 1);1779 1780	bh = NULL;1781errout:1782	dxtrace(printk(KERN_DEBUG "%s not found\n", fname->usr_fname->name));1783success:1784	dx_release(frames);1785	return bh;1786}1787 1788static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)1789{1790	struct inode *inode;1791	struct ext4_dir_entry_2 *de;1792	struct buffer_head *bh;1793 1794	if (dentry->d_name.len > EXT4_NAME_LEN)1795		return ERR_PTR(-ENAMETOOLONG);1796 1797	bh = ext4_lookup_entry(dir, dentry, &de);1798	if (IS_ERR(bh))1799		return ERR_CAST(bh);1800	inode = NULL;1801	if (bh) {1802		__u32 ino = le32_to_cpu(de->inode);1803		brelse(bh);1804		if (!ext4_valid_inum(dir->i_sb, ino)) {1805			EXT4_ERROR_INODE(dir, "bad inode number: %u", ino);1806			return ERR_PTR(-EFSCORRUPTED);1807		}1808		if (unlikely(ino == dir->i_ino)) {1809			EXT4_ERROR_INODE(dir, "'%pd' linked to parent dir",1810					 dentry);1811			return ERR_PTR(-EFSCORRUPTED);1812		}1813		inode = ext4_iget(dir->i_sb, ino, EXT4_IGET_NORMAL);1814		if (inode == ERR_PTR(-ESTALE)) {1815			EXT4_ERROR_INODE(dir,1816					 "deleted inode referenced: %u",1817					 ino);1818			return ERR_PTR(-EFSCORRUPTED);1819		}1820		if (!IS_ERR(inode) && IS_ENCRYPTED(dir) &&1821		    (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&1822		    !fscrypt_has_permitted_context(dir, inode)) {1823			ext4_warning(inode->i_sb,1824				     "Inconsistent encryption contexts: %lu/%lu",1825				     dir->i_ino, inode->i_ino);1826			iput(inode);1827			return ERR_PTR(-EPERM);1828		}1829	}1830 1831	if (IS_ENABLED(CONFIG_UNICODE) && !inode && IS_CASEFOLDED(dir)) {1832		/* Eventually we want to call d_add_ci(dentry, NULL)1833		 * for negative dentries in the encoding case as1834		 * well.  For now, prevent the negative dentry1835		 * from being cached.1836		 */1837		return NULL;1838	}1839 1840	return d_splice_alias(inode, dentry);1841}1842 1843 1844struct dentry *ext4_get_parent(struct dentry *child)1845{1846	__u32 ino;1847	struct ext4_dir_entry_2 * de;1848	struct buffer_head *bh;1849 1850	bh = ext4_find_entry(d_inode(child), &dotdot_name, &de, NULL);1851	if (IS_ERR(bh))1852		return ERR_CAST(bh);1853	if (!bh)1854		return ERR_PTR(-ENOENT);1855	ino = le32_to_cpu(de->inode);1856	brelse(bh);1857 1858	if (!ext4_valid_inum(child->d_sb, ino)) {1859		EXT4_ERROR_INODE(d_inode(child),1860				 "bad parent inode number: %u", ino);1861		return ERR_PTR(-EFSCORRUPTED);1862	}1863 1864	return d_obtain_alias(ext4_iget(child->d_sb, ino, EXT4_IGET_NORMAL));1865}1866 1867/*1868 * Move count entries from end of map between two memory locations.1869 * Returns pointer to last entry moved.1870 */1871static struct ext4_dir_entry_2 *1872dx_move_dirents(struct inode *dir, char *from, char *to,1873		struct dx_map_entry *map, int count,1874		unsigned blocksize)1875{1876	unsigned rec_len = 0;1877 1878	while (count--) {1879		struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *)1880						(from + (map->offs<<2));1881		rec_len = ext4_dir_rec_len(de->name_len, dir);1882 1883		memcpy (to, de, rec_len);1884		((struct ext4_dir_entry_2 *) to)->rec_len =1885				ext4_rec_len_to_disk(rec_len, blocksize);1886 1887		/* wipe dir_entry excluding the rec_len field */1888		de->inode = 0;1889		memset(&de->name_len, 0, ext4_rec_len_from_disk(de->rec_len,1890								blocksize) -1891					 offsetof(struct ext4_dir_entry_2,1892								name_len));1893 1894		map++;1895		to += rec_len;1896	}1897	return (struct ext4_dir_entry_2 *) (to - rec_len);1898}1899 1900/*1901 * Compact each dir entry in the range to the minimal rec_len.1902 * Returns pointer to last entry in range.1903 */1904static struct ext4_dir_entry_2 *dx_pack_dirents(struct inode *dir, char *base,1905							unsigned int blocksize)1906{1907	struct ext4_dir_entry_2 *next, *to, *prev, *de = (struct ext4_dir_entry_2 *) base;1908	unsigned rec_len = 0;1909 1910	prev = to = de;1911	while ((char*)de < base + blocksize) {1912		next = ext4_next_entry(de, blocksize);1913		if (de->inode && de->name_len) {1914			rec_len = ext4_dir_rec_len(de->name_len, dir);1915			if (de > to)1916				memmove(to, de, rec_len);1917			to->rec_len = ext4_rec_len_to_disk(rec_len, blocksize);1918			prev = to;1919			to = (struct ext4_dir_entry_2 *) (((char *) to) + rec_len);1920		}1921		de = next;1922	}1923	return prev;1924}1925 1926/*1927 * Split a full leaf block to make room for a new dir entry.1928 * Allocate a new block, and move entries so that they are approx. equally full.1929 * Returns pointer to de in block into which the new entry will be inserted.1930 */1931static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,1932			struct buffer_head **bh,struct dx_frame *frame,1933			struct dx_hash_info *hinfo)1934{1935	unsigned blocksize = dir->i_sb->s_blocksize;1936	unsigned continued;1937	int count;1938	struct buffer_head *bh2;1939	ext4_lblk_t newblock;1940	u32 hash2;1941	struct dx_map_entry *map;1942	char *data1 = (*bh)->b_data, *data2;1943	unsigned split, move, size;1944	struct ext4_dir_entry_2 *de = NULL, *de2;1945	int	csum_size = 0;1946	int	err = 0, i;1947 1948	if (ext4_has_metadata_csum(dir->i_sb))1949		csum_size = sizeof(struct ext4_dir_entry_tail);1950 1951	bh2 = ext4_append(handle, dir, &newblock);1952	if (IS_ERR(bh2)) {1953		brelse(*bh);1954		*bh = NULL;1955		return (struct ext4_dir_entry_2 *) bh2;1956	}1957 1958	BUFFER_TRACE(*bh, "get_write_access");1959	err = ext4_journal_get_write_access(handle, dir->i_sb, *bh,1960					    EXT4_JTR_NONE);1961	if (err)1962		goto journal_error;1963 1964	BUFFER_TRACE(frame->bh, "get_write_access");1965	err = ext4_journal_get_write_access(handle, dir->i_sb, frame->bh,1966					    EXT4_JTR_NONE);1967	if (err)1968		goto journal_error;1969 1970	data2 = bh2->b_data;1971 1972	/* create map in the end of data2 block */1973	map = (struct dx_map_entry *) (data2 + blocksize);1974	count = dx_make_map(dir, *bh, hinfo, map);1975	if (count < 0) {1976		err = count;1977		goto journal_error;1978	}1979	map -= count;1980	dx_sort_map(map, count);1981	/* Ensure that neither split block is over half full */1982	size = 0;1983	move = 0;1984	for (i = count-1; i >= 0; i--) {1985		/* is more than half of this entry in 2nd half of the block? */1986		if (size + map[i].size/2 > blocksize/2)1987			break;1988		size += map[i].size;1989		move++;1990	}1991	/*1992	 * map index at which we will split1993	 *1994	 * If the sum of active entries didn't exceed half the block size, just1995	 * split it in half by count; each resulting block will have at least1996	 * half the space free.1997	 */1998	if (i > 0)1999		split = count - move;2000	else2001		split = count/2;2002 2003	hash2 = map[split].hash;2004	continued = split > 0 ? hash2 == map[split - 1].hash : 0;2005	dxtrace(printk(KERN_INFO "Split block %lu at %x, %i/%i\n",2006			(unsigned long)dx_get_block(frame->at),2007					hash2, split, count-split));2008 2009	/* Fancy dance to stay within two buffers */2010	de2 = dx_move_dirents(dir, data1, data2, map + split, count - split,2011			      blocksize);2012	de = dx_pack_dirents(dir, data1, blocksize);2013	de->rec_len = ext4_rec_len_to_disk(data1 + (blocksize - csum_size) -2014					   (char *) de,2015					   blocksize);2016	de2->rec_len = ext4_rec_len_to_disk(data2 + (blocksize - csum_size) -2017					    (char *) de2,2018					    blocksize);2019	if (csum_size) {2020		ext4_initialize_dirent_tail(*bh, blocksize);2021		ext4_initialize_dirent_tail(bh2, blocksize);2022	}2023 2024	dxtrace(dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *) data1,2025			blocksize, 1));2026	dxtrace(dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *) data2,2027			blocksize, 1));2028 2029	/* Which block gets the new entry? */2030	if (hinfo->hash >= hash2) {2031		swap(*bh, bh2);2032		de = de2;2033	}2034	dx_insert_block(frame, hash2 + continued, newblock);2035	err = ext4_handle_dirty_dirblock(handle, dir, bh2);2036	if (err)2037		goto journal_error;2038	err = ext4_handle_dirty_dx_node(handle, dir, frame->bh);2039	if (err)2040		goto journal_error;2041	brelse(bh2);2042	dxtrace(dx_show_index("frame", frame->entries));2043	return de;2044 2045journal_error:2046	brelse(*bh);2047	brelse(bh2);2048	*bh = NULL;2049	ext4_std_error(dir->i_sb, err);2050	return ERR_PTR(err);2051}2052 2053int ext4_find_dest_de(struct inode *dir, struct inode *inode,2054		      struct buffer_head *bh,2055		      void *buf, int buf_size,2056		      struct ext4_filename *fname,2057		      struct ext4_dir_entry_2 **dest_de)2058{2059	struct ext4_dir_entry_2 *de;2060	unsigned short reclen = ext4_dir_rec_len(fname_len(fname), dir);2061	int nlen, rlen;2062	unsigned int offset = 0;2063	char *top;2064 2065	de = buf;2066	top = buf + buf_size - reclen;2067	while ((char *) de <= top) {2068		if (ext4_check_dir_entry(dir, NULL, de, bh,2069					 buf, buf_size, offset))2070			return -EFSCORRUPTED;2071		if (ext4_match(dir, fname, de))2072			return -EEXIST;2073		nlen = ext4_dir_rec_len(de->name_len, dir);2074		rlen = ext4_rec_len_from_disk(de->rec_len, buf_size);2075		if ((de->inode ? rlen - nlen : rlen) >= reclen)2076			break;2077		de = (struct ext4_dir_entry_2 *)((char *)de + rlen);2078		offset += rlen;2079	}2080	if ((char *) de > top)2081		return -ENOSPC;2082 2083	*dest_de = de;2084	return 0;2085}2086 2087void ext4_insert_dentry(struct inode *dir,2088			struct inode *inode,2089			struct ext4_dir_entry_2 *de,2090			int buf_size,2091			struct ext4_filename *fname)2092{2093 2094	int nlen, rlen;2095 2096	nlen = ext4_dir_rec_len(de->name_len, dir);2097	rlen = ext4_rec_len_from_disk(de->rec_len, buf_size);2098	if (de->inode) {2099		struct ext4_dir_entry_2 *de1 =2100			(struct ext4_dir_entry_2 *)((char *)de + nlen);2101		de1->rec_len = ext4_rec_len_to_disk(rlen - nlen, buf_size);2102		de->rec_len = ext4_rec_len_to_disk(nlen, buf_size);2103		de = de1;2104	}2105	de->file_type = EXT4_FT_UNKNOWN;2106	de->inode = cpu_to_le32(inode->i_ino);2107	ext4_set_de_type(inode->i_sb, de, inode->i_mode);2108	de->name_len = fname_len(fname);2109	memcpy(de->name, fname_name(fname), fname_len(fname));2110	if (ext4_hash_in_dirent(dir)) {2111		struct dx_hash_info *hinfo = &fname->hinfo;2112 2113		EXT4_DIRENT_HASHES(de)->hash = cpu_to_le32(hinfo->hash);2114		EXT4_DIRENT_HASHES(de)->minor_hash =2115						cpu_to_le32(hinfo->minor_hash);2116	}2117}2118 2119/*2120 * Add a new entry into a directory (leaf) block.  If de is non-NULL,2121 * it points to a directory entry which is guaranteed to be large2122 * enough for new directory entry.  If de is NULL, then2123 * add_dirent_to_buf will attempt search the directory block for2124 * space.  It will return -ENOSPC if no space is available, and -EIO2125 * and -EEXIST if directory entry already exists.2126 */2127static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname,2128			     struct inode *dir,2129			     struct inode *inode, struct ext4_dir_entry_2 *de,2130			     struct buffer_head *bh)2131{2132	unsigned int	blocksize = dir->i_sb->s_blocksize;2133	int		csum_size = 0;2134	int		err, err2;2135 2136	if (ext4_has_metadata_csum(inode->i_sb))2137		csum_size = sizeof(struct ext4_dir_entry_tail);2138 2139	if (!de) {2140		err = ext4_find_dest_de(dir, inode, bh, bh->b_data,2141					blocksize - csum_size, fname, &de);2142		if (err)2143			return err;2144	}2145	BUFFER_TRACE(bh, "get_write_access");2146	err = ext4_journal_get_write_access(handle, dir->i_sb, bh,2147					    EXT4_JTR_NONE);2148	if (err) {2149		ext4_std_error(dir->i_sb, err);2150		return err;2151	}2152 2153	/* By now the buffer is marked for journaling */2154	ext4_insert_dentry(dir, inode, de, blocksize, fname);2155 2156	/*2157	 * XXX shouldn't update any times until successful2158	 * completion of syscall, but too many callers depend2159	 * on this.2160	 *2161	 * XXX similarly, too many callers depend on2162	 * ext4_new_inode() setting the times, but error2163	 * recovery deletes the inode, so the worst that can2164	 * happen is that the times are slightly out of date2165	 * and/or different from the directory change time.2166	 */2167	inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));2168	ext4_update_dx_flag(dir);2169	inode_inc_iversion(dir);2170	err2 = ext4_mark_inode_dirty(handle, dir);2171	BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");2172	err = ext4_handle_dirty_dirblock(handle, dir, bh);2173	if (err)2174		ext4_std_error(dir->i_sb, err);2175	return err ? err : err2;2176}2177 2178static bool ext4_check_dx_root(struct inode *dir, struct dx_root *root)2179{2180	struct fake_dirent *fde;2181	const char *error_msg;2182	unsigned int rlen;2183	unsigned int blocksize = dir->i_sb->s_blocksize;2184	char *blockend = (char *)root + dir->i_sb->s_blocksize;2185 2186	fde = &root->dot;2187	if (unlikely(fde->name_len != 1)) {2188		error_msg = "invalid name_len for '.'";2189		goto corrupted;2190	}2191	if (unlikely(strncmp(root->dot_name, ".", fde->name_len))) {2192		error_msg = "invalid name for '.'";2193		goto corrupted;2194	}2195	rlen = ext4_rec_len_from_disk(fde->rec_len, blocksize);2196	if (unlikely((char *)fde + rlen >= blockend)) {2197		error_msg = "invalid rec_len for '.'";2198		goto corrupted;2199	}2200 2201	fde = &root->dotdot;2202	if (unlikely(fde->name_len != 2)) {2203		error_msg = "invalid name_len for '..'";2204		goto corrupted;2205	}2206	if (unlikely(strncmp(root->dotdot_name, "..", fde->name_len))) {2207		error_msg = "invalid name for '..'";2208		goto corrupted;2209	}2210	rlen = ext4_rec_len_from_disk(fde->rec_len, blocksize);2211	if (unlikely((char *)fde + rlen >= blockend)) {2212		error_msg = "invalid rec_len for '..'";2213		goto corrupted;2214	}2215 2216	return true;2217 2218corrupted:2219	EXT4_ERROR_INODE(dir, "Corrupt dir, %s, running e2fsck is recommended",2220			 error_msg);2221	return false;2222}2223 2224/*2225 * This converts a one block unindexed directory to a 3 block indexed2226 * directory, and adds the dentry to the indexed directory.2227 */2228static int make_indexed_dir(handle_t *handle, struct ext4_filename *fname,2229			    struct inode *dir,2230			    struct inode *inode, struct buffer_head *bh)2231{2232	struct buffer_head *bh2;2233	struct dx_root	*root;2234	struct dx_frame	frames[EXT4_HTREE_LEVEL], *frame;2235	struct dx_entry *entries;2236	struct ext4_dir_entry_2	*de, *de2;2237	char		*data2, *top;2238	unsigned	len;2239	int		retval;2240	unsigned	blocksize;2241	ext4_lblk_t  block;2242	struct fake_dirent *fde;2243	int csum_size = 0;2244 2245	if (ext4_has_metadata_csum(inode->i_sb))2246		csum_size = sizeof(struct ext4_dir_entry_tail);2247 2248	blocksize =  dir->i_sb->s_blocksize;2249	dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));2250	BUFFER_TRACE(bh, "get_write_access");2251	retval = ext4_journal_get_write_access(handle, dir->i_sb, bh,2252					       EXT4_JTR_NONE);2253	if (retval) {2254		ext4_std_error(dir->i_sb, retval);2255		brelse(bh);2256		return retval;2257	}2258 2259	root = (struct dx_root *) bh->b_data;2260	if (!ext4_check_dx_root(dir, root)) {2261		brelse(bh);2262		return -EFSCORRUPTED;2263	}2264 2265	/* The 0th block becomes the root, move the dirents out */2266	fde = &root->dotdot;2267	de = (struct ext4_dir_entry_2 *)((char *)fde +2268		ext4_rec_len_from_disk(fde->rec_len, blocksize));2269	len = ((char *) root) + (blocksize - csum_size) - (char *) de;2270 2271	/* Allocate new block for the 0th block's dirents */2272	bh2 = ext4_append(handle, dir, &block);2273	if (IS_ERR(bh2)) {2274		brelse(bh);2275		return PTR_ERR(bh2);2276	}2277	ext4_set_inode_flag(dir, EXT4_INODE_INDEX);2278	data2 = bh2->b_data;2279 2280	memcpy(data2, de, len);2281	memset(de, 0, len); /* wipe old data */2282	de = (struct ext4_dir_entry_2 *) data2;2283	top = data2 + len;2284	while ((char *)(de2 = ext4_next_entry(de, blocksize)) < top) {2285		if (ext4_check_dir_entry(dir, NULL, de, bh2, data2, len,2286					(char *)de - data2)) {2287			brelse(bh2);2288			brelse(bh);2289			return -EFSCORRUPTED;2290		}2291		de = de2;2292	}2293	de->rec_len = ext4_rec_len_to_disk(data2 + (blocksize - csum_size) -2294					   (char *) de, blocksize);2295 2296	if (csum_size)2297		ext4_initialize_dirent_tail(bh2, blocksize);2298 2299	/* Initialize the root; the dot dirents already exist */2300	de = (struct ext4_dir_entry_2 *) (&root->dotdot);2301	de->rec_len = ext4_rec_len_to_disk(2302			blocksize - ext4_dir_rec_len(2, NULL), blocksize);2303	memset (&root->info, 0, sizeof(root->info));2304	root->info.info_length = sizeof(root->info);2305	if (ext4_hash_in_dirent(dir))2306		root->info.hash_version = DX_HASH_SIPHASH;2307	else2308		root->info.hash_version =2309				EXT4_SB(dir->i_sb)->s_def_hash_version;2310 2311	entries = root->entries;2312	dx_set_block(entries, 1);2313	dx_set_count(entries, 1);2314	dx_set_limit(entries, dx_root_limit(dir, sizeof(root->info)));2315 2316	/* Initialize as for dx_probe */2317	fname->hinfo.hash_version = root->info.hash_version;2318	if (fname->hinfo.hash_version <= DX_HASH_TEA)2319		fname->hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;2320	fname->hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;2321 2322	/* casefolded encrypted hashes are computed on fname setup */2323	if (!ext4_hash_in_dirent(dir)) {2324		int err = ext4fs_dirhash(dir, fname_name(fname),2325					 fname_len(fname), &fname->hinfo);2326		if (err < 0) {2327			brelse(bh2);2328			brelse(bh);2329			return err;2330		}2331	}2332	memset(frames, 0, sizeof(frames));2333	frame = frames;2334	frame->entries = entries;2335	frame->at = entries;2336	frame->bh = bh;2337 2338	retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh);2339	if (retval)2340		goto out_frames;2341	retval = ext4_handle_dirty_dirblock(handle, dir, bh2);2342	if (retval)2343		goto out_frames;2344 2345	de = do_split(handle,dir, &bh2, frame, &fname->hinfo);2346	if (IS_ERR(de)) {2347		retval = PTR_ERR(de);2348		goto out_frames;2349	}2350 2351	retval = add_dirent_to_buf(handle, fname, dir, inode, de, bh2);2352out_frames:2353	/*2354	 * Even if the block split failed, we have to properly write2355	 * out all the changes we did so far. Otherwise we can end up2356	 * with corrupted filesystem.2357	 */2358	if (retval)2359		ext4_mark_inode_dirty(handle, dir);2360	dx_release(frames);2361	brelse(bh2);2362	return retval;2363}2364 2365/*2366 *	ext4_add_entry()2367 *2368 * adds a file entry to the specified directory, using the same2369 * semantics as ext4_find_entry(). It returns NULL if it failed.2370 *2371 * NOTE!! The inode part of 'de' is left at 0 - which means you2372 * may not sleep between calling this and putting something into2373 * the entry, as someone else might have used it while you slept.2374 */2375static int ext4_add_entry(handle_t *handle, struct dentry *dentry,2376			  struct inode *inode)2377{2378	struct inode *dir = d_inode(dentry->d_parent);2379	struct buffer_head *bh = NULL;2380	struct ext4_dir_entry_2 *de;2381	struct super_block *sb;2382	struct ext4_filename fname;2383	int	retval;2384	int	dx_fallback=0;2385	unsigned blocksize;2386	ext4_lblk_t block, blocks;2387	int	csum_size = 0;2388 2389	if (ext4_has_metadata_csum(inode->i_sb))2390		csum_size = sizeof(struct ext4_dir_entry_tail);2391 2392	sb = dir->i_sb;2393	blocksize = sb->s_blocksize;2394 2395	if (fscrypt_is_nokey_name(dentry))2396		return -ENOKEY;2397 2398#if IS_ENABLED(CONFIG_UNICODE)2399	if (sb_has_strict_encoding(sb) && IS_CASEFOLDED(dir) &&2400	    utf8_validate(sb->s_encoding, &dentry->d_name))2401		return -EINVAL;2402#endif2403 2404	retval = ext4_fname_setup_filename(dir, &dentry->d_name, 0, &fname);2405	if (retval)2406		return retval;2407 2408	if (ext4_has_inline_data(dir)) {2409		retval = ext4_try_add_inline_entry(handle, &fname, dir, inode);2410		if (retval < 0)2411			goto out;2412		if (retval == 1) {2413			retval = 0;2414			goto out;2415		}2416	}2417 2418	if (is_dx(dir)) {2419		retval = ext4_dx_add_entry(handle, &fname, dir, inode);2420		if (!retval || (retval != ERR_BAD_DX_DIR))2421			goto out;2422		/* Can we just ignore htree data? */2423		if (ext4_has_metadata_csum(sb)) {2424			EXT4_ERROR_INODE(dir,2425				"Directory has corrupted htree index.");2426			retval = -EFSCORRUPTED;2427			goto out;2428		}2429		ext4_clear_inode_flag(dir, EXT4_INODE_INDEX);2430		dx_fallback++;2431		retval = ext4_mark_inode_dirty(handle, dir);2432		if (unlikely(retval))2433			goto out;2434	}2435	blocks = dir->i_size >> sb->s_blocksize_bits;2436	for (block = 0; block < blocks; block++) {2437		bh = ext4_read_dirblock(dir, block, DIRENT);2438		if (bh == NULL) {2439			bh = ext4_bread(handle, dir, block,2440					EXT4_GET_BLOCKS_CREATE);2441			goto add_to_new_block;2442		}2443		if (IS_ERR(bh)) {2444			retval = PTR_ERR(bh);2445			bh = NULL;2446			goto out;2447		}2448		retval = add_dirent_to_buf(handle, &fname, dir, inode,2449					   NULL, bh);2450		if (retval != -ENOSPC)2451			goto out;2452 2453		if (blocks == 1 && !dx_fallback &&2454		    ext4_has_feature_dir_index(sb)) {2455			retval = make_indexed_dir(handle, &fname, dir,2456						  inode, bh);2457			bh = NULL; /* make_indexed_dir releases bh */2458			goto out;2459		}2460		brelse(bh);2461	}2462	bh = ext4_append(handle, dir, &block);2463add_to_new_block:2464	if (IS_ERR(bh)) {2465		retval = PTR_ERR(bh);2466		bh = NULL;2467		goto out;2468	}2469	de = (struct ext4_dir_entry_2 *) bh->b_data;2470	de->inode = 0;2471	de->rec_len = ext4_rec_len_to_disk(blocksize - csum_size, blocksize);2472 2473	if (csum_size)2474		ext4_initialize_dirent_tail(bh, blocksize);2475 2476	retval = add_dirent_to_buf(handle, &fname, dir, inode, de, bh);2477out:2478	ext4_fname_free_filename(&fname);2479	brelse(bh);2480	if (retval == 0)2481		ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY);2482	return retval;2483}2484 2485/*2486 * Returns 0 for success, or a negative error value2487 */2488static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname,2489			     struct inode *dir, struct inode *inode)2490{2491	struct dx_frame frames[EXT4_HTREE_LEVEL], *frame;2492	struct dx_entry *entries, *at;2493	struct buffer_head *bh;2494	struct super_block *sb = dir->i_sb;2495	struct ext4_dir_entry_2 *de;2496	int restart;2497	int err;2498 2499again:2500	restart = 0;2501	frame = dx_probe(fname, dir, NULL, frames);2502	if (IS_ERR(frame))2503		return PTR_ERR(frame);2504	entries = frame->entries;2505	at = frame->at;2506	bh = ext4_read_dirblock(dir, dx_get_block(frame->at), DIRENT_HTREE);2507	if (IS_ERR(bh)) {2508		err = PTR_ERR(bh);2509		bh = NULL;2510		goto cleanup;2511	}2512 2513	BUFFER_TRACE(bh, "get_write_access");2514	err = ext4_journal_get_write_access(handle, sb, bh, EXT4_JTR_NONE);2515	if (err)2516		goto journal_error;2517 2518	err = add_dirent_to_buf(handle, fname, dir, inode, NULL, bh);2519	if (err != -ENOSPC)2520		goto cleanup;2521 2522	err = 0;2523	/* Block full, should compress but for now just split */2524	dxtrace(printk(KERN_DEBUG "using %u of %u node entries\n",2525		       dx_get_count(entries), dx_get_limit(entries)));2526	/* Need to split index? */2527	if (dx_get_count(entries) == dx_get_limit(entries)) {2528		ext4_lblk_t newblock;2529		int levels = frame - frames + 1;2530		unsigned int icount;2531		int add_level = 1;2532		struct dx_entry *entries2;2533		struct dx_node *node2;2534		struct buffer_head *bh2;2535 2536		while (frame > frames) {2537			if (dx_get_count((frame - 1)->entries) <2538			    dx_get_limit((frame - 1)->entries)) {2539				add_level = 0;2540				break;2541			}2542			frame--; /* split higher index block */2543			at = frame->at;2544			entries = frame->entries;2545			restart = 1;2546		}2547		if (add_level && levels == ext4_dir_htree_level(sb)) {2548			ext4_warning(sb, "Directory (ino: %lu) index full, "2549					 "reach max htree level :%d",2550					 dir->i_ino, levels);2551			if (ext4_dir_htree_level(sb) < EXT4_HTREE_LEVEL) {2552				ext4_warning(sb, "Large directory feature is "2553						 "not enabled on this "2554						 "filesystem");2555			}2556			err = -ENOSPC;2557			goto cleanup;2558		}2559		icount = dx_get_count(entries);2560		bh2 = ext4_append(handle, dir, &newblock);2561		if (IS_ERR(bh2)) {2562			err = PTR_ERR(bh2);2563			goto cleanup;2564		}2565		node2 = (struct dx_node *)(bh2->b_data);2566		entries2 = node2->entries;2567		memset(&node2->fake, 0, sizeof(struct fake_dirent));2568		node2->fake.rec_len = ext4_rec_len_to_disk(sb->s_blocksize,2569							   sb->s_blocksize);2570		BUFFER_TRACE(frame->bh, "get_write_access");2571		err = ext4_journal_get_write_access(handle, sb, frame->bh,2572						    EXT4_JTR_NONE);2573		if (err)2574			goto journal_error;2575		if (!add_level) {2576			unsigned icount1 = icount/2, icount2 = icount - icount1;2577			unsigned hash2 = dx_get_hash(entries + icount1);2578			dxtrace(printk(KERN_DEBUG "Split index %i/%i\n",2579				       icount1, icount2));2580 2581			BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */2582			err = ext4_journal_get_write_access(handle, sb,2583							    (frame - 1)->bh,2584							    EXT4_JTR_NONE);2585			if (err)2586				goto journal_error;2587 2588			memcpy((char *) entries2, (char *) (entries + icount1),2589			       icount2 * sizeof(struct dx_entry));2590			dx_set_count(entries, icount1);2591			dx_set_count(entries2, icount2);2592			dx_set_limit(entries2, dx_node_limit(dir));2593 2594			/* Which index block gets the new entry? */2595			if (at - entries >= icount1) {2596				frame->at = at - entries - icount1 + entries2;2597				frame->entries = entries = entries2;2598				swap(frame->bh, bh2);2599			}2600			dx_insert_block((frame - 1), hash2, newblock);2601			dxtrace(dx_show_index("node", frame->entries));2602			dxtrace(dx_show_index("node",2603			       ((struct dx_node *) bh2->b_data)->entries));2604			err = ext4_handle_dirty_dx_node(handle, dir, bh2);2605			if (err)2606				goto journal_error;2607			brelse (bh2);2608			err = ext4_handle_dirty_dx_node(handle, dir,2609						   (frame - 1)->bh);2610			if (err)2611				goto journal_error;2612			err = ext4_handle_dirty_dx_node(handle, dir,2613							frame->bh);2614			if (restart || err)2615				goto journal_error;2616		} else {2617			struct dx_root *dxroot;2618			memcpy((char *) entries2, (char *) entries,2619			       icount * sizeof(struct dx_entry));2620			dx_set_limit(entries2, dx_node_limit(dir));2621 2622			/* Set up root */2623			dx_set_count(entries, 1);2624			dx_set_block(entries + 0, newblock);2625			dxroot = (struct dx_root *)frames[0].bh->b_data;2626			dxroot->info.indirect_levels += 1;2627			dxtrace(printk(KERN_DEBUG2628				       "Creating %d level index...\n",2629				       dxroot->info.indirect_levels));2630			err = ext4_handle_dirty_dx_node(handle, dir, frame->bh);2631			if (err)2632				goto journal_error;2633			err = ext4_handle_dirty_dx_node(handle, dir, bh2);2634			brelse(bh2);2635			restart = 1;2636			goto journal_error;2637		}2638	}2639	de = do_split(handle, dir, &bh, frame, &fname->hinfo);2640	if (IS_ERR(de)) {2641		err = PTR_ERR(de);2642		goto cleanup;2643	}2644	err = add_dirent_to_buf(handle, fname, dir, inode, de, bh);2645	goto cleanup;2646 2647journal_error:2648	ext4_std_error(dir->i_sb, err); /* this is a no-op if err == 0 */2649cleanup:2650	brelse(bh);2651	dx_release(frames);2652	/* @restart is true means htree-path has been changed, we need to2653	 * repeat dx_probe() to find out valid htree-path2654	 */2655	if (restart && err == 0)2656		goto again;2657	return err;2658}2659 2660/*2661 * ext4_generic_delete_entry deletes a directory entry by merging it2662 * with the previous entry2663 */2664int ext4_generic_delete_entry(struct inode *dir,2665			      struct ext4_dir_entry_2 *de_del,2666			      struct buffer_head *bh,2667			      void *entry_buf,2668			      int buf_size,2669			      int csum_size)2670{2671	struct ext4_dir_entry_2 *de, *pde;2672	unsigned int blocksize = dir->i_sb->s_blocksize;2673	int i;2674 2675	i = 0;2676	pde = NULL;2677	de = entry_buf;2678	while (i < buf_size - csum_size) {2679		if (ext4_check_dir_entry(dir, NULL, de, bh,2680					 entry_buf, buf_size, i))2681			return -EFSCORRUPTED;2682		if (de == de_del)  {2683			if (pde) {2684				pde->rec_len = ext4_rec_len_to_disk(2685					ext4_rec_len_from_disk(pde->rec_len,2686							       blocksize) +2687					ext4_rec_len_from_disk(de->rec_len,2688							       blocksize),2689					blocksize);2690 2691				/* wipe entire dir_entry */2692				memset(de, 0, ext4_rec_len_from_disk(de->rec_len,2693								blocksize));2694			} else {2695				/* wipe dir_entry excluding the rec_len field */2696				de->inode = 0;2697				memset(&de->name_len, 0,2698					ext4_rec_len_from_disk(de->rec_len,2699								blocksize) -2700					offsetof(struct ext4_dir_entry_2,2701								name_len));2702			}2703 2704			inode_inc_iversion(dir);2705			return 0;2706		}2707		i += ext4_rec_len_from_disk(de->rec_len, blocksize);2708		pde = de;2709		de = ext4_next_entry(de, blocksize);2710	}2711	return -ENOENT;2712}2713 2714static int ext4_delete_entry(handle_t *handle,2715			     struct inode *dir,2716			     struct ext4_dir_entry_2 *de_del,2717			     struct buffer_head *bh)2718{2719	int err, csum_size = 0;2720 2721	if (ext4_has_inline_data(dir)) {2722		int has_inline_data = 1;2723		err = ext4_delete_inline_entry(handle, dir, de_del, bh,2724					       &has_inline_data);2725		if (has_inline_data)2726			return err;2727	}2728 2729	if (ext4_has_metadata_csum(dir->i_sb))2730		csum_size = sizeof(struct ext4_dir_entry_tail);2731 2732	BUFFER_TRACE(bh, "get_write_access");2733	err = ext4_journal_get_write_access(handle, dir->i_sb, bh,2734					    EXT4_JTR_NONE);2735	if (unlikely(err))2736		goto out;2737 2738	err = ext4_generic_delete_entry(dir, de_del, bh, bh->b_data,2739					dir->i_sb->s_blocksize, csum_size);2740	if (err)2741		goto out;2742 2743	BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");2744	err = ext4_handle_dirty_dirblock(handle, dir, bh);2745	if (unlikely(err))2746		goto out;2747 2748	return 0;2749out:2750	if (err != -ENOENT)2751		ext4_std_error(dir->i_sb, err);2752	return err;2753}2754 2755/*2756 * Set directory link count to 1 if nlinks > EXT4_LINK_MAX, or if nlinks == 22757 * since this indicates that nlinks count was previously 1 to avoid overflowing2758 * the 16-bit i_links_count field on disk.  Directories with i_nlink == 1 mean2759 * that subdirectory link counts are not being maintained accurately.2760 *2761 * The caller has already checked for i_nlink overflow in case the DIR_LINK2762 * feature is not enabled and returned -EMLINK.  The is_dx() check is a proxy2763 * for checking S_ISDIR(inode) (since the INODE_INDEX feature will not be set2764 * on regular files) and to avoid creating huge/slow non-HTREE directories.2765 */2766static void ext4_inc_count(struct inode *inode)2767{2768	inc_nlink(inode);2769	if (is_dx(inode) &&2770	    (inode->i_nlink > EXT4_LINK_MAX || inode->i_nlink == 2))2771		set_nlink(inode, 1);2772}2773 2774/*2775 * If a directory had nlink == 1, then we should let it be 1. This indicates2776 * directory has >EXT4_LINK_MAX subdirs.2777 */2778static void ext4_dec_count(struct inode *inode)2779{2780	if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2)2781		drop_nlink(inode);2782}2783 2784 2785/*2786 * Add non-directory inode to a directory. On success, the inode reference is2787 * consumed by dentry is instantiation. This is also indicated by clearing of2788 * *inodep pointer. On failure, the caller is responsible for dropping the2789 * inode reference in the safe context.2790 */2791static int ext4_add_nondir(handle_t *handle,2792		struct dentry *dentry, struct inode **inodep)2793{2794	struct inode *dir = d_inode(dentry->d_parent);2795	struct inode *inode = *inodep;2796	int err = ext4_add_entry(handle, dentry, inode);2797	if (!err) {2798		err = ext4_mark_inode_dirty(handle, inode);2799		if (IS_DIRSYNC(dir))2800			ext4_handle_sync(handle);2801		d_instantiate_new(dentry, inode);2802		*inodep = NULL;2803		return err;2804	}2805	drop_nlink(inode);2806	ext4_mark_inode_dirty(handle, inode);2807	ext4_orphan_add(handle, inode);2808	unlock_new_inode(inode);2809	return err;2810}2811 2812/*2813 * By the time this is called, we already have created2814 * the directory cache entry for the new file, but it2815 * is so far negative - it has no inode.2816 *2817 * If the create succeeds, we fill in the inode information2818 * with d_instantiate().2819 */2820static int ext4_create(struct mnt_idmap *idmap, struct inode *dir,2821		       struct dentry *dentry, umode_t mode, bool excl)2822{2823	handle_t *handle;2824	struct inode *inode;2825	int err, credits, retries = 0;2826 2827	err = dquot_initialize(dir);2828	if (err)2829		return err;2830 2831	credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +2832		   EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);2833retry:2834	inode = ext4_new_inode_start_handle(idmap, dir, mode, &dentry->d_name,2835					    0, NULL, EXT4_HT_DIR, credits);2836	handle = ext4_journal_current_handle();2837	err = PTR_ERR(inode);2838	if (!IS_ERR(inode)) {2839		inode->i_op = &ext4_file_inode_operations;2840		inode->i_fop = &ext4_file_operations;2841		ext4_set_aops(inode);2842		err = ext4_add_nondir(handle, dentry, &inode);2843		if (!err)2844			ext4_fc_track_create(handle, dentry);2845	}2846	if (handle)2847		ext4_journal_stop(handle);2848	if (!IS_ERR_OR_NULL(inode))2849		iput(inode);2850	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))2851		goto retry;2852	return err;2853}2854 2855static int ext4_mknod(struct mnt_idmap *idmap, struct inode *dir,2856		      struct dentry *dentry, umode_t mode, dev_t rdev)2857{2858	handle_t *handle;2859	struct inode *inode;2860	int err, credits, retries = 0;2861 2862	err = dquot_initialize(dir);2863	if (err)2864		return err;2865 2866	credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +2867		   EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);2868retry:2869	inode = ext4_new_inode_start_handle(idmap, dir, mode, &dentry->d_name,2870					    0, NULL, EXT4_HT_DIR, credits);2871	handle = ext4_journal_current_handle();2872	err = PTR_ERR(inode);2873	if (!IS_ERR(inode)) {2874		init_special_inode(inode, inode->i_mode, rdev);2875		inode->i_op = &ext4_special_inode_operations;2876		err = ext4_add_nondir(handle, dentry, &inode);2877		if (!err)2878			ext4_fc_track_create(handle, dentry);2879	}2880	if (handle)2881		ext4_journal_stop(handle);2882	if (!IS_ERR_OR_NULL(inode))2883		iput(inode);2884	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))2885		goto retry;2886	return err;2887}2888 2889static int ext4_tmpfile(struct mnt_idmap *idmap, struct inode *dir,2890			struct file *file, umode_t mode)2891{2892	handle_t *handle;2893	struct inode *inode;2894	int err, retries = 0;2895 2896	err = dquot_initialize(dir);2897	if (err)2898		return err;2899 2900retry:2901	inode = ext4_new_inode_start_handle(idmap, dir, mode,2902					    NULL, 0, NULL,2903					    EXT4_HT_DIR,2904			EXT4_MAXQUOTAS_TRANS_BLOCKS(dir->i_sb) +2905			  4 + EXT4_XATTR_TRANS_BLOCKS);2906	handle = ext4_journal_current_handle();2907	err = PTR_ERR(inode);2908	if (!IS_ERR(inode)) {2909		inode->i_op = &ext4_file_inode_operations;2910		inode->i_fop = &ext4_file_operations;2911		ext4_set_aops(inode);2912		d_tmpfile(file, inode);2913		err = ext4_orphan_add(handle, inode);2914		if (err)2915			goto err_unlock_inode;2916		mark_inode_dirty(inode);2917		unlock_new_inode(inode);2918	}2919	if (handle)2920		ext4_journal_stop(handle);2921	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))2922		goto retry;2923	return finish_open_simple(file, err);2924err_unlock_inode:2925	ext4_journal_stop(handle);2926	unlock_new_inode(inode);2927	return err;2928}2929 2930struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,2931			  struct ext4_dir_entry_2 *de,2932			  int blocksize, int csum_size,2933			  unsigned int parent_ino, int dotdot_real_len)2934{2935	de->inode = cpu_to_le32(inode->i_ino);2936	de->name_len = 1;2937	de->rec_len = ext4_rec_len_to_disk(ext4_dir_rec_len(de->name_len, NULL),2938					   blocksize);2939	strcpy(de->name, ".");2940	ext4_set_de_type(inode->i_sb, de, S_IFDIR);2941 2942	de = ext4_next_entry(de, blocksize);2943	de->inode = cpu_to_le32(parent_ino);2944	de->name_len = 2;2945	if (!dotdot_real_len)2946		de->rec_len = ext4_rec_len_to_disk(blocksize -2947					(csum_size + ext4_dir_rec_len(1, NULL)),2948					blocksize);2949	else2950		de->rec_len = ext4_rec_len_to_disk(2951					ext4_dir_rec_len(de->name_len, NULL),2952					blocksize);2953	strcpy(de->name, "..");2954	ext4_set_de_type(inode->i_sb, de, S_IFDIR);2955 2956	return ext4_next_entry(de, blocksize);2957}2958 2959int ext4_init_new_dir(handle_t *handle, struct inode *dir,2960			     struct inode *inode)2961{2962	struct buffer_head *dir_block = NULL;2963	struct ext4_dir_entry_2 *de;2964	ext4_lblk_t block = 0;2965	unsigned int blocksize = dir->i_sb->s_blocksize;2966	int csum_size = 0;2967	int err;2968 2969	if (ext4_has_metadata_csum(dir->i_sb))2970		csum_size = sizeof(struct ext4_dir_entry_tail);2971 2972	if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {2973		err = ext4_try_create_inline_dir(handle, dir, inode);2974		if (err < 0 && err != -ENOSPC)2975			goto out;2976		if (!err)2977			goto out;2978	}2979 2980	inode->i_size = 0;2981	dir_block = ext4_append(handle, inode, &block);2982	if (IS_ERR(dir_block))2983		return PTR_ERR(dir_block);2984	de = (struct ext4_dir_entry_2 *)dir_block->b_data;2985	ext4_init_dot_dotdot(inode, de, blocksize, csum_size, dir->i_ino, 0);2986	set_nlink(inode, 2);2987	if (csum_size)2988		ext4_initialize_dirent_tail(dir_block, blocksize);2989 2990	BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata");2991	err = ext4_handle_dirty_dirblock(handle, inode, dir_block);2992	if (err)2993		goto out;2994	set_buffer_verified(dir_block);2995out:2996	brelse(dir_block);2997	return err;2998}2999 3000static int ext4_mkdir(struct mnt_idmap *idmap, struct inode *dir,3001		      struct dentry *dentry, umode_t mode)3002{3003	handle_t *handle;3004	struct inode *inode;3005	int err, err2 = 0, credits, retries = 0;3006 3007	if (EXT4_DIR_LINK_MAX(dir))3008		return -EMLINK;3009 3010	err = dquot_initialize(dir);3011	if (err)3012		return err;3013 3014	credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +3015		   EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);3016retry:3017	inode = ext4_new_inode_start_handle(idmap, dir, S_IFDIR | mode,3018					    &dentry->d_name,3019					    0, NULL, EXT4_HT_DIR, credits);3020	handle = ext4_journal_current_handle();3021	err = PTR_ERR(inode);3022	if (IS_ERR(inode))3023		goto out_stop;3024 3025	inode->i_op = &ext4_dir_inode_operations;3026	inode->i_fop = &ext4_dir_operations;3027	err = ext4_init_new_dir(handle, dir, inode);3028	if (err)3029		goto out_clear_inode;3030	err = ext4_mark_inode_dirty(handle, inode);3031	if (!err)3032		err = ext4_add_entry(handle, dentry, inode);3033	if (err) {3034out_clear_inode:3035		clear_nlink(inode);3036		ext4_orphan_add(handle, inode);3037		unlock_new_inode(inode);3038		err2 = ext4_mark_inode_dirty(handle, inode);3039		if (unlikely(err2))3040			err = err2;3041		ext4_journal_stop(handle);3042		iput(inode);3043		goto out_retry;3044	}3045	ext4_inc_count(dir);3046 3047	ext4_update_dx_flag(dir);3048	err = ext4_mark_inode_dirty(handle, dir);3049	if (err)3050		goto out_clear_inode;3051	d_instantiate_new(dentry, inode);3052	ext4_fc_track_create(handle, dentry);3053	if (IS_DIRSYNC(dir))3054		ext4_handle_sync(handle);3055 3056out_stop:3057	if (handle)3058		ext4_journal_stop(handle);3059out_retry:3060	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))3061		goto retry;3062	return err;3063}3064 3065/*3066 * routine to check that the specified directory is empty (for rmdir)3067 */3068bool ext4_empty_dir(struct inode *inode)3069{3070	unsigned int offset;3071	struct buffer_head *bh;3072	struct ext4_dir_entry_2 *de;3073	struct super_block *sb;3074 3075	if (ext4_has_inline_data(inode)) {3076		int has_inline_data = 1;3077		int ret;3078 3079		ret = empty_inline_dir(inode, &has_inline_data);3080		if (has_inline_data)3081			return ret;3082	}3083 3084	sb = inode->i_sb;3085	if (inode->i_size < ext4_dir_rec_len(1, NULL) +3086					ext4_dir_rec_len(2, NULL)) {3087		EXT4_ERROR_INODE(inode, "invalid size");3088		return false;3089	}3090	bh = ext4_read_dirblock(inode, 0, EITHER);3091	if (IS_ERR(bh))3092		return false;3093 3094	de = (struct ext4_dir_entry_2 *) bh->b_data;3095	if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size,3096				 0) ||3097	    le32_to_cpu(de->inode) != inode->i_ino || strcmp(".", de->name)) {3098		ext4_warning_inode(inode, "directory missing '.'");3099		brelse(bh);3100		return false;3101	}3102	offset = ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize);3103	de = ext4_next_entry(de, sb->s_blocksize);3104	if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size,3105				 offset) ||3106	    le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) {3107		ext4_warning_inode(inode, "directory missing '..'");3108		brelse(bh);3109		return false;3110	}3111	offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize);3112	while (offset < inode->i_size) {3113		if (!(offset & (sb->s_blocksize - 1))) {3114			unsigned int lblock;3115			brelse(bh);3116			lblock = offset >> EXT4_BLOCK_SIZE_BITS(sb);3117			bh = ext4_read_dirblock(inode, lblock, EITHER);3118			if (bh == NULL) {3119				offset += sb->s_blocksize;3120				continue;3121			}3122			if (IS_ERR(bh))3123				return false;3124		}3125		de = (struct ext4_dir_entry_2 *) (bh->b_data +3126					(offset & (sb->s_blocksize - 1)));3127		if (ext4_check_dir_entry(inode, NULL, de, bh,3128					 bh->b_data, bh->b_size, offset) ||3129		    le32_to_cpu(de->inode)) {3130			brelse(bh);3131			return false;3132		}3133		offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize);3134	}3135	brelse(bh);3136	return true;3137}3138 3139static int ext4_rmdir(struct inode *dir, struct dentry *dentry)3140{3141	int retval;3142	struct inode *inode;3143	struct buffer_head *bh;3144	struct ext4_dir_entry_2 *de;3145	handle_t *handle = NULL;3146 3147	if (unlikely(ext4_forced_shutdown(dir->i_sb)))3148		return -EIO;3149 3150	/* Initialize quotas before so that eventual writes go in3151	 * separate transaction */3152	retval = dquot_initialize(dir);3153	if (retval)3154		return retval;3155	retval = dquot_initialize(d_inode(dentry));3156	if (retval)3157		return retval;3158 3159	retval = -ENOENT;3160	bh = ext4_find_entry(dir, &dentry->d_name, &de, NULL);3161	if (IS_ERR(bh))3162		return PTR_ERR(bh);3163	if (!bh)3164		goto end_rmdir;3165 3166	inode = d_inode(dentry);3167 3168	retval = -EFSCORRUPTED;3169	if (le32_to_cpu(de->inode) != inode->i_ino)3170		goto end_rmdir;3171 3172	retval = -ENOTEMPTY;3173	if (!ext4_empty_dir(inode))3174		goto end_rmdir;3175 3176	handle = ext4_journal_start(dir, EXT4_HT_DIR,3177				    EXT4_DATA_TRANS_BLOCKS(dir->i_sb));3178	if (IS_ERR(handle)) {3179		retval = PTR_ERR(handle);3180		handle = NULL;3181		goto end_rmdir;3182	}3183 3184	if (IS_DIRSYNC(dir))3185		ext4_handle_sync(handle);3186 3187	retval = ext4_delete_entry(handle, dir, de, bh);3188	if (retval)3189		goto end_rmdir;3190	if (!EXT4_DIR_LINK_EMPTY(inode))3191		ext4_warning_inode(inode,3192			     "empty directory '%.*s' has too many links (%u)",3193			     dentry->d_name.len, dentry->d_name.name,3194			     inode->i_nlink);3195	inode_inc_iversion(inode);3196	clear_nlink(inode);3197	/* There's no need to set i_disksize: the fact that i_nlink is3198	 * zero will ensure that the right thing happens during any3199	 * recovery. */3200	inode->i_size = 0;3201	ext4_orphan_add(handle, inode);3202	inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));3203	inode_set_ctime_current(inode);3204	retval = ext4_mark_inode_dirty(handle, inode);3205	if (retval)3206		goto end_rmdir;3207	ext4_dec_count(dir);3208	ext4_update_dx_flag(dir);3209	ext4_fc_track_unlink(handle, dentry);3210	retval = ext4_mark_inode_dirty(handle, dir);3211 3212	/* VFS negative dentries are incompatible with Encoding and3213	 * Case-insensitiveness. Eventually we'll want avoid3214	 * invalidating the dentries here, alongside with returning the3215	 * negative dentries at ext4_lookup(), when it is better3216	 * supported by the VFS for the CI case.3217	 */3218	if (IS_ENABLED(CONFIG_UNICODE) && IS_CASEFOLDED(dir))3219		d_invalidate(dentry);3220 3221end_rmdir:3222	brelse(bh);3223	if (handle)3224		ext4_journal_stop(handle);3225	return retval;3226}3227 3228int __ext4_unlink(struct inode *dir, const struct qstr *d_name,3229		  struct inode *inode,3230		  struct dentry *dentry /* NULL during fast_commit recovery */)3231{3232	int retval = -ENOENT;3233	struct buffer_head *bh;3234	struct ext4_dir_entry_2 *de;3235	handle_t *handle;3236	int skip_remove_dentry = 0;3237 3238	/*3239	 * Keep this outside the transaction; it may have to set up the3240	 * directory's encryption key, which isn't GFP_NOFS-safe.3241	 */3242	bh = ext4_find_entry(dir, d_name, &de, NULL);3243	if (IS_ERR(bh))3244		return PTR_ERR(bh);3245 3246	if (!bh)3247		return -ENOENT;3248 3249	if (le32_to_cpu(de->inode) != inode->i_ino) {3250		/*3251		 * It's okay if we find dont find dentry which matches3252		 * the inode. That's because it might have gotten3253		 * renamed to a different inode number3254		 */3255		if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)3256			skip_remove_dentry = 1;3257		else3258			goto out_bh;3259	}3260 3261	handle = ext4_journal_start(dir, EXT4_HT_DIR,3262				    EXT4_DATA_TRANS_BLOCKS(dir->i_sb));3263	if (IS_ERR(handle)) {3264		retval = PTR_ERR(handle);3265		goto out_bh;3266	}3267 3268	if (IS_DIRSYNC(dir))3269		ext4_handle_sync(handle);3270 3271	if (!skip_remove_dentry) {3272		retval = ext4_delete_entry(handle, dir, de, bh);3273		if (retval)3274			goto out_handle;3275		inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));3276		ext4_update_dx_flag(dir);3277		retval = ext4_mark_inode_dirty(handle, dir);3278		if (retval)3279			goto out_handle;3280	} else {3281		retval = 0;3282	}3283	if (inode->i_nlink == 0)3284		ext4_warning_inode(inode, "Deleting file '%.*s' with no links",3285				   d_name->len, d_name->name);3286	else3287		drop_nlink(inode);3288	if (!inode->i_nlink)3289		ext4_orphan_add(handle, inode);3290	inode_set_ctime_current(inode);3291	retval = ext4_mark_inode_dirty(handle, inode);3292	if (dentry && !retval)3293		ext4_fc_track_unlink(handle, dentry);3294out_handle:3295	ext4_journal_stop(handle);3296out_bh:3297	brelse(bh);3298	return retval;3299}3300 3301static int ext4_unlink(struct inode *dir, struct dentry *dentry)3302{3303	int retval;3304 3305	if (unlikely(ext4_forced_shutdown(dir->i_sb)))3306		return -EIO;3307 3308	trace_ext4_unlink_enter(dir, dentry);3309	/*3310	 * Initialize quotas before so that eventual writes go3311	 * in separate transaction3312	 */3313	retval = dquot_initialize(dir);3314	if (retval)3315		goto out_trace;3316	retval = dquot_initialize(d_inode(dentry));3317	if (retval)3318		goto out_trace;3319 3320	retval = __ext4_unlink(dir, &dentry->d_name, d_inode(dentry), dentry);3321 3322	/* VFS negative dentries are incompatible with Encoding and3323	 * Case-insensitiveness. Eventually we'll want avoid3324	 * invalidating the dentries here, alongside with returning the3325	 * negative dentries at ext4_lookup(), when it is  better3326	 * supported by the VFS for the CI case.3327	 */3328	if (IS_ENABLED(CONFIG_UNICODE) && IS_CASEFOLDED(dir))3329		d_invalidate(dentry);3330 3331out_trace:3332	trace_ext4_unlink_exit(dentry, retval);3333	return retval;3334}3335 3336static int ext4_init_symlink_block(handle_t *handle, struct inode *inode,3337				   struct fscrypt_str *disk_link)3338{3339	struct buffer_head *bh;3340	char *kaddr;3341	int err = 0;3342 3343	bh = ext4_bread(handle, inode, 0, EXT4_GET_BLOCKS_CREATE);3344	if (IS_ERR(bh))3345		return PTR_ERR(bh);3346 3347	BUFFER_TRACE(bh, "get_write_access");3348	err = ext4_journal_get_write_access(handle, inode->i_sb, bh, EXT4_JTR_NONE);3349	if (err)3350		goto out;3351 3352	kaddr = (char *)bh->b_data;3353	memcpy(kaddr, disk_link->name, disk_link->len);3354	inode->i_size = disk_link->len - 1;3355	EXT4_I(inode)->i_disksize = inode->i_size;3356	err = ext4_handle_dirty_metadata(handle, inode, bh);3357out:3358	brelse(bh);3359	return err;3360}3361 3362static int ext4_symlink(struct mnt_idmap *idmap, struct inode *dir,3363			struct dentry *dentry, const char *symname)3364{3365	handle_t *handle;3366	struct inode *inode;3367	int err, len = strlen(symname);3368	int credits;3369	struct fscrypt_str disk_link;3370	int retries = 0;3371 3372	if (unlikely(ext4_forced_shutdown(dir->i_sb)))3373		return -EIO;3374 3375	err = fscrypt_prepare_symlink(dir, symname, len, dir->i_sb->s_blocksize,3376				      &disk_link);3377	if (err)3378		return err;3379 3380	err = dquot_initialize(dir);3381	if (err)3382		return err;3383 3384	/*3385	 * EXT4_INDEX_EXTRA_TRANS_BLOCKS for addition of entry into the3386	 * directory. +3 for inode, inode bitmap, group descriptor allocation.3387	 * EXT4_DATA_TRANS_BLOCKS for the data block allocation and3388	 * modification.3389	 */3390	credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +3391		  EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3;3392retry:3393	inode = ext4_new_inode_start_handle(idmap, dir, S_IFLNK|S_IRWXUGO,3394					    &dentry->d_name, 0, NULL,3395					    EXT4_HT_DIR, credits);3396	handle = ext4_journal_current_handle();3397	if (IS_ERR(inode)) {3398		if (handle)3399			ext4_journal_stop(handle);3400		err = PTR_ERR(inode);3401		goto out_retry;3402	}3403 3404	if (IS_ENCRYPTED(inode)) {3405		err = fscrypt_encrypt_symlink(inode, symname, len, &disk_link);3406		if (err)3407			goto err_drop_inode;3408		inode->i_op = &ext4_encrypted_symlink_inode_operations;3409	} else {3410		if ((disk_link.len > EXT4_N_BLOCKS * 4)) {3411			inode->i_op = &ext4_symlink_inode_operations;3412		} else {3413			inode->i_op = &ext4_fast_symlink_inode_operations;3414			inode->i_link = (char *)&EXT4_I(inode)->i_data;3415		}3416	}3417 3418	if ((disk_link.len > EXT4_N_BLOCKS * 4)) {3419		/* alloc symlink block and fill it */3420		err = ext4_init_symlink_block(handle, inode, &disk_link);3421		if (err)3422			goto err_drop_inode;3423	} else {3424		/* clear the extent format for fast symlink */3425		ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS);3426		memcpy((char *)&EXT4_I(inode)->i_data, disk_link.name,3427		       disk_link.len);3428		inode->i_size = disk_link.len - 1;3429		EXT4_I(inode)->i_disksize = inode->i_size;3430	}3431	err = ext4_add_nondir(handle, dentry, &inode);3432	if (handle)3433		ext4_journal_stop(handle);3434	iput(inode);3435	goto out_retry;3436 3437err_drop_inode:3438	clear_nlink(inode);3439	ext4_mark_inode_dirty(handle, inode);3440	ext4_orphan_add(handle, inode);3441	unlock_new_inode(inode);3442	if (handle)3443		ext4_journal_stop(handle);3444	iput(inode);3445out_retry:3446	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))3447		goto retry;3448	if (disk_link.name != (unsigned char *)symname)3449		kfree(disk_link.name);3450	return err;3451}3452 3453int __ext4_link(struct inode *dir, struct inode *inode, struct dentry *dentry)3454{3455	handle_t *handle;3456	int err, retries = 0;3457retry:3458	handle = ext4_journal_start(dir, EXT4_HT_DIR,3459		(EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +3460		 EXT4_INDEX_EXTRA_TRANS_BLOCKS) + 1);3461	if (IS_ERR(handle))3462		return PTR_ERR(handle);3463 3464	if (IS_DIRSYNC(dir))3465		ext4_handle_sync(handle);3466 3467	inode_set_ctime_current(inode);3468	ext4_inc_count(inode);3469	ihold(inode);3470 3471	err = ext4_add_entry(handle, dentry, inode);3472	if (!err) {3473		err = ext4_mark_inode_dirty(handle, inode);3474		/* this can happen only for tmpfile being3475		 * linked the first time3476		 */3477		if (inode->i_nlink == 1)3478			ext4_orphan_del(handle, inode);3479		d_instantiate(dentry, inode);3480		ext4_fc_track_link(handle, dentry);3481	} else {3482		drop_nlink(inode);3483		iput(inode);3484	}3485	ext4_journal_stop(handle);3486	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))3487		goto retry;3488	return err;3489}3490 3491static int ext4_link(struct dentry *old_dentry,3492		     struct inode *dir, struct dentry *dentry)3493{3494	struct inode *inode = d_inode(old_dentry);3495	int err;3496 3497	if (inode->i_nlink >= EXT4_LINK_MAX)3498		return -EMLINK;3499 3500	err = fscrypt_prepare_link(old_dentry, dir, dentry);3501	if (err)3502		return err;3503 3504	if ((ext4_test_inode_flag(dir, EXT4_INODE_PROJINHERIT)) &&3505	    (!projid_eq(EXT4_I(dir)->i_projid,3506			EXT4_I(old_dentry->d_inode)->i_projid)))3507		return -EXDEV;3508 3509	err = dquot_initialize(dir);3510	if (err)3511		return err;3512	return __ext4_link(dir, inode, dentry);3513}3514 3515/*3516 * Try to find buffer head where contains the parent block.3517 * It should be the inode block if it is inlined or the 1st block3518 * if it is a normal dir.3519 */3520static struct buffer_head *ext4_get_first_dir_block(handle_t *handle,3521					struct inode *inode,3522					int *retval,3523					struct ext4_dir_entry_2 **parent_de,3524					int *inlined)3525{3526	struct buffer_head *bh;3527 3528	if (!ext4_has_inline_data(inode)) {3529		struct ext4_dir_entry_2 *de;3530		unsigned int offset;3531 3532		bh = ext4_read_dirblock(inode, 0, EITHER);3533		if (IS_ERR(bh)) {3534			*retval = PTR_ERR(bh);3535			return NULL;3536		}3537 3538		de = (struct ext4_dir_entry_2 *) bh->b_data;3539		if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data,3540					 bh->b_size, 0) ||3541		    le32_to_cpu(de->inode) != inode->i_ino ||3542		    strcmp(".", de->name)) {3543			EXT4_ERROR_INODE(inode, "directory missing '.'");3544			brelse(bh);3545			*retval = -EFSCORRUPTED;3546			return NULL;3547		}3548		offset = ext4_rec_len_from_disk(de->rec_len,3549						inode->i_sb->s_blocksize);3550		de = ext4_next_entry(de, inode->i_sb->s_blocksize);3551		if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data,3552					 bh->b_size, offset) ||3553		    le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) {3554			EXT4_ERROR_INODE(inode, "directory missing '..'");3555			brelse(bh);3556			*retval = -EFSCORRUPTED;3557			return NULL;3558		}3559		*parent_de = de;3560 3561		return bh;3562	}3563 3564	*inlined = 1;3565	return ext4_get_first_inline_block(inode, parent_de, retval);3566}3567 3568struct ext4_renament {3569	struct inode *dir;3570	struct dentry *dentry;3571	struct inode *inode;3572	bool is_dir;3573	int dir_nlink_delta;3574 3575	/* entry for "dentry" */3576	struct buffer_head *bh;3577	struct ext4_dir_entry_2 *de;3578	int inlined;3579 3580	/* entry for ".." in inode if it's a directory */3581	struct buffer_head *dir_bh;3582	struct ext4_dir_entry_2 *parent_de;3583	int dir_inlined;3584};3585 3586static int ext4_rename_dir_prepare(handle_t *handle, struct ext4_renament *ent, bool is_cross)3587{3588	int retval;3589 3590	ent->is_dir = true;3591	if (!is_cross)3592		return 0;3593 3594	ent->dir_bh = ext4_get_first_dir_block(handle, ent->inode,3595					      &retval, &ent->parent_de,3596					      &ent->dir_inlined);3597	if (!ent->dir_bh)3598		return retval;3599	if (le32_to_cpu(ent->parent_de->inode) != ent->dir->i_ino)3600		return -EFSCORRUPTED;3601	BUFFER_TRACE(ent->dir_bh, "get_write_access");3602	return ext4_journal_get_write_access(handle, ent->dir->i_sb,3603					     ent->dir_bh, EXT4_JTR_NONE);3604}3605 3606static int ext4_rename_dir_finish(handle_t *handle, struct ext4_renament *ent,3607				  unsigned dir_ino)3608{3609	int retval;3610 3611	if (!ent->dir_bh)3612		return 0;3613 3614	ent->parent_de->inode = cpu_to_le32(dir_ino);3615	BUFFER_TRACE(ent->dir_bh, "call ext4_handle_dirty_metadata");3616	if (!ent->dir_inlined) {3617		if (is_dx(ent->inode)) {3618			retval = ext4_handle_dirty_dx_node(handle,3619							   ent->inode,3620							   ent->dir_bh);3621		} else {3622			retval = ext4_handle_dirty_dirblock(handle, ent->inode,3623							    ent->dir_bh);3624		}3625	} else {3626		retval = ext4_mark_inode_dirty(handle, ent->inode);3627	}3628	if (retval) {3629		ext4_std_error(ent->dir->i_sb, retval);3630		return retval;3631	}3632	return 0;3633}3634 3635static int ext4_setent(handle_t *handle, struct ext4_renament *ent,3636		       unsigned ino, unsigned file_type)3637{3638	int retval, retval2;3639 3640	BUFFER_TRACE(ent->bh, "get write access");3641	retval = ext4_journal_get_write_access(handle, ent->dir->i_sb, ent->bh,3642					       EXT4_JTR_NONE);3643	if (retval)3644		return retval;3645	ent->de->inode = cpu_to_le32(ino);3646	if (ext4_has_feature_filetype(ent->dir->i_sb))3647		ent->de->file_type = file_type;3648	inode_inc_iversion(ent->dir);3649	inode_set_mtime_to_ts(ent->dir, inode_set_ctime_current(ent->dir));3650	retval = ext4_mark_inode_dirty(handle, ent->dir);3651	BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata");3652	if (!ent->inlined) {3653		retval2 = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh);3654		if (unlikely(retval2)) {3655			ext4_std_error(ent->dir->i_sb, retval2);3656			return retval2;3657		}3658	}3659	return retval;3660}3661 3662static void ext4_resetent(handle_t *handle, struct ext4_renament *ent,3663			  unsigned ino, unsigned file_type)3664{3665	struct ext4_renament old = *ent;3666	int retval = 0;3667 3668	/*3669	 * old->de could have moved from under us during make indexed dir,3670	 * so the old->de may no longer valid and need to find it again3671	 * before reset old inode info.3672	 */3673	old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de,3674				 &old.inlined);3675	if (IS_ERR(old.bh))3676		retval = PTR_ERR(old.bh);3677	if (!old.bh)3678		retval = -ENOENT;3679	if (retval) {3680		ext4_std_error(old.dir->i_sb, retval);3681		return;3682	}3683 3684	ext4_setent(handle, &old, ino, file_type);3685	brelse(old.bh);3686}3687 3688static int ext4_find_delete_entry(handle_t *handle, struct inode *dir,3689				  const struct qstr *d_name)3690{3691	int retval = -ENOENT;3692	struct buffer_head *bh;3693	struct ext4_dir_entry_2 *de;3694 3695	bh = ext4_find_entry(dir, d_name, &de, NULL);3696	if (IS_ERR(bh))3697		return PTR_ERR(bh);3698	if (bh) {3699		retval = ext4_delete_entry(handle, dir, de, bh);3700		brelse(bh);3701	}3702	return retval;3703}3704 3705static void ext4_rename_delete(handle_t *handle, struct ext4_renament *ent,3706			       int force_reread)3707{3708	int retval;3709	/*3710	 * ent->de could have moved from under us during htree split, so make3711	 * sure that we are deleting the right entry.  We might also be pointing3712	 * to a stale entry in the unused part of ent->bh so just checking inum3713	 * and the name isn't enough.3714	 */3715	if (le32_to_cpu(ent->de->inode) != ent->inode->i_ino ||3716	    ent->de->name_len != ent->dentry->d_name.len ||3717	    strncmp(ent->de->name, ent->dentry->d_name.name,3718		    ent->de->name_len) ||3719	    force_reread) {3720		retval = ext4_find_delete_entry(handle, ent->dir,3721						&ent->dentry->d_name);3722	} else {3723		retval = ext4_delete_entry(handle, ent->dir, ent->de, ent->bh);3724		if (retval == -ENOENT) {3725			retval = ext4_find_delete_entry(handle, ent->dir,3726							&ent->dentry->d_name);3727		}3728	}3729 3730	if (retval) {3731		ext4_warning_inode(ent->dir,3732				   "Deleting old file: nlink %d, error=%d",3733				   ent->dir->i_nlink, retval);3734	}3735}3736 3737static void ext4_update_dir_count(handle_t *handle, struct ext4_renament *ent)3738{3739	if (ent->dir_nlink_delta) {3740		if (ent->dir_nlink_delta == -1)3741			ext4_dec_count(ent->dir);3742		else3743			ext4_inc_count(ent->dir);3744		ext4_mark_inode_dirty(handle, ent->dir);3745	}3746}3747 3748static struct inode *ext4_whiteout_for_rename(struct mnt_idmap *idmap,3749					      struct ext4_renament *ent,3750					      int credits, handle_t **h)3751{3752	struct inode *wh;3753	handle_t *handle;3754	int retries = 0;3755 3756	/*3757	 * for inode block, sb block, group summaries,3758	 * and inode bitmap3759	 */3760	credits += (EXT4_MAXQUOTAS_TRANS_BLOCKS(ent->dir->i_sb) +3761		    EXT4_XATTR_TRANS_BLOCKS + 4);3762retry:3763	wh = ext4_new_inode_start_handle(idmap, ent->dir,3764					 S_IFCHR | WHITEOUT_MODE,3765					 &ent->dentry->d_name, 0, NULL,3766					 EXT4_HT_DIR, credits);3767 3768	handle = ext4_journal_current_handle();3769	if (IS_ERR(wh)) {3770		if (handle)3771			ext4_journal_stop(handle);3772		if (PTR_ERR(wh) == -ENOSPC &&3773		    ext4_should_retry_alloc(ent->dir->i_sb, &retries))3774			goto retry;3775	} else {3776		*h = handle;3777		init_special_inode(wh, wh->i_mode, WHITEOUT_DEV);3778		wh->i_op = &ext4_special_inode_operations;3779	}3780	return wh;3781}3782 3783/*3784 * Anybody can rename anything with this: the permission checks are left to the3785 * higher-level routines.3786 *3787 * n.b.  old_{dentry,inode) refers to the source dentry/inode3788 * while new_{dentry,inode) refers to the destination dentry/inode3789 * This comes from rename(const char *oldpath, const char *newpath)3790 */3791static int ext4_rename(struct mnt_idmap *idmap, struct inode *old_dir,3792		       struct dentry *old_dentry, struct inode *new_dir,3793		       struct dentry *new_dentry, unsigned int flags)3794{3795	handle_t *handle = NULL;3796	struct ext4_renament old = {3797		.dir = old_dir,3798		.dentry = old_dentry,3799		.inode = d_inode(old_dentry),3800	};3801	struct ext4_renament new = {3802		.dir = new_dir,3803		.dentry = new_dentry,3804		.inode = d_inode(new_dentry),3805	};3806	int force_reread;3807	int retval;3808	struct inode *whiteout = NULL;3809	int credits;3810	u8 old_file_type;3811 3812	if (new.inode && new.inode->i_nlink == 0) {3813		EXT4_ERROR_INODE(new.inode,3814				 "target of rename is already freed");3815		return -EFSCORRUPTED;3816	}3817 3818	if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT)) &&3819	    (!projid_eq(EXT4_I(new_dir)->i_projid,3820			EXT4_I(old_dentry->d_inode)->i_projid)))3821		return -EXDEV;3822 3823	retval = dquot_initialize(old.dir);3824	if (retval)3825		return retval;3826	retval = dquot_initialize(old.inode);3827	if (retval)3828		return retval;3829	retval = dquot_initialize(new.dir);3830	if (retval)3831		return retval;3832 3833	/* Initialize quotas before so that eventual writes go3834	 * in separate transaction */3835	if (new.inode) {3836		retval = dquot_initialize(new.inode);3837		if (retval)3838			return retval;3839	}3840 3841	old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de,3842				 &old.inlined);3843	if (IS_ERR(old.bh))3844		return PTR_ERR(old.bh);3845 3846	/*3847	 *  Check for inode number is _not_ due to possible IO errors.3848	 *  We might rmdir the source, keep it as pwd of some process3849	 *  and merrily kill the link to whatever was created under the3850	 *  same name. Goodbye sticky bit ;-<3851	 */3852	retval = -ENOENT;3853	if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino)3854		goto release_bh;3855 3856	new.bh = ext4_find_entry(new.dir, &new.dentry->d_name,3857				 &new.de, &new.inlined);3858	if (IS_ERR(new.bh)) {3859		retval = PTR_ERR(new.bh);3860		new.bh = NULL;3861		goto release_bh;3862	}3863	if (new.bh) {3864		if (!new.inode) {3865			brelse(new.bh);3866			new.bh = NULL;3867		}3868	}3869	if (new.inode && !test_opt(new.dir->i_sb, NO_AUTO_DA_ALLOC))3870		ext4_alloc_da_blocks(old.inode);3871 3872	credits = (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) +3873		   EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2);3874	if (!(flags & RENAME_WHITEOUT)) {3875		handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits);3876		if (IS_ERR(handle)) {3877			retval = PTR_ERR(handle);3878			goto release_bh;3879		}3880	} else {3881		whiteout = ext4_whiteout_for_rename(idmap, &old, credits, &handle);3882		if (IS_ERR(whiteout)) {3883			retval = PTR_ERR(whiteout);3884			goto release_bh;3885		}3886	}3887 3888	old_file_type = old.de->file_type;3889	if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir))3890		ext4_handle_sync(handle);3891 3892	if (S_ISDIR(old.inode->i_mode)) {3893		if (new.inode) {3894			retval = -ENOTEMPTY;3895			if (!ext4_empty_dir(new.inode))3896				goto end_rename;3897		} else {3898			retval = -EMLINK;3899			if (new.dir != old.dir && EXT4_DIR_LINK_MAX(new.dir))3900				goto end_rename;3901		}3902		retval = ext4_rename_dir_prepare(handle, &old, new.dir != old.dir);3903		if (retval)3904			goto end_rename;3905	}3906	/*3907	 * If we're renaming a file within an inline_data dir and adding or3908	 * setting the new dirent causes a conversion from inline_data to3909	 * extents/blockmap, we need to force the dirent delete code to3910	 * re-read the directory, or else we end up trying to delete a dirent3911	 * from what is now the extent tree root (or a block map).3912	 */3913	force_reread = (new.dir->i_ino == old.dir->i_ino &&3914			ext4_test_inode_flag(new.dir, EXT4_INODE_INLINE_DATA));3915 3916	if (whiteout) {3917		/*3918		 * Do this before adding a new entry, so the old entry is sure3919		 * to be still pointing to the valid old entry.3920		 */3921		retval = ext4_setent(handle, &old, whiteout->i_ino,3922				     EXT4_FT_CHRDEV);3923		if (retval)3924			goto end_rename;3925		retval = ext4_mark_inode_dirty(handle, whiteout);3926		if (unlikely(retval))3927			goto end_rename;3928 3929	}3930	if (!new.bh) {3931		retval = ext4_add_entry(handle, new.dentry, old.inode);3932		if (retval)3933			goto end_rename;3934	} else {3935		retval = ext4_setent(handle, &new,3936				     old.inode->i_ino, old_file_type);3937		if (retval)3938			goto end_rename;3939	}3940	if (force_reread)3941		force_reread = !ext4_test_inode_flag(new.dir,3942						     EXT4_INODE_INLINE_DATA);3943 3944	/*3945	 * Like most other Unix systems, set the ctime for inodes on a3946	 * rename.3947	 */3948	inode_set_ctime_current(old.inode);3949	retval = ext4_mark_inode_dirty(handle, old.inode);3950	if (unlikely(retval))3951		goto end_rename;3952 3953	if (!whiteout) {3954		/*3955		 * ok, that's it3956		 */3957		ext4_rename_delete(handle, &old, force_reread);3958	}3959 3960	if (new.inode) {3961		ext4_dec_count(new.inode);3962		inode_set_ctime_current(new.inode);3963	}3964	inode_set_mtime_to_ts(old.dir, inode_set_ctime_current(old.dir));3965	ext4_update_dx_flag(old.dir);3966	if (old.is_dir) {3967		retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino);3968		if (retval)3969			goto end_rename;3970 3971		ext4_dec_count(old.dir);3972		if (new.inode) {3973			/* checked ext4_empty_dir above, can't have another3974			 * parent, ext4_dec_count() won't work for many-linked3975			 * dirs */3976			clear_nlink(new.inode);3977		} else {3978			ext4_inc_count(new.dir);3979			ext4_update_dx_flag(new.dir);3980			retval = ext4_mark_inode_dirty(handle, new.dir);3981			if (unlikely(retval))3982				goto end_rename;3983		}3984	}3985	retval = ext4_mark_inode_dirty(handle, old.dir);3986	if (unlikely(retval))3987		goto end_rename;3988 3989	if (old.is_dir) {3990		/*3991		 * We disable fast commits here that's because the3992		 * replay code is not yet capable of changing dot dot3993		 * dirents in directories.3994		 */3995		ext4_fc_mark_ineligible(old.inode->i_sb,3996			EXT4_FC_REASON_RENAME_DIR, handle);3997	} else {3998		struct super_block *sb = old.inode->i_sb;3999 4000		if (new.inode)4001			ext4_fc_track_unlink(handle, new.dentry);4002		if (test_opt2(sb, JOURNAL_FAST_COMMIT) &&4003		    !(EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY) &&4004		    !(ext4_test_mount_flag(sb, EXT4_MF_FC_INELIGIBLE))) {4005			__ext4_fc_track_link(handle, old.inode, new.dentry);4006			__ext4_fc_track_unlink(handle, old.inode, old.dentry);4007			if (whiteout)4008				__ext4_fc_track_create(handle, whiteout,4009						       old.dentry);4010		}4011	}4012 4013	if (new.inode) {4014		retval = ext4_mark_inode_dirty(handle, new.inode);4015		if (unlikely(retval))4016			goto end_rename;4017		if (!new.inode->i_nlink)4018			ext4_orphan_add(handle, new.inode);4019	}4020	retval = 0;4021 4022end_rename:4023	if (whiteout) {4024		if (retval) {4025			ext4_resetent(handle, &old,4026				      old.inode->i_ino, old_file_type);4027			drop_nlink(whiteout);4028			ext4_mark_inode_dirty(handle, whiteout);4029			ext4_orphan_add(handle, whiteout);4030		}4031		unlock_new_inode(whiteout);4032		ext4_journal_stop(handle);4033		iput(whiteout);4034	} else {4035		ext4_journal_stop(handle);4036	}4037release_bh:4038	brelse(old.dir_bh);4039	brelse(old.bh);4040	brelse(new.bh);4041 4042	return retval;4043}4044 4045static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,4046			     struct inode *new_dir, struct dentry *new_dentry)4047{4048	handle_t *handle = NULL;4049	struct ext4_renament old = {4050		.dir = old_dir,4051		.dentry = old_dentry,4052		.inode = d_inode(old_dentry),4053	};4054	struct ext4_renament new = {4055		.dir = new_dir,4056		.dentry = new_dentry,4057		.inode = d_inode(new_dentry),4058	};4059	u8 new_file_type;4060	int retval;4061 4062	if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT) &&4063	     !projid_eq(EXT4_I(new_dir)->i_projid,4064			EXT4_I(old_dentry->d_inode)->i_projid)) ||4065	    (ext4_test_inode_flag(old_dir, EXT4_INODE_PROJINHERIT) &&4066	     !projid_eq(EXT4_I(old_dir)->i_projid,4067			EXT4_I(new_dentry->d_inode)->i_projid)))4068		return -EXDEV;4069 4070	retval = dquot_initialize(old.dir);4071	if (retval)4072		return retval;4073	retval = dquot_initialize(new.dir);4074	if (retval)4075		return retval;4076 4077	old.bh = ext4_find_entry(old.dir, &old.dentry->d_name,4078				 &old.de, &old.inlined);4079	if (IS_ERR(old.bh))4080		return PTR_ERR(old.bh);4081	/*4082	 *  Check for inode number is _not_ due to possible IO errors.4083	 *  We might rmdir the source, keep it as pwd of some process4084	 *  and merrily kill the link to whatever was created under the4085	 *  same name. Goodbye sticky bit ;-<4086	 */4087	retval = -ENOENT;4088	if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino)4089		goto end_rename;4090 4091	new.bh = ext4_find_entry(new.dir, &new.dentry->d_name,4092				 &new.de, &new.inlined);4093	if (IS_ERR(new.bh)) {4094		retval = PTR_ERR(new.bh);4095		new.bh = NULL;4096		goto end_rename;4097	}4098 4099	/* RENAME_EXCHANGE case: old *and* new must both exist */4100	if (!new.bh || le32_to_cpu(new.de->inode) != new.inode->i_ino)4101		goto end_rename;4102 4103	handle = ext4_journal_start(old.dir, EXT4_HT_DIR,4104		(2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) +4105		 2 * EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2));4106	if (IS_ERR(handle)) {4107		retval = PTR_ERR(handle);4108		handle = NULL;4109		goto end_rename;4110	}4111 4112	if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir))4113		ext4_handle_sync(handle);4114 4115	if (S_ISDIR(old.inode->i_mode)) {4116		retval = ext4_rename_dir_prepare(handle, &old, new.dir != old.dir);4117		if (retval)4118			goto end_rename;4119	}4120	if (S_ISDIR(new.inode->i_mode)) {4121		retval = ext4_rename_dir_prepare(handle, &new, new.dir != old.dir);4122		if (retval)4123			goto end_rename;4124	}4125 4126	/*4127	 * Other than the special case of overwriting a directory, parents'4128	 * nlink only needs to be modified if this is a cross directory rename.4129	 */4130	if (old.dir != new.dir && old.is_dir != new.is_dir) {4131		old.dir_nlink_delta = old.is_dir ? -1 : 1;4132		new.dir_nlink_delta = -old.dir_nlink_delta;4133		retval = -EMLINK;4134		if ((old.dir_nlink_delta > 0 && EXT4_DIR_LINK_MAX(old.dir)) ||4135		    (new.dir_nlink_delta > 0 && EXT4_DIR_LINK_MAX(new.dir)))4136			goto end_rename;4137	}4138 4139	new_file_type = new.de->file_type;4140	retval = ext4_setent(handle, &new, old.inode->i_ino, old.de->file_type);4141	if (retval)4142		goto end_rename;4143 4144	retval = ext4_setent(handle, &old, new.inode->i_ino, new_file_type);4145	if (retval)4146		goto end_rename;4147 4148	/*4149	 * Like most other Unix systems, set the ctime for inodes on a4150	 * rename.4151	 */4152	inode_set_ctime_current(old.inode);4153	inode_set_ctime_current(new.inode);4154	retval = ext4_mark_inode_dirty(handle, old.inode);4155	if (unlikely(retval))4156		goto end_rename;4157	retval = ext4_mark_inode_dirty(handle, new.inode);4158	if (unlikely(retval))4159		goto end_rename;4160	ext4_fc_mark_ineligible(new.inode->i_sb,4161				EXT4_FC_REASON_CROSS_RENAME, handle);4162	if (old.dir_bh) {4163		retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino);4164		if (retval)4165			goto end_rename;4166	}4167	if (new.dir_bh) {4168		retval = ext4_rename_dir_finish(handle, &new, old.dir->i_ino);4169		if (retval)4170			goto end_rename;4171	}4172	ext4_update_dir_count(handle, &old);4173	ext4_update_dir_count(handle, &new);4174	retval = 0;4175 4176end_rename:4177	brelse(old.dir_bh);4178	brelse(new.dir_bh);4179	brelse(old.bh);4180	brelse(new.bh);4181	if (handle)4182		ext4_journal_stop(handle);4183	return retval;4184}4185 4186static int ext4_rename2(struct mnt_idmap *idmap,4187			struct inode *old_dir, struct dentry *old_dentry,4188			struct inode *new_dir, struct dentry *new_dentry,4189			unsigned int flags)4190{4191	int err;4192 4193	if (unlikely(ext4_forced_shutdown(old_dir->i_sb)))4194		return -EIO;4195 4196	if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))4197		return -EINVAL;4198 4199	err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,4200				     flags);4201	if (err)4202		return err;4203 4204	if (flags & RENAME_EXCHANGE) {4205		return ext4_cross_rename(old_dir, old_dentry,4206					 new_dir, new_dentry);4207	}4208 4209	return ext4_rename(idmap, old_dir, old_dentry, new_dir, new_dentry, flags);4210}4211 4212/*4213 * directories can handle most operations...4214 */4215const struct inode_operations ext4_dir_inode_operations = {4216	.create		= ext4_create,4217	.lookup		= ext4_lookup,4218	.link		= ext4_link,4219	.unlink		= ext4_unlink,4220	.symlink	= ext4_symlink,4221	.mkdir		= ext4_mkdir,4222	.rmdir		= ext4_rmdir,4223	.mknod		= ext4_mknod,4224	.tmpfile	= ext4_tmpfile,4225	.rename		= ext4_rename2,4226	.setattr	= ext4_setattr,4227	.getattr	= ext4_getattr,4228	.listxattr	= ext4_listxattr,4229	.get_inode_acl	= ext4_get_acl,4230	.set_acl	= ext4_set_acl,4231	.fiemap         = ext4_fiemap,4232	.fileattr_get	= ext4_fileattr_get,4233	.fileattr_set	= ext4_fileattr_set,4234};4235 4236const struct inode_operations ext4_special_inode_operations = {4237	.setattr	= ext4_setattr,4238	.getattr	= ext4_getattr,4239	.listxattr	= ext4_listxattr,4240	.get_inode_acl	= ext4_get_acl,4241	.set_acl	= ext4_set_acl,4242};4243