cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

index.c (55027B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *
      4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
      5 *
      6 */
      7
      8#include <linux/blkdev.h>
      9#include <linux/buffer_head.h>
     10#include <linux/fs.h>
     11#include <linux/kernel.h>
     12
     13#include "debug.h"
     14#include "ntfs.h"
     15#include "ntfs_fs.h"
     16
     17static const struct INDEX_NAMES {
     18	const __le16 *name;
     19	u8 name_len;
     20} s_index_names[INDEX_MUTEX_TOTAL] = {
     21	{ I30_NAME, ARRAY_SIZE(I30_NAME) }, { SII_NAME, ARRAY_SIZE(SII_NAME) },
     22	{ SDH_NAME, ARRAY_SIZE(SDH_NAME) }, { SO_NAME, ARRAY_SIZE(SO_NAME) },
     23	{ SQ_NAME, ARRAY_SIZE(SQ_NAME) },   { SR_NAME, ARRAY_SIZE(SR_NAME) },
     24};
     25
     26/*
     27 * cmp_fnames - Compare two names in index.
     28 *
     29 * if l1 != 0
     30 *   Both names are little endian on-disk ATTR_FILE_NAME structs.
     31 * else
     32 *   key1 - cpu_str, key2 - ATTR_FILE_NAME
     33 */
     34static int cmp_fnames(const void *key1, size_t l1, const void *key2, size_t l2,
     35		      const void *data)
     36{
     37	const struct ATTR_FILE_NAME *f2 = key2;
     38	const struct ntfs_sb_info *sbi = data;
     39	const struct ATTR_FILE_NAME *f1;
     40	u16 fsize2;
     41	bool both_case;
     42
     43	if (l2 <= offsetof(struct ATTR_FILE_NAME, name))
     44		return -1;
     45
     46	fsize2 = fname_full_size(f2);
     47	if (l2 < fsize2)
     48		return -1;
     49
     50	both_case = f2->type != FILE_NAME_DOS /*&& !sbi->options.nocase*/;
     51	if (!l1) {
     52		const struct le_str *s2 = (struct le_str *)&f2->name_len;
     53
     54		/*
     55		 * If names are equal (case insensitive)
     56		 * try to compare it case sensitive.
     57		 */
     58		return ntfs_cmp_names_cpu(key1, s2, sbi->upcase, both_case);
     59	}
     60
     61	f1 = key1;
     62	return ntfs_cmp_names(f1->name, f1->name_len, f2->name, f2->name_len,
     63			      sbi->upcase, both_case);
     64}
     65
     66/*
     67 * cmp_uint - $SII of $Secure and $Q of Quota
     68 */
     69static int cmp_uint(const void *key1, size_t l1, const void *key2, size_t l2,
     70		    const void *data)
     71{
     72	const u32 *k1 = key1;
     73	const u32 *k2 = key2;
     74
     75	if (l2 < sizeof(u32))
     76		return -1;
     77
     78	if (*k1 < *k2)
     79		return -1;
     80	if (*k1 > *k2)
     81		return 1;
     82	return 0;
     83}
     84
     85/*
     86 * cmp_sdh - $SDH of $Secure
     87 */
     88static int cmp_sdh(const void *key1, size_t l1, const void *key2, size_t l2,
     89		   const void *data)
     90{
     91	const struct SECURITY_KEY *k1 = key1;
     92	const struct SECURITY_KEY *k2 = key2;
     93	u32 t1, t2;
     94
     95	if (l2 < sizeof(struct SECURITY_KEY))
     96		return -1;
     97
     98	t1 = le32_to_cpu(k1->hash);
     99	t2 = le32_to_cpu(k2->hash);
    100
    101	/* First value is a hash value itself. */
    102	if (t1 < t2)
    103		return -1;
    104	if (t1 > t2)
    105		return 1;
    106
    107	/* Second value is security Id. */
    108	if (data) {
    109		t1 = le32_to_cpu(k1->sec_id);
    110		t2 = le32_to_cpu(k2->sec_id);
    111		if (t1 < t2)
    112			return -1;
    113		if (t1 > t2)
    114			return 1;
    115	}
    116
    117	return 0;
    118}
    119
    120/*
    121 * cmp_uints - $O of ObjId and "$R" for Reparse.
    122 */
    123static int cmp_uints(const void *key1, size_t l1, const void *key2, size_t l2,
    124		     const void *data)
    125{
    126	const __le32 *k1 = key1;
    127	const __le32 *k2 = key2;
    128	size_t count;
    129
    130	if ((size_t)data == 1) {
    131		/*
    132		 * ni_delete_all -> ntfs_remove_reparse ->
    133		 * delete all with this reference.
    134		 * k1, k2 - pointers to REPARSE_KEY
    135		 */
    136
    137		k1 += 1; // Skip REPARSE_KEY.ReparseTag
    138		k2 += 1; // Skip REPARSE_KEY.ReparseTag
    139		if (l2 <= sizeof(int))
    140			return -1;
    141		l2 -= sizeof(int);
    142		if (l1 <= sizeof(int))
    143			return 1;
    144		l1 -= sizeof(int);
    145	}
    146
    147	if (l2 < sizeof(int))
    148		return -1;
    149
    150	for (count = min(l1, l2) >> 2; count > 0; --count, ++k1, ++k2) {
    151		u32 t1 = le32_to_cpu(*k1);
    152		u32 t2 = le32_to_cpu(*k2);
    153
    154		if (t1 > t2)
    155			return 1;
    156		if (t1 < t2)
    157			return -1;
    158	}
    159
    160	if (l1 > l2)
    161		return 1;
    162	if (l1 < l2)
    163		return -1;
    164
    165	return 0;
    166}
    167
    168static inline NTFS_CMP_FUNC get_cmp_func(const struct INDEX_ROOT *root)
    169{
    170	switch (root->type) {
    171	case ATTR_NAME:
    172		if (root->rule == NTFS_COLLATION_TYPE_FILENAME)
    173			return &cmp_fnames;
    174		break;
    175	case ATTR_ZERO:
    176		switch (root->rule) {
    177		case NTFS_COLLATION_TYPE_UINT:
    178			return &cmp_uint;
    179		case NTFS_COLLATION_TYPE_SECURITY_HASH:
    180			return &cmp_sdh;
    181		case NTFS_COLLATION_TYPE_UINTS:
    182			return &cmp_uints;
    183		default:
    184			break;
    185		}
    186		break;
    187	default:
    188		break;
    189	}
    190
    191	return NULL;
    192}
    193
    194struct bmp_buf {
    195	struct ATTRIB *b;
    196	struct mft_inode *mi;
    197	struct buffer_head *bh;
    198	ulong *buf;
    199	size_t bit;
    200	u32 nbits;
    201	u64 new_valid;
    202};
    203
    204static int bmp_buf_get(struct ntfs_index *indx, struct ntfs_inode *ni,
    205		       size_t bit, struct bmp_buf *bbuf)
    206{
    207	struct ATTRIB *b;
    208	size_t data_size, valid_size, vbo, off = bit >> 3;
    209	struct ntfs_sb_info *sbi = ni->mi.sbi;
    210	CLST vcn = off >> sbi->cluster_bits;
    211	struct ATTR_LIST_ENTRY *le = NULL;
    212	struct buffer_head *bh;
    213	struct super_block *sb;
    214	u32 blocksize;
    215	const struct INDEX_NAMES *in = &s_index_names[indx->type];
    216
    217	bbuf->bh = NULL;
    218
    219	b = ni_find_attr(ni, NULL, &le, ATTR_BITMAP, in->name, in->name_len,
    220			 &vcn, &bbuf->mi);
    221	bbuf->b = b;
    222	if (!b)
    223		return -EINVAL;
    224
    225	if (!b->non_res) {
    226		data_size = le32_to_cpu(b->res.data_size);
    227
    228		if (off >= data_size)
    229			return -EINVAL;
    230
    231		bbuf->buf = (ulong *)resident_data(b);
    232		bbuf->bit = 0;
    233		bbuf->nbits = data_size * 8;
    234
    235		return 0;
    236	}
    237
    238	data_size = le64_to_cpu(b->nres.data_size);
    239	if (WARN_ON(off >= data_size)) {
    240		/* Looks like filesystem error. */
    241		return -EINVAL;
    242	}
    243
    244	valid_size = le64_to_cpu(b->nres.valid_size);
    245
    246	bh = ntfs_bread_run(sbi, &indx->bitmap_run, off);
    247	if (!bh)
    248		return -EIO;
    249
    250	if (IS_ERR(bh))
    251		return PTR_ERR(bh);
    252
    253	bbuf->bh = bh;
    254
    255	if (buffer_locked(bh))
    256		__wait_on_buffer(bh);
    257
    258	lock_buffer(bh);
    259
    260	sb = sbi->sb;
    261	blocksize = sb->s_blocksize;
    262
    263	vbo = off & ~(size_t)sbi->block_mask;
    264
    265	bbuf->new_valid = vbo + blocksize;
    266	if (bbuf->new_valid <= valid_size)
    267		bbuf->new_valid = 0;
    268	else if (bbuf->new_valid > data_size)
    269		bbuf->new_valid = data_size;
    270
    271	if (vbo >= valid_size) {
    272		memset(bh->b_data, 0, blocksize);
    273	} else if (vbo + blocksize > valid_size) {
    274		u32 voff = valid_size & sbi->block_mask;
    275
    276		memset(bh->b_data + voff, 0, blocksize - voff);
    277	}
    278
    279	bbuf->buf = (ulong *)bh->b_data;
    280	bbuf->bit = 8 * (off & ~(size_t)sbi->block_mask);
    281	bbuf->nbits = 8 * blocksize;
    282
    283	return 0;
    284}
    285
    286static void bmp_buf_put(struct bmp_buf *bbuf, bool dirty)
    287{
    288	struct buffer_head *bh = bbuf->bh;
    289	struct ATTRIB *b = bbuf->b;
    290
    291	if (!bh) {
    292		if (b && !b->non_res && dirty)
    293			bbuf->mi->dirty = true;
    294		return;
    295	}
    296
    297	if (!dirty)
    298		goto out;
    299
    300	if (bbuf->new_valid) {
    301		b->nres.valid_size = cpu_to_le64(bbuf->new_valid);
    302		bbuf->mi->dirty = true;
    303	}
    304
    305	set_buffer_uptodate(bh);
    306	mark_buffer_dirty(bh);
    307
    308out:
    309	unlock_buffer(bh);
    310	put_bh(bh);
    311}
    312
    313/*
    314 * indx_mark_used - Mark the bit @bit as used.
    315 */
    316static int indx_mark_used(struct ntfs_index *indx, struct ntfs_inode *ni,
    317			  size_t bit)
    318{
    319	int err;
    320	struct bmp_buf bbuf;
    321
    322	err = bmp_buf_get(indx, ni, bit, &bbuf);
    323	if (err)
    324		return err;
    325
    326	__set_bit(bit - bbuf.bit, bbuf.buf);
    327
    328	bmp_buf_put(&bbuf, true);
    329
    330	return 0;
    331}
    332
    333/*
    334 * indx_mark_free - Mark the bit @bit as free.
    335 */
    336static int indx_mark_free(struct ntfs_index *indx, struct ntfs_inode *ni,
    337			  size_t bit)
    338{
    339	int err;
    340	struct bmp_buf bbuf;
    341
    342	err = bmp_buf_get(indx, ni, bit, &bbuf);
    343	if (err)
    344		return err;
    345
    346	__clear_bit(bit - bbuf.bit, bbuf.buf);
    347
    348	bmp_buf_put(&bbuf, true);
    349
    350	return 0;
    351}
    352
    353/*
    354 * scan_nres_bitmap
    355 *
    356 * If ntfs_readdir calls this function (indx_used_bit -> scan_nres_bitmap),
    357 * inode is shared locked and no ni_lock.
    358 * Use rw_semaphore for read/write access to bitmap_run.
    359 */
    360static int scan_nres_bitmap(struct ntfs_inode *ni, struct ATTRIB *bitmap,
    361			    struct ntfs_index *indx, size_t from,
    362			    bool (*fn)(const ulong *buf, u32 bit, u32 bits,
    363				       size_t *ret),
    364			    size_t *ret)
    365{
    366	struct ntfs_sb_info *sbi = ni->mi.sbi;
    367	struct super_block *sb = sbi->sb;
    368	struct runs_tree *run = &indx->bitmap_run;
    369	struct rw_semaphore *lock = &indx->run_lock;
    370	u32 nbits = sb->s_blocksize * 8;
    371	u32 blocksize = sb->s_blocksize;
    372	u64 valid_size = le64_to_cpu(bitmap->nres.valid_size);
    373	u64 data_size = le64_to_cpu(bitmap->nres.data_size);
    374	sector_t eblock = bytes_to_block(sb, data_size);
    375	size_t vbo = from >> 3;
    376	sector_t blk = (vbo & sbi->cluster_mask) >> sb->s_blocksize_bits;
    377	sector_t vblock = vbo >> sb->s_blocksize_bits;
    378	sector_t blen, block;
    379	CLST lcn, clen, vcn, vcn_next;
    380	size_t idx;
    381	struct buffer_head *bh;
    382	bool ok;
    383
    384	*ret = MINUS_ONE_T;
    385
    386	if (vblock >= eblock)
    387		return 0;
    388
    389	from &= nbits - 1;
    390	vcn = vbo >> sbi->cluster_bits;
    391
    392	down_read(lock);
    393	ok = run_lookup_entry(run, vcn, &lcn, &clen, &idx);
    394	up_read(lock);
    395
    396next_run:
    397	if (!ok) {
    398		int err;
    399		const struct INDEX_NAMES *name = &s_index_names[indx->type];
    400
    401		down_write(lock);
    402		err = attr_load_runs_vcn(ni, ATTR_BITMAP, name->name,
    403					 name->name_len, run, vcn);
    404		up_write(lock);
    405		if (err)
    406			return err;
    407		down_read(lock);
    408		ok = run_lookup_entry(run, vcn, &lcn, &clen, &idx);
    409		up_read(lock);
    410		if (!ok)
    411			return -EINVAL;
    412	}
    413
    414	blen = (sector_t)clen * sbi->blocks_per_cluster;
    415	block = (sector_t)lcn * sbi->blocks_per_cluster;
    416
    417	for (; blk < blen; blk++, from = 0) {
    418		bh = ntfs_bread(sb, block + blk);
    419		if (!bh)
    420			return -EIO;
    421
    422		vbo = (u64)vblock << sb->s_blocksize_bits;
    423		if (vbo >= valid_size) {
    424			memset(bh->b_data, 0, blocksize);
    425		} else if (vbo + blocksize > valid_size) {
    426			u32 voff = valid_size & sbi->block_mask;
    427
    428			memset(bh->b_data + voff, 0, blocksize - voff);
    429		}
    430
    431		if (vbo + blocksize > data_size)
    432			nbits = 8 * (data_size - vbo);
    433
    434		ok = nbits > from ? (*fn)((ulong *)bh->b_data, from, nbits, ret)
    435				  : false;
    436		put_bh(bh);
    437
    438		if (ok) {
    439			*ret += 8 * vbo;
    440			return 0;
    441		}
    442
    443		if (++vblock >= eblock) {
    444			*ret = MINUS_ONE_T;
    445			return 0;
    446		}
    447	}
    448	blk = 0;
    449	vcn_next = vcn + clen;
    450	down_read(lock);
    451	ok = run_get_entry(run, ++idx, &vcn, &lcn, &clen) && vcn == vcn_next;
    452	if (!ok)
    453		vcn = vcn_next;
    454	up_read(lock);
    455	goto next_run;
    456}
    457
    458static bool scan_for_free(const ulong *buf, u32 bit, u32 bits, size_t *ret)
    459{
    460	size_t pos = find_next_zero_bit(buf, bits, bit);
    461
    462	if (pos >= bits)
    463		return false;
    464	*ret = pos;
    465	return true;
    466}
    467
    468/*
    469 * indx_find_free - Look for free bit.
    470 *
    471 * Return: -1 if no free bits.
    472 */
    473static int indx_find_free(struct ntfs_index *indx, struct ntfs_inode *ni,
    474			  size_t *bit, struct ATTRIB **bitmap)
    475{
    476	struct ATTRIB *b;
    477	struct ATTR_LIST_ENTRY *le = NULL;
    478	const struct INDEX_NAMES *in = &s_index_names[indx->type];
    479	int err;
    480
    481	b = ni_find_attr(ni, NULL, &le, ATTR_BITMAP, in->name, in->name_len,
    482			 NULL, NULL);
    483
    484	if (!b)
    485		return -ENOENT;
    486
    487	*bitmap = b;
    488	*bit = MINUS_ONE_T;
    489
    490	if (!b->non_res) {
    491		u32 nbits = 8 * le32_to_cpu(b->res.data_size);
    492		size_t pos = find_next_zero_bit(resident_data(b), nbits, 0);
    493
    494		if (pos < nbits)
    495			*bit = pos;
    496	} else {
    497		err = scan_nres_bitmap(ni, b, indx, 0, &scan_for_free, bit);
    498
    499		if (err)
    500			return err;
    501	}
    502
    503	return 0;
    504}
    505
    506static bool scan_for_used(const ulong *buf, u32 bit, u32 bits, size_t *ret)
    507{
    508	size_t pos = find_next_bit(buf, bits, bit);
    509
    510	if (pos >= bits)
    511		return false;
    512	*ret = pos;
    513	return true;
    514}
    515
    516/*
    517 * indx_used_bit - Look for used bit.
    518 *
    519 * Return: MINUS_ONE_T if no used bits.
    520 */
    521int indx_used_bit(struct ntfs_index *indx, struct ntfs_inode *ni, size_t *bit)
    522{
    523	struct ATTRIB *b;
    524	struct ATTR_LIST_ENTRY *le = NULL;
    525	size_t from = *bit;
    526	const struct INDEX_NAMES *in = &s_index_names[indx->type];
    527	int err;
    528
    529	b = ni_find_attr(ni, NULL, &le, ATTR_BITMAP, in->name, in->name_len,
    530			 NULL, NULL);
    531
    532	if (!b)
    533		return -ENOENT;
    534
    535	*bit = MINUS_ONE_T;
    536
    537	if (!b->non_res) {
    538		u32 nbits = le32_to_cpu(b->res.data_size) * 8;
    539		size_t pos = find_next_bit(resident_data(b), nbits, from);
    540
    541		if (pos < nbits)
    542			*bit = pos;
    543	} else {
    544		err = scan_nres_bitmap(ni, b, indx, from, &scan_for_used, bit);
    545		if (err)
    546			return err;
    547	}
    548
    549	return 0;
    550}
    551
    552/*
    553 * hdr_find_split
    554 *
    555 * Find a point at which the index allocation buffer would like to be split.
    556 * NOTE: This function should never return 'END' entry NULL returns on error.
    557 */
    558static const struct NTFS_DE *hdr_find_split(const struct INDEX_HDR *hdr)
    559{
    560	size_t o;
    561	const struct NTFS_DE *e = hdr_first_de(hdr);
    562	u32 used_2 = le32_to_cpu(hdr->used) >> 1;
    563	u16 esize;
    564
    565	if (!e || de_is_last(e))
    566		return NULL;
    567
    568	esize = le16_to_cpu(e->size);
    569	for (o = le32_to_cpu(hdr->de_off) + esize; o < used_2; o += esize) {
    570		const struct NTFS_DE *p = e;
    571
    572		e = Add2Ptr(hdr, o);
    573
    574		/* We must not return END entry. */
    575		if (de_is_last(e))
    576			return p;
    577
    578		esize = le16_to_cpu(e->size);
    579	}
    580
    581	return e;
    582}
    583
    584/*
    585 * hdr_insert_head - Insert some entries at the beginning of the buffer.
    586 *
    587 * It is used to insert entries into a newly-created buffer.
    588 */
    589static const struct NTFS_DE *hdr_insert_head(struct INDEX_HDR *hdr,
    590					     const void *ins, u32 ins_bytes)
    591{
    592	u32 to_move;
    593	struct NTFS_DE *e = hdr_first_de(hdr);
    594	u32 used = le32_to_cpu(hdr->used);
    595
    596	if (!e)
    597		return NULL;
    598
    599	/* Now we just make room for the inserted entries and jam it in. */
    600	to_move = used - le32_to_cpu(hdr->de_off);
    601	memmove(Add2Ptr(e, ins_bytes), e, to_move);
    602	memcpy(e, ins, ins_bytes);
    603	hdr->used = cpu_to_le32(used + ins_bytes);
    604
    605	return e;
    606}
    607
    608void fnd_clear(struct ntfs_fnd *fnd)
    609{
    610	int i;
    611
    612	for (i = 0; i < fnd->level; i++) {
    613		struct indx_node *n = fnd->nodes[i];
    614
    615		if (!n)
    616			continue;
    617
    618		put_indx_node(n);
    619		fnd->nodes[i] = NULL;
    620	}
    621	fnd->level = 0;
    622	fnd->root_de = NULL;
    623}
    624
    625static int fnd_push(struct ntfs_fnd *fnd, struct indx_node *n,
    626		    struct NTFS_DE *e)
    627{
    628	int i;
    629
    630	i = fnd->level;
    631	if (i < 0 || i >= ARRAY_SIZE(fnd->nodes))
    632		return -EINVAL;
    633	fnd->nodes[i] = n;
    634	fnd->de[i] = e;
    635	fnd->level += 1;
    636	return 0;
    637}
    638
    639static struct indx_node *fnd_pop(struct ntfs_fnd *fnd)
    640{
    641	struct indx_node *n;
    642	int i = fnd->level;
    643
    644	i -= 1;
    645	n = fnd->nodes[i];
    646	fnd->nodes[i] = NULL;
    647	fnd->level = i;
    648
    649	return n;
    650}
    651
    652static bool fnd_is_empty(struct ntfs_fnd *fnd)
    653{
    654	if (!fnd->level)
    655		return !fnd->root_de;
    656
    657	return !fnd->de[fnd->level - 1];
    658}
    659
    660/*
    661 * hdr_find_e - Locate an entry the index buffer.
    662 *
    663 * If no matching entry is found, it returns the first entry which is greater
    664 * than the desired entry If the search key is greater than all the entries the
    665 * buffer, it returns the 'end' entry. This function does a binary search of the
    666 * current index buffer, for the first entry that is <= to the search value.
    667 *
    668 * Return: NULL if error.
    669 */
    670static struct NTFS_DE *hdr_find_e(const struct ntfs_index *indx,
    671				  const struct INDEX_HDR *hdr, const void *key,
    672				  size_t key_len, const void *ctx, int *diff)
    673{
    674	struct NTFS_DE *e, *found = NULL;
    675	NTFS_CMP_FUNC cmp = indx->cmp;
    676	int min_idx = 0, mid_idx, max_idx = 0;
    677	int diff2;
    678	int table_size = 8;
    679	u32 e_size, e_key_len;
    680	u32 end = le32_to_cpu(hdr->used);
    681	u32 off = le32_to_cpu(hdr->de_off);
    682	u16 offs[128];
    683
    684fill_table:
    685	if (off + sizeof(struct NTFS_DE) > end)
    686		return NULL;
    687
    688	e = Add2Ptr(hdr, off);
    689	e_size = le16_to_cpu(e->size);
    690
    691	if (e_size < sizeof(struct NTFS_DE) || off + e_size > end)
    692		return NULL;
    693
    694	if (!de_is_last(e)) {
    695		offs[max_idx] = off;
    696		off += e_size;
    697
    698		max_idx++;
    699		if (max_idx < table_size)
    700			goto fill_table;
    701
    702		max_idx--;
    703	}
    704
    705binary_search:
    706	e_key_len = le16_to_cpu(e->key_size);
    707
    708	diff2 = (*cmp)(key, key_len, e + 1, e_key_len, ctx);
    709	if (diff2 > 0) {
    710		if (found) {
    711			min_idx = mid_idx + 1;
    712		} else {
    713			if (de_is_last(e))
    714				return NULL;
    715
    716			max_idx = 0;
    717			table_size = min(table_size * 2,
    718					 (int)ARRAY_SIZE(offs));
    719			goto fill_table;
    720		}
    721	} else if (diff2 < 0) {
    722		if (found)
    723			max_idx = mid_idx - 1;
    724		else
    725			max_idx--;
    726
    727		found = e;
    728	} else {
    729		*diff = 0;
    730		return e;
    731	}
    732
    733	if (min_idx > max_idx) {
    734		*diff = -1;
    735		return found;
    736	}
    737
    738	mid_idx = (min_idx + max_idx) >> 1;
    739	e = Add2Ptr(hdr, offs[mid_idx]);
    740
    741	goto binary_search;
    742}
    743
    744/*
    745 * hdr_insert_de - Insert an index entry into the buffer.
    746 *
    747 * 'before' should be a pointer previously returned from hdr_find_e.
    748 */
    749static struct NTFS_DE *hdr_insert_de(const struct ntfs_index *indx,
    750				     struct INDEX_HDR *hdr,
    751				     const struct NTFS_DE *de,
    752				     struct NTFS_DE *before, const void *ctx)
    753{
    754	int diff;
    755	size_t off = PtrOffset(hdr, before);
    756	u32 used = le32_to_cpu(hdr->used);
    757	u32 total = le32_to_cpu(hdr->total);
    758	u16 de_size = le16_to_cpu(de->size);
    759
    760	/* First, check to see if there's enough room. */
    761	if (used + de_size > total)
    762		return NULL;
    763
    764	/* We know there's enough space, so we know we'll succeed. */
    765	if (before) {
    766		/* Check that before is inside Index. */
    767		if (off >= used || off < le32_to_cpu(hdr->de_off) ||
    768		    off + le16_to_cpu(before->size) > total) {
    769			return NULL;
    770		}
    771		goto ok;
    772	}
    773	/* No insert point is applied. Get it manually. */
    774	before = hdr_find_e(indx, hdr, de + 1, le16_to_cpu(de->key_size), ctx,
    775			    &diff);
    776	if (!before)
    777		return NULL;
    778	off = PtrOffset(hdr, before);
    779
    780ok:
    781	/* Now we just make room for the entry and jam it in. */
    782	memmove(Add2Ptr(before, de_size), before, used - off);
    783
    784	hdr->used = cpu_to_le32(used + de_size);
    785	memcpy(before, de, de_size);
    786
    787	return before;
    788}
    789
    790/*
    791 * hdr_delete_de - Remove an entry from the index buffer.
    792 */
    793static inline struct NTFS_DE *hdr_delete_de(struct INDEX_HDR *hdr,
    794					    struct NTFS_DE *re)
    795{
    796	u32 used = le32_to_cpu(hdr->used);
    797	u16 esize = le16_to_cpu(re->size);
    798	u32 off = PtrOffset(hdr, re);
    799	int bytes = used - (off + esize);
    800
    801	if (off >= used || esize < sizeof(struct NTFS_DE) ||
    802	    bytes < sizeof(struct NTFS_DE))
    803		return NULL;
    804
    805	hdr->used = cpu_to_le32(used - esize);
    806	memmove(re, Add2Ptr(re, esize), bytes);
    807
    808	return re;
    809}
    810
    811void indx_clear(struct ntfs_index *indx)
    812{
    813	run_close(&indx->alloc_run);
    814	run_close(&indx->bitmap_run);
    815}
    816
    817int indx_init(struct ntfs_index *indx, struct ntfs_sb_info *sbi,
    818	      const struct ATTRIB *attr, enum index_mutex_classed type)
    819{
    820	u32 t32;
    821	const struct INDEX_ROOT *root = resident_data(attr);
    822
    823	/* Check root fields. */
    824	if (!root->index_block_clst)
    825		return -EINVAL;
    826
    827	indx->type = type;
    828	indx->idx2vbn_bits = __ffs(root->index_block_clst);
    829
    830	t32 = le32_to_cpu(root->index_block_size);
    831	indx->index_bits = blksize_bits(t32);
    832
    833	/* Check index record size. */
    834	if (t32 < sbi->cluster_size) {
    835		/* Index record is smaller than a cluster, use 512 blocks. */
    836		if (t32 != root->index_block_clst * SECTOR_SIZE)
    837			return -EINVAL;
    838
    839		/* Check alignment to a cluster. */
    840		if ((sbi->cluster_size >> SECTOR_SHIFT) &
    841		    (root->index_block_clst - 1)) {
    842			return -EINVAL;
    843		}
    844
    845		indx->vbn2vbo_bits = SECTOR_SHIFT;
    846	} else {
    847		/* Index record must be a multiple of cluster size. */
    848		if (t32 != root->index_block_clst << sbi->cluster_bits)
    849			return -EINVAL;
    850
    851		indx->vbn2vbo_bits = sbi->cluster_bits;
    852	}
    853
    854	init_rwsem(&indx->run_lock);
    855
    856	indx->cmp = get_cmp_func(root);
    857	return indx->cmp ? 0 : -EINVAL;
    858}
    859
    860static struct indx_node *indx_new(struct ntfs_index *indx,
    861				  struct ntfs_inode *ni, CLST vbn,
    862				  const __le64 *sub_vbn)
    863{
    864	int err;
    865	struct NTFS_DE *e;
    866	struct indx_node *r;
    867	struct INDEX_HDR *hdr;
    868	struct INDEX_BUFFER *index;
    869	u64 vbo = (u64)vbn << indx->vbn2vbo_bits;
    870	u32 bytes = 1u << indx->index_bits;
    871	u16 fn;
    872	u32 eo;
    873
    874	r = kzalloc(sizeof(struct indx_node), GFP_NOFS);
    875	if (!r)
    876		return ERR_PTR(-ENOMEM);
    877
    878	index = kzalloc(bytes, GFP_NOFS);
    879	if (!index) {
    880		kfree(r);
    881		return ERR_PTR(-ENOMEM);
    882	}
    883
    884	err = ntfs_get_bh(ni->mi.sbi, &indx->alloc_run, vbo, bytes, &r->nb);
    885
    886	if (err) {
    887		kfree(index);
    888		kfree(r);
    889		return ERR_PTR(err);
    890	}
    891
    892	/* Create header. */
    893	index->rhdr.sign = NTFS_INDX_SIGNATURE;
    894	index->rhdr.fix_off = cpu_to_le16(sizeof(struct INDEX_BUFFER)); // 0x28
    895	fn = (bytes >> SECTOR_SHIFT) + 1; // 9
    896	index->rhdr.fix_num = cpu_to_le16(fn);
    897	index->vbn = cpu_to_le64(vbn);
    898	hdr = &index->ihdr;
    899	eo = ALIGN(sizeof(struct INDEX_BUFFER) + fn * sizeof(short), 8);
    900	hdr->de_off = cpu_to_le32(eo);
    901
    902	e = Add2Ptr(hdr, eo);
    903
    904	if (sub_vbn) {
    905		e->flags = NTFS_IE_LAST | NTFS_IE_HAS_SUBNODES;
    906		e->size = cpu_to_le16(sizeof(struct NTFS_DE) + sizeof(u64));
    907		hdr->used =
    908			cpu_to_le32(eo + sizeof(struct NTFS_DE) + sizeof(u64));
    909		de_set_vbn_le(e, *sub_vbn);
    910		hdr->flags = 1;
    911	} else {
    912		e->size = cpu_to_le16(sizeof(struct NTFS_DE));
    913		hdr->used = cpu_to_le32(eo + sizeof(struct NTFS_DE));
    914		e->flags = NTFS_IE_LAST;
    915	}
    916
    917	hdr->total = cpu_to_le32(bytes - offsetof(struct INDEX_BUFFER, ihdr));
    918
    919	r->index = index;
    920	return r;
    921}
    922
    923struct INDEX_ROOT *indx_get_root(struct ntfs_index *indx, struct ntfs_inode *ni,
    924				 struct ATTRIB **attr, struct mft_inode **mi)
    925{
    926	struct ATTR_LIST_ENTRY *le = NULL;
    927	struct ATTRIB *a;
    928	const struct INDEX_NAMES *in = &s_index_names[indx->type];
    929
    930	a = ni_find_attr(ni, NULL, &le, ATTR_ROOT, in->name, in->name_len, NULL,
    931			 mi);
    932	if (!a)
    933		return NULL;
    934
    935	if (attr)
    936		*attr = a;
    937
    938	return resident_data_ex(a, sizeof(struct INDEX_ROOT));
    939}
    940
    941static int indx_write(struct ntfs_index *indx, struct ntfs_inode *ni,
    942		      struct indx_node *node, int sync)
    943{
    944	struct INDEX_BUFFER *ib = node->index;
    945
    946	return ntfs_write_bh(ni->mi.sbi, &ib->rhdr, &node->nb, sync);
    947}
    948
    949/*
    950 * indx_read
    951 *
    952 * If ntfs_readdir calls this function
    953 * inode is shared locked and no ni_lock.
    954 * Use rw_semaphore for read/write access to alloc_run.
    955 */
    956int indx_read(struct ntfs_index *indx, struct ntfs_inode *ni, CLST vbn,
    957	      struct indx_node **node)
    958{
    959	int err;
    960	struct INDEX_BUFFER *ib;
    961	struct runs_tree *run = &indx->alloc_run;
    962	struct rw_semaphore *lock = &indx->run_lock;
    963	u64 vbo = (u64)vbn << indx->vbn2vbo_bits;
    964	u32 bytes = 1u << indx->index_bits;
    965	struct indx_node *in = *node;
    966	const struct INDEX_NAMES *name;
    967
    968	if (!in) {
    969		in = kzalloc(sizeof(struct indx_node), GFP_NOFS);
    970		if (!in)
    971			return -ENOMEM;
    972	} else {
    973		nb_put(&in->nb);
    974	}
    975
    976	ib = in->index;
    977	if (!ib) {
    978		ib = kmalloc(bytes, GFP_NOFS);
    979		if (!ib) {
    980			err = -ENOMEM;
    981			goto out;
    982		}
    983	}
    984
    985	down_read(lock);
    986	err = ntfs_read_bh(ni->mi.sbi, run, vbo, &ib->rhdr, bytes, &in->nb);
    987	up_read(lock);
    988	if (!err)
    989		goto ok;
    990
    991	if (err == -E_NTFS_FIXUP)
    992		goto ok;
    993
    994	if (err != -ENOENT)
    995		goto out;
    996
    997	name = &s_index_names[indx->type];
    998	down_write(lock);
    999	err = attr_load_runs_range(ni, ATTR_ALLOC, name->name, name->name_len,
   1000				   run, vbo, vbo + bytes);
   1001	up_write(lock);
   1002	if (err)
   1003		goto out;
   1004
   1005	down_read(lock);
   1006	err = ntfs_read_bh(ni->mi.sbi, run, vbo, &ib->rhdr, bytes, &in->nb);
   1007	up_read(lock);
   1008	if (err == -E_NTFS_FIXUP)
   1009		goto ok;
   1010
   1011	if (err)
   1012		goto out;
   1013
   1014ok:
   1015	if (err == -E_NTFS_FIXUP) {
   1016		ntfs_write_bh(ni->mi.sbi, &ib->rhdr, &in->nb, 0);
   1017		err = 0;
   1018	}
   1019
   1020	in->index = ib;
   1021	*node = in;
   1022
   1023out:
   1024	if (ib != in->index)
   1025		kfree(ib);
   1026
   1027	if (*node != in) {
   1028		nb_put(&in->nb);
   1029		kfree(in);
   1030	}
   1031
   1032	return err;
   1033}
   1034
   1035/*
   1036 * indx_find - Scan NTFS directory for given entry.
   1037 */
   1038int indx_find(struct ntfs_index *indx, struct ntfs_inode *ni,
   1039	      const struct INDEX_ROOT *root, const void *key, size_t key_len,
   1040	      const void *ctx, int *diff, struct NTFS_DE **entry,
   1041	      struct ntfs_fnd *fnd)
   1042{
   1043	int err;
   1044	struct NTFS_DE *e;
   1045	const struct INDEX_HDR *hdr;
   1046	struct indx_node *node;
   1047
   1048	if (!root)
   1049		root = indx_get_root(&ni->dir, ni, NULL, NULL);
   1050
   1051	if (!root) {
   1052		err = -EINVAL;
   1053		goto out;
   1054	}
   1055
   1056	hdr = &root->ihdr;
   1057
   1058	/* Check cache. */
   1059	e = fnd->level ? fnd->de[fnd->level - 1] : fnd->root_de;
   1060	if (e && !de_is_last(e) &&
   1061	    !(*indx->cmp)(key, key_len, e + 1, le16_to_cpu(e->key_size), ctx)) {
   1062		*entry = e;
   1063		*diff = 0;
   1064		return 0;
   1065	}
   1066
   1067	/* Soft finder reset. */
   1068	fnd_clear(fnd);
   1069
   1070	/* Lookup entry that is <= to the search value. */
   1071	e = hdr_find_e(indx, hdr, key, key_len, ctx, diff);
   1072	if (!e)
   1073		return -EINVAL;
   1074
   1075	fnd->root_de = e;
   1076	err = 0;
   1077
   1078	for (;;) {
   1079		node = NULL;
   1080		if (*diff >= 0 || !de_has_vcn_ex(e)) {
   1081			*entry = e;
   1082			goto out;
   1083		}
   1084
   1085		/* Read next level. */
   1086		err = indx_read(indx, ni, de_get_vbn(e), &node);
   1087		if (err)
   1088			goto out;
   1089
   1090		/* Lookup entry that is <= to the search value. */
   1091		e = hdr_find_e(indx, &node->index->ihdr, key, key_len, ctx,
   1092			       diff);
   1093		if (!e) {
   1094			err = -EINVAL;
   1095			put_indx_node(node);
   1096			goto out;
   1097		}
   1098
   1099		fnd_push(fnd, node, e);
   1100	}
   1101
   1102out:
   1103	return err;
   1104}
   1105
   1106int indx_find_sort(struct ntfs_index *indx, struct ntfs_inode *ni,
   1107		   const struct INDEX_ROOT *root, struct NTFS_DE **entry,
   1108		   struct ntfs_fnd *fnd)
   1109{
   1110	int err;
   1111	struct indx_node *n = NULL;
   1112	struct NTFS_DE *e;
   1113	size_t iter = 0;
   1114	int level = fnd->level;
   1115
   1116	if (!*entry) {
   1117		/* Start find. */
   1118		e = hdr_first_de(&root->ihdr);
   1119		if (!e)
   1120			return 0;
   1121		fnd_clear(fnd);
   1122		fnd->root_de = e;
   1123	} else if (!level) {
   1124		if (de_is_last(fnd->root_de)) {
   1125			*entry = NULL;
   1126			return 0;
   1127		}
   1128
   1129		e = hdr_next_de(&root->ihdr, fnd->root_de);
   1130		if (!e)
   1131			return -EINVAL;
   1132		fnd->root_de = e;
   1133	} else {
   1134		n = fnd->nodes[level - 1];
   1135		e = fnd->de[level - 1];
   1136
   1137		if (de_is_last(e))
   1138			goto pop_level;
   1139
   1140		e = hdr_next_de(&n->index->ihdr, e);
   1141		if (!e)
   1142			return -EINVAL;
   1143
   1144		fnd->de[level - 1] = e;
   1145	}
   1146
   1147	/* Just to avoid tree cycle. */
   1148next_iter:
   1149	if (iter++ >= 1000)
   1150		return -EINVAL;
   1151
   1152	while (de_has_vcn_ex(e)) {
   1153		if (le16_to_cpu(e->size) <
   1154		    sizeof(struct NTFS_DE) + sizeof(u64)) {
   1155			if (n) {
   1156				fnd_pop(fnd);
   1157				kfree(n);
   1158			}
   1159			return -EINVAL;
   1160		}
   1161
   1162		/* Read next level. */
   1163		err = indx_read(indx, ni, de_get_vbn(e), &n);
   1164		if (err)
   1165			return err;
   1166
   1167		/* Try next level. */
   1168		e = hdr_first_de(&n->index->ihdr);
   1169		if (!e) {
   1170			kfree(n);
   1171			return -EINVAL;
   1172		}
   1173
   1174		fnd_push(fnd, n, e);
   1175	}
   1176
   1177	if (le16_to_cpu(e->size) > sizeof(struct NTFS_DE)) {
   1178		*entry = e;
   1179		return 0;
   1180	}
   1181
   1182pop_level:
   1183	for (;;) {
   1184		if (!de_is_last(e))
   1185			goto next_iter;
   1186
   1187		/* Pop one level. */
   1188		if (n) {
   1189			fnd_pop(fnd);
   1190			kfree(n);
   1191		}
   1192
   1193		level = fnd->level;
   1194
   1195		if (level) {
   1196			n = fnd->nodes[level - 1];
   1197			e = fnd->de[level - 1];
   1198		} else if (fnd->root_de) {
   1199			n = NULL;
   1200			e = fnd->root_de;
   1201			fnd->root_de = NULL;
   1202		} else {
   1203			*entry = NULL;
   1204			return 0;
   1205		}
   1206
   1207		if (le16_to_cpu(e->size) > sizeof(struct NTFS_DE)) {
   1208			*entry = e;
   1209			if (!fnd->root_de)
   1210				fnd->root_de = e;
   1211			return 0;
   1212		}
   1213	}
   1214}
   1215
   1216int indx_find_raw(struct ntfs_index *indx, struct ntfs_inode *ni,
   1217		  const struct INDEX_ROOT *root, struct NTFS_DE **entry,
   1218		  size_t *off, struct ntfs_fnd *fnd)
   1219{
   1220	int err;
   1221	struct indx_node *n = NULL;
   1222	struct NTFS_DE *e = NULL;
   1223	struct NTFS_DE *e2;
   1224	size_t bit;
   1225	CLST next_used_vbn;
   1226	CLST next_vbn;
   1227	u32 record_size = ni->mi.sbi->record_size;
   1228
   1229	/* Use non sorted algorithm. */
   1230	if (!*entry) {
   1231		/* This is the first call. */
   1232		e = hdr_first_de(&root->ihdr);
   1233		if (!e)
   1234			return 0;
   1235		fnd_clear(fnd);
   1236		fnd->root_de = e;
   1237
   1238		/* The first call with setup of initial element. */
   1239		if (*off >= record_size) {
   1240			next_vbn = (((*off - record_size) >> indx->index_bits))
   1241				   << indx->idx2vbn_bits;
   1242			/* Jump inside cycle 'for'. */
   1243			goto next;
   1244		}
   1245
   1246		/* Start enumeration from root. */
   1247		*off = 0;
   1248	} else if (!fnd->root_de)
   1249		return -EINVAL;
   1250
   1251	for (;;) {
   1252		/* Check if current entry can be used. */
   1253		if (e && le16_to_cpu(e->size) > sizeof(struct NTFS_DE))
   1254			goto ok;
   1255
   1256		if (!fnd->level) {
   1257			/* Continue to enumerate root. */
   1258			if (!de_is_last(fnd->root_de)) {
   1259				e = hdr_next_de(&root->ihdr, fnd->root_de);
   1260				if (!e)
   1261					return -EINVAL;
   1262				fnd->root_de = e;
   1263				continue;
   1264			}
   1265
   1266			/* Start to enumerate indexes from 0. */
   1267			next_vbn = 0;
   1268		} else {
   1269			/* Continue to enumerate indexes. */
   1270			e2 = fnd->de[fnd->level - 1];
   1271
   1272			n = fnd->nodes[fnd->level - 1];
   1273
   1274			if (!de_is_last(e2)) {
   1275				e = hdr_next_de(&n->index->ihdr, e2);
   1276				if (!e)
   1277					return -EINVAL;
   1278				fnd->de[fnd->level - 1] = e;
   1279				continue;
   1280			}
   1281
   1282			/* Continue with next index. */
   1283			next_vbn = le64_to_cpu(n->index->vbn) +
   1284				   root->index_block_clst;
   1285		}
   1286
   1287next:
   1288		/* Release current index. */
   1289		if (n) {
   1290			fnd_pop(fnd);
   1291			put_indx_node(n);
   1292			n = NULL;
   1293		}
   1294
   1295		/* Skip all free indexes. */
   1296		bit = next_vbn >> indx->idx2vbn_bits;
   1297		err = indx_used_bit(indx, ni, &bit);
   1298		if (err == -ENOENT || bit == MINUS_ONE_T) {
   1299			/* No used indexes. */
   1300			*entry = NULL;
   1301			return 0;
   1302		}
   1303
   1304		next_used_vbn = bit << indx->idx2vbn_bits;
   1305
   1306		/* Read buffer into memory. */
   1307		err = indx_read(indx, ni, next_used_vbn, &n);
   1308		if (err)
   1309			return err;
   1310
   1311		e = hdr_first_de(&n->index->ihdr);
   1312		fnd_push(fnd, n, e);
   1313		if (!e)
   1314			return -EINVAL;
   1315	}
   1316
   1317ok:
   1318	/* Return offset to restore enumerator if necessary. */
   1319	if (!n) {
   1320		/* 'e' points in root, */
   1321		*off = PtrOffset(&root->ihdr, e);
   1322	} else {
   1323		/* 'e' points in index, */
   1324		*off = (le64_to_cpu(n->index->vbn) << indx->vbn2vbo_bits) +
   1325		       record_size + PtrOffset(&n->index->ihdr, e);
   1326	}
   1327
   1328	*entry = e;
   1329	return 0;
   1330}
   1331
   1332/*
   1333 * indx_create_allocate - Create "Allocation + Bitmap" attributes.
   1334 */
   1335static int indx_create_allocate(struct ntfs_index *indx, struct ntfs_inode *ni,
   1336				CLST *vbn)
   1337{
   1338	int err;
   1339	struct ntfs_sb_info *sbi = ni->mi.sbi;
   1340	struct ATTRIB *bitmap;
   1341	struct ATTRIB *alloc;
   1342	u32 data_size = 1u << indx->index_bits;
   1343	u32 alloc_size = ntfs_up_cluster(sbi, data_size);
   1344	CLST len = alloc_size >> sbi->cluster_bits;
   1345	const struct INDEX_NAMES *in = &s_index_names[indx->type];
   1346	CLST alen;
   1347	struct runs_tree run;
   1348
   1349	run_init(&run);
   1350
   1351	err = attr_allocate_clusters(sbi, &run, 0, 0, len, NULL, 0, &alen, 0,
   1352				     NULL);
   1353	if (err)
   1354		goto out;
   1355
   1356	err = ni_insert_nonresident(ni, ATTR_ALLOC, in->name, in->name_len,
   1357				    &run, 0, len, 0, &alloc, NULL);
   1358	if (err)
   1359		goto out1;
   1360
   1361	alloc->nres.valid_size = alloc->nres.data_size = cpu_to_le64(data_size);
   1362
   1363	err = ni_insert_resident(ni, bitmap_size(1), ATTR_BITMAP, in->name,
   1364				 in->name_len, &bitmap, NULL, NULL);
   1365	if (err)
   1366		goto out2;
   1367
   1368	if (in->name == I30_NAME) {
   1369		ni->vfs_inode.i_size = data_size;
   1370		inode_set_bytes(&ni->vfs_inode, alloc_size);
   1371	}
   1372
   1373	memcpy(&indx->alloc_run, &run, sizeof(run));
   1374
   1375	*vbn = 0;
   1376
   1377	return 0;
   1378
   1379out2:
   1380	mi_remove_attr(NULL, &ni->mi, alloc);
   1381
   1382out1:
   1383	run_deallocate(sbi, &run, false);
   1384
   1385out:
   1386	return err;
   1387}
   1388
   1389/*
   1390 * indx_add_allocate - Add clusters to index.
   1391 */
   1392static int indx_add_allocate(struct ntfs_index *indx, struct ntfs_inode *ni,
   1393			     CLST *vbn)
   1394{
   1395	int err;
   1396	size_t bit;
   1397	u64 data_size;
   1398	u64 bmp_size, bmp_size_v;
   1399	struct ATTRIB *bmp, *alloc;
   1400	struct mft_inode *mi;
   1401	const struct INDEX_NAMES *in = &s_index_names[indx->type];
   1402
   1403	err = indx_find_free(indx, ni, &bit, &bmp);
   1404	if (err)
   1405		goto out1;
   1406
   1407	if (bit != MINUS_ONE_T) {
   1408		bmp = NULL;
   1409	} else {
   1410		if (bmp->non_res) {
   1411			bmp_size = le64_to_cpu(bmp->nres.data_size);
   1412			bmp_size_v = le64_to_cpu(bmp->nres.valid_size);
   1413		} else {
   1414			bmp_size = bmp_size_v = le32_to_cpu(bmp->res.data_size);
   1415		}
   1416
   1417		bit = bmp_size << 3;
   1418	}
   1419
   1420	data_size = (u64)(bit + 1) << indx->index_bits;
   1421
   1422	if (bmp) {
   1423		/* Increase bitmap. */
   1424		err = attr_set_size(ni, ATTR_BITMAP, in->name, in->name_len,
   1425				    &indx->bitmap_run, bitmap_size(bit + 1),
   1426				    NULL, true, NULL);
   1427		if (err)
   1428			goto out1;
   1429	}
   1430
   1431	alloc = ni_find_attr(ni, NULL, NULL, ATTR_ALLOC, in->name, in->name_len,
   1432			     NULL, &mi);
   1433	if (!alloc) {
   1434		err = -EINVAL;
   1435		if (bmp)
   1436			goto out2;
   1437		goto out1;
   1438	}
   1439
   1440	/* Increase allocation. */
   1441	err = attr_set_size(ni, ATTR_ALLOC, in->name, in->name_len,
   1442			    &indx->alloc_run, data_size, &data_size, true,
   1443			    NULL);
   1444	if (err) {
   1445		if (bmp)
   1446			goto out2;
   1447		goto out1;
   1448	}
   1449
   1450	*vbn = bit << indx->idx2vbn_bits;
   1451
   1452	return 0;
   1453
   1454out2:
   1455	/* Ops. No space? */
   1456	attr_set_size(ni, ATTR_BITMAP, in->name, in->name_len,
   1457		      &indx->bitmap_run, bmp_size, &bmp_size_v, false, NULL);
   1458
   1459out1:
   1460	return err;
   1461}
   1462
   1463/*
   1464 * indx_insert_into_root - Attempt to insert an entry into the index root.
   1465 *
   1466 * @undo - True if we undoing previous remove.
   1467 * If necessary, it will twiddle the index b-tree.
   1468 */
   1469static int indx_insert_into_root(struct ntfs_index *indx, struct ntfs_inode *ni,
   1470				 const struct NTFS_DE *new_de,
   1471				 struct NTFS_DE *root_de, const void *ctx,
   1472				 struct ntfs_fnd *fnd, bool undo)
   1473{
   1474	int err = 0;
   1475	struct NTFS_DE *e, *e0, *re;
   1476	struct mft_inode *mi;
   1477	struct ATTRIB *attr;
   1478	struct INDEX_HDR *hdr;
   1479	struct indx_node *n;
   1480	CLST new_vbn;
   1481	__le64 *sub_vbn, t_vbn;
   1482	u16 new_de_size;
   1483	u32 hdr_used, hdr_total, asize, to_move;
   1484	u32 root_size, new_root_size;
   1485	struct ntfs_sb_info *sbi;
   1486	int ds_root;
   1487	struct INDEX_ROOT *root, *a_root;
   1488
   1489	/* Get the record this root placed in. */
   1490	root = indx_get_root(indx, ni, &attr, &mi);
   1491	if (!root)
   1492		return -EINVAL;
   1493
   1494	/*
   1495	 * Try easy case:
   1496	 * hdr_insert_de will succeed if there's
   1497	 * room the root for the new entry.
   1498	 */
   1499	hdr = &root->ihdr;
   1500	sbi = ni->mi.sbi;
   1501	new_de_size = le16_to_cpu(new_de->size);
   1502	hdr_used = le32_to_cpu(hdr->used);
   1503	hdr_total = le32_to_cpu(hdr->total);
   1504	asize = le32_to_cpu(attr->size);
   1505	root_size = le32_to_cpu(attr->res.data_size);
   1506
   1507	ds_root = new_de_size + hdr_used - hdr_total;
   1508
   1509	/* If 'undo' is set then reduce requirements. */
   1510	if ((undo || asize + ds_root < sbi->max_bytes_per_attr) &&
   1511	    mi_resize_attr(mi, attr, ds_root)) {
   1512		hdr->total = cpu_to_le32(hdr_total + ds_root);
   1513		e = hdr_insert_de(indx, hdr, new_de, root_de, ctx);
   1514		WARN_ON(!e);
   1515		fnd_clear(fnd);
   1516		fnd->root_de = e;
   1517
   1518		return 0;
   1519	}
   1520
   1521	/* Make a copy of root attribute to restore if error. */
   1522	a_root = kmemdup(attr, asize, GFP_NOFS);
   1523	if (!a_root)
   1524		return -ENOMEM;
   1525
   1526	/*
   1527	 * Copy all the non-end entries from
   1528	 * the index root to the new buffer.
   1529	 */
   1530	to_move = 0;
   1531	e0 = hdr_first_de(hdr);
   1532
   1533	/* Calculate the size to copy. */
   1534	for (e = e0;; e = hdr_next_de(hdr, e)) {
   1535		if (!e) {
   1536			err = -EINVAL;
   1537			goto out_free_root;
   1538		}
   1539
   1540		if (de_is_last(e))
   1541			break;
   1542		to_move += le16_to_cpu(e->size);
   1543	}
   1544
   1545	if (!to_move) {
   1546		re = NULL;
   1547	} else {
   1548		re = kmemdup(e0, to_move, GFP_NOFS);
   1549		if (!re) {
   1550			err = -ENOMEM;
   1551			goto out_free_root;
   1552		}
   1553	}
   1554
   1555	sub_vbn = NULL;
   1556	if (de_has_vcn(e)) {
   1557		t_vbn = de_get_vbn_le(e);
   1558		sub_vbn = &t_vbn;
   1559	}
   1560
   1561	new_root_size = sizeof(struct INDEX_ROOT) + sizeof(struct NTFS_DE) +
   1562			sizeof(u64);
   1563	ds_root = new_root_size - root_size;
   1564
   1565	if (ds_root > 0 && asize + ds_root > sbi->max_bytes_per_attr) {
   1566		/* Make root external. */
   1567		err = -EOPNOTSUPP;
   1568		goto out_free_re;
   1569	}
   1570
   1571	if (ds_root)
   1572		mi_resize_attr(mi, attr, ds_root);
   1573
   1574	/* Fill first entry (vcn will be set later). */
   1575	e = (struct NTFS_DE *)(root + 1);
   1576	memset(e, 0, sizeof(struct NTFS_DE));
   1577	e->size = cpu_to_le16(sizeof(struct NTFS_DE) + sizeof(u64));
   1578	e->flags = NTFS_IE_HAS_SUBNODES | NTFS_IE_LAST;
   1579
   1580	hdr->flags = 1;
   1581	hdr->used = hdr->total =
   1582		cpu_to_le32(new_root_size - offsetof(struct INDEX_ROOT, ihdr));
   1583
   1584	fnd->root_de = hdr_first_de(hdr);
   1585	mi->dirty = true;
   1586
   1587	/* Create alloc and bitmap attributes (if not). */
   1588	err = run_is_empty(&indx->alloc_run)
   1589		      ? indx_create_allocate(indx, ni, &new_vbn)
   1590		      : indx_add_allocate(indx, ni, &new_vbn);
   1591
   1592	/* Layout of record may be changed, so rescan root. */
   1593	root = indx_get_root(indx, ni, &attr, &mi);
   1594	if (!root) {
   1595		/* Bug? */
   1596		ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
   1597		err = -EINVAL;
   1598		goto out_free_re;
   1599	}
   1600
   1601	if (err) {
   1602		/* Restore root. */
   1603		if (mi_resize_attr(mi, attr, -ds_root))
   1604			memcpy(attr, a_root, asize);
   1605		else {
   1606			/* Bug? */
   1607			ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
   1608		}
   1609		goto out_free_re;
   1610	}
   1611
   1612	e = (struct NTFS_DE *)(root + 1);
   1613	*(__le64 *)(e + 1) = cpu_to_le64(new_vbn);
   1614	mi->dirty = true;
   1615
   1616	/* Now we can create/format the new buffer and copy the entries into. */
   1617	n = indx_new(indx, ni, new_vbn, sub_vbn);
   1618	if (IS_ERR(n)) {
   1619		err = PTR_ERR(n);
   1620		goto out_free_re;
   1621	}
   1622
   1623	hdr = &n->index->ihdr;
   1624	hdr_used = le32_to_cpu(hdr->used);
   1625	hdr_total = le32_to_cpu(hdr->total);
   1626
   1627	/* Copy root entries into new buffer. */
   1628	hdr_insert_head(hdr, re, to_move);
   1629
   1630	/* Update bitmap attribute. */
   1631	indx_mark_used(indx, ni, new_vbn >> indx->idx2vbn_bits);
   1632
   1633	/* Check if we can insert new entry new index buffer. */
   1634	if (hdr_used + new_de_size > hdr_total) {
   1635		/*
   1636		 * This occurs if MFT record is the same or bigger than index
   1637		 * buffer. Move all root new index and have no space to add
   1638		 * new entry classic case when MFT record is 1K and index
   1639		 * buffer 4K the problem should not occurs.
   1640		 */
   1641		kfree(re);
   1642		indx_write(indx, ni, n, 0);
   1643
   1644		put_indx_node(n);
   1645		fnd_clear(fnd);
   1646		err = indx_insert_entry(indx, ni, new_de, ctx, fnd, undo);
   1647		goto out_free_root;
   1648	}
   1649
   1650	/*
   1651	 * Now root is a parent for new index buffer.
   1652	 * Insert NewEntry a new buffer.
   1653	 */
   1654	e = hdr_insert_de(indx, hdr, new_de, NULL, ctx);
   1655	if (!e) {
   1656		err = -EINVAL;
   1657		goto out_put_n;
   1658	}
   1659	fnd_push(fnd, n, e);
   1660
   1661	/* Just write updates index into disk. */
   1662	indx_write(indx, ni, n, 0);
   1663
   1664	n = NULL;
   1665
   1666out_put_n:
   1667	put_indx_node(n);
   1668out_free_re:
   1669	kfree(re);
   1670out_free_root:
   1671	kfree(a_root);
   1672	return err;
   1673}
   1674
   1675/*
   1676 * indx_insert_into_buffer
   1677 *
   1678 * Attempt to insert an entry into an Index Allocation Buffer.
   1679 * If necessary, it will split the buffer.
   1680 */
   1681static int
   1682indx_insert_into_buffer(struct ntfs_index *indx, struct ntfs_inode *ni,
   1683			struct INDEX_ROOT *root, const struct NTFS_DE *new_de,
   1684			const void *ctx, int level, struct ntfs_fnd *fnd)
   1685{
   1686	int err;
   1687	const struct NTFS_DE *sp;
   1688	struct NTFS_DE *e, *de_t, *up_e = NULL;
   1689	struct indx_node *n2 = NULL;
   1690	struct indx_node *n1 = fnd->nodes[level];
   1691	struct INDEX_HDR *hdr1 = &n1->index->ihdr;
   1692	struct INDEX_HDR *hdr2;
   1693	u32 to_copy, used;
   1694	CLST new_vbn;
   1695	__le64 t_vbn, *sub_vbn;
   1696	u16 sp_size;
   1697
   1698	/* Try the most easy case. */
   1699	e = fnd->level - 1 == level ? fnd->de[level] : NULL;
   1700	e = hdr_insert_de(indx, hdr1, new_de, e, ctx);
   1701	fnd->de[level] = e;
   1702	if (e) {
   1703		/* Just write updated index into disk. */
   1704		indx_write(indx, ni, n1, 0);
   1705		return 0;
   1706	}
   1707
   1708	/*
   1709	 * No space to insert into buffer. Split it.
   1710	 * To split we:
   1711	 *  - Save split point ('cause index buffers will be changed)
   1712	 * - Allocate NewBuffer and copy all entries <= sp into new buffer
   1713	 * - Remove all entries (sp including) from TargetBuffer
   1714	 * - Insert NewEntry into left or right buffer (depending on sp <=>
   1715	 *     NewEntry)
   1716	 * - Insert sp into parent buffer (or root)
   1717	 * - Make sp a parent for new buffer
   1718	 */
   1719	sp = hdr_find_split(hdr1);
   1720	if (!sp)
   1721		return -EINVAL;
   1722
   1723	sp_size = le16_to_cpu(sp->size);
   1724	up_e = kmalloc(sp_size + sizeof(u64), GFP_NOFS);
   1725	if (!up_e)
   1726		return -ENOMEM;
   1727	memcpy(up_e, sp, sp_size);
   1728
   1729	if (!hdr1->flags) {
   1730		up_e->flags |= NTFS_IE_HAS_SUBNODES;
   1731		up_e->size = cpu_to_le16(sp_size + sizeof(u64));
   1732		sub_vbn = NULL;
   1733	} else {
   1734		t_vbn = de_get_vbn_le(up_e);
   1735		sub_vbn = &t_vbn;
   1736	}
   1737
   1738	/* Allocate on disk a new index allocation buffer. */
   1739	err = indx_add_allocate(indx, ni, &new_vbn);
   1740	if (err)
   1741		goto out;
   1742
   1743	/* Allocate and format memory a new index buffer. */
   1744	n2 = indx_new(indx, ni, new_vbn, sub_vbn);
   1745	if (IS_ERR(n2)) {
   1746		err = PTR_ERR(n2);
   1747		goto out;
   1748	}
   1749
   1750	hdr2 = &n2->index->ihdr;
   1751
   1752	/* Make sp a parent for new buffer. */
   1753	de_set_vbn(up_e, new_vbn);
   1754
   1755	/* Copy all the entries <= sp into the new buffer. */
   1756	de_t = hdr_first_de(hdr1);
   1757	to_copy = PtrOffset(de_t, sp);
   1758	hdr_insert_head(hdr2, de_t, to_copy);
   1759
   1760	/* Remove all entries (sp including) from hdr1. */
   1761	used = le32_to_cpu(hdr1->used) - to_copy - sp_size;
   1762	memmove(de_t, Add2Ptr(sp, sp_size), used - le32_to_cpu(hdr1->de_off));
   1763	hdr1->used = cpu_to_le32(used);
   1764
   1765	/*
   1766	 * Insert new entry into left or right buffer
   1767	 * (depending on sp <=> new_de).
   1768	 */
   1769	hdr_insert_de(indx,
   1770		      (*indx->cmp)(new_de + 1, le16_to_cpu(new_de->key_size),
   1771				   up_e + 1, le16_to_cpu(up_e->key_size),
   1772				   ctx) < 0
   1773			      ? hdr2
   1774			      : hdr1,
   1775		      new_de, NULL, ctx);
   1776
   1777	indx_mark_used(indx, ni, new_vbn >> indx->idx2vbn_bits);
   1778
   1779	indx_write(indx, ni, n1, 0);
   1780	indx_write(indx, ni, n2, 0);
   1781
   1782	put_indx_node(n2);
   1783
   1784	/*
   1785	 * We've finished splitting everybody, so we are ready to
   1786	 * insert the promoted entry into the parent.
   1787	 */
   1788	if (!level) {
   1789		/* Insert in root. */
   1790		err = indx_insert_into_root(indx, ni, up_e, NULL, ctx, fnd, 0);
   1791		if (err)
   1792			goto out;
   1793	} else {
   1794		/*
   1795		 * The target buffer's parent is another index buffer.
   1796		 * TODO: Remove recursion.
   1797		 */
   1798		err = indx_insert_into_buffer(indx, ni, root, up_e, ctx,
   1799					      level - 1, fnd);
   1800		if (err)
   1801			goto out;
   1802	}
   1803
   1804out:
   1805	kfree(up_e);
   1806
   1807	return err;
   1808}
   1809
   1810/*
   1811 * indx_insert_entry - Insert new entry into index.
   1812 *
   1813 * @undo - True if we undoing previous remove.
   1814 */
   1815int indx_insert_entry(struct ntfs_index *indx, struct ntfs_inode *ni,
   1816		      const struct NTFS_DE *new_de, const void *ctx,
   1817		      struct ntfs_fnd *fnd, bool undo)
   1818{
   1819	int err;
   1820	int diff;
   1821	struct NTFS_DE *e;
   1822	struct ntfs_fnd *fnd_a = NULL;
   1823	struct INDEX_ROOT *root;
   1824
   1825	if (!fnd) {
   1826		fnd_a = fnd_get();
   1827		if (!fnd_a) {
   1828			err = -ENOMEM;
   1829			goto out1;
   1830		}
   1831		fnd = fnd_a;
   1832	}
   1833
   1834	root = indx_get_root(indx, ni, NULL, NULL);
   1835	if (!root) {
   1836		err = -EINVAL;
   1837		goto out;
   1838	}
   1839
   1840	if (fnd_is_empty(fnd)) {
   1841		/*
   1842		 * Find the spot the tree where we want to
   1843		 * insert the new entry.
   1844		 */
   1845		err = indx_find(indx, ni, root, new_de + 1,
   1846				le16_to_cpu(new_de->key_size), ctx, &diff, &e,
   1847				fnd);
   1848		if (err)
   1849			goto out;
   1850
   1851		if (!diff) {
   1852			err = -EEXIST;
   1853			goto out;
   1854		}
   1855	}
   1856
   1857	if (!fnd->level) {
   1858		/*
   1859		 * The root is also a leaf, so we'll insert the
   1860		 * new entry into it.
   1861		 */
   1862		err = indx_insert_into_root(indx, ni, new_de, fnd->root_de, ctx,
   1863					    fnd, undo);
   1864		if (err)
   1865			goto out;
   1866	} else {
   1867		/*
   1868		 * Found a leaf buffer, so we'll insert the new entry into it.
   1869		 */
   1870		err = indx_insert_into_buffer(indx, ni, root, new_de, ctx,
   1871					      fnd->level - 1, fnd);
   1872		if (err)
   1873			goto out;
   1874	}
   1875
   1876out:
   1877	fnd_put(fnd_a);
   1878out1:
   1879	return err;
   1880}
   1881
   1882/*
   1883 * indx_find_buffer - Locate a buffer from the tree.
   1884 */
   1885static struct indx_node *indx_find_buffer(struct ntfs_index *indx,
   1886					  struct ntfs_inode *ni,
   1887					  const struct INDEX_ROOT *root,
   1888					  __le64 vbn, struct indx_node *n)
   1889{
   1890	int err;
   1891	const struct NTFS_DE *e;
   1892	struct indx_node *r;
   1893	const struct INDEX_HDR *hdr = n ? &n->index->ihdr : &root->ihdr;
   1894
   1895	/* Step 1: Scan one level. */
   1896	for (e = hdr_first_de(hdr);; e = hdr_next_de(hdr, e)) {
   1897		if (!e)
   1898			return ERR_PTR(-EINVAL);
   1899
   1900		if (de_has_vcn(e) && vbn == de_get_vbn_le(e))
   1901			return n;
   1902
   1903		if (de_is_last(e))
   1904			break;
   1905	}
   1906
   1907	/* Step2: Do recursion. */
   1908	e = Add2Ptr(hdr, le32_to_cpu(hdr->de_off));
   1909	for (;;) {
   1910		if (de_has_vcn_ex(e)) {
   1911			err = indx_read(indx, ni, de_get_vbn(e), &n);
   1912			if (err)
   1913				return ERR_PTR(err);
   1914
   1915			r = indx_find_buffer(indx, ni, root, vbn, n);
   1916			if (r)
   1917				return r;
   1918		}
   1919
   1920		if (de_is_last(e))
   1921			break;
   1922
   1923		e = Add2Ptr(e, le16_to_cpu(e->size));
   1924	}
   1925
   1926	return NULL;
   1927}
   1928
   1929/*
   1930 * indx_shrink - Deallocate unused tail indexes.
   1931 */
   1932static int indx_shrink(struct ntfs_index *indx, struct ntfs_inode *ni,
   1933		       size_t bit)
   1934{
   1935	int err = 0;
   1936	u64 bpb, new_data;
   1937	size_t nbits;
   1938	struct ATTRIB *b;
   1939	struct ATTR_LIST_ENTRY *le = NULL;
   1940	const struct INDEX_NAMES *in = &s_index_names[indx->type];
   1941
   1942	b = ni_find_attr(ni, NULL, &le, ATTR_BITMAP, in->name, in->name_len,
   1943			 NULL, NULL);
   1944
   1945	if (!b)
   1946		return -ENOENT;
   1947
   1948	if (!b->non_res) {
   1949		unsigned long pos;
   1950		const unsigned long *bm = resident_data(b);
   1951
   1952		nbits = (size_t)le32_to_cpu(b->res.data_size) * 8;
   1953
   1954		if (bit >= nbits)
   1955			return 0;
   1956
   1957		pos = find_next_bit(bm, nbits, bit);
   1958		if (pos < nbits)
   1959			return 0;
   1960	} else {
   1961		size_t used = MINUS_ONE_T;
   1962
   1963		nbits = le64_to_cpu(b->nres.data_size) * 8;
   1964
   1965		if (bit >= nbits)
   1966			return 0;
   1967
   1968		err = scan_nres_bitmap(ni, b, indx, bit, &scan_for_used, &used);
   1969		if (err)
   1970			return err;
   1971
   1972		if (used != MINUS_ONE_T)
   1973			return 0;
   1974	}
   1975
   1976	new_data = (u64)bit << indx->index_bits;
   1977
   1978	err = attr_set_size(ni, ATTR_ALLOC, in->name, in->name_len,
   1979			    &indx->alloc_run, new_data, &new_data, false, NULL);
   1980	if (err)
   1981		return err;
   1982
   1983	bpb = bitmap_size(bit);
   1984	if (bpb * 8 == nbits)
   1985		return 0;
   1986
   1987	err = attr_set_size(ni, ATTR_BITMAP, in->name, in->name_len,
   1988			    &indx->bitmap_run, bpb, &bpb, false, NULL);
   1989
   1990	return err;
   1991}
   1992
   1993static int indx_free_children(struct ntfs_index *indx, struct ntfs_inode *ni,
   1994			      const struct NTFS_DE *e, bool trim)
   1995{
   1996	int err;
   1997	struct indx_node *n;
   1998	struct INDEX_HDR *hdr;
   1999	CLST vbn = de_get_vbn(e);
   2000	size_t i;
   2001
   2002	err = indx_read(indx, ni, vbn, &n);
   2003	if (err)
   2004		return err;
   2005
   2006	hdr = &n->index->ihdr;
   2007	/* First, recurse into the children, if any. */
   2008	if (hdr_has_subnode(hdr)) {
   2009		for (e = hdr_first_de(hdr); e; e = hdr_next_de(hdr, e)) {
   2010			indx_free_children(indx, ni, e, false);
   2011			if (de_is_last(e))
   2012				break;
   2013		}
   2014	}
   2015
   2016	put_indx_node(n);
   2017
   2018	i = vbn >> indx->idx2vbn_bits;
   2019	/*
   2020	 * We've gotten rid of the children; add this buffer to the free list.
   2021	 */
   2022	indx_mark_free(indx, ni, i);
   2023
   2024	if (!trim)
   2025		return 0;
   2026
   2027	/*
   2028	 * If there are no used indexes after current free index
   2029	 * then we can truncate allocation and bitmap.
   2030	 * Use bitmap to estimate the case.
   2031	 */
   2032	indx_shrink(indx, ni, i + 1);
   2033	return 0;
   2034}
   2035
   2036/*
   2037 * indx_get_entry_to_replace
   2038 *
   2039 * Find a replacement entry for a deleted entry.
   2040 * Always returns a node entry:
   2041 * NTFS_IE_HAS_SUBNODES is set the flags and the size includes the sub_vcn.
   2042 */
   2043static int indx_get_entry_to_replace(struct ntfs_index *indx,
   2044				     struct ntfs_inode *ni,
   2045				     const struct NTFS_DE *de_next,
   2046				     struct NTFS_DE **de_to_replace,
   2047				     struct ntfs_fnd *fnd)
   2048{
   2049	int err;
   2050	int level = -1;
   2051	CLST vbn;
   2052	struct NTFS_DE *e, *te, *re;
   2053	struct indx_node *n;
   2054	struct INDEX_BUFFER *ib;
   2055
   2056	*de_to_replace = NULL;
   2057
   2058	/* Find first leaf entry down from de_next. */
   2059	vbn = de_get_vbn(de_next);
   2060	for (;;) {
   2061		n = NULL;
   2062		err = indx_read(indx, ni, vbn, &n);
   2063		if (err)
   2064			goto out;
   2065
   2066		e = hdr_first_de(&n->index->ihdr);
   2067		fnd_push(fnd, n, e);
   2068
   2069		if (!de_is_last(e)) {
   2070			/*
   2071			 * This buffer is non-empty, so its first entry
   2072			 * could be used as the replacement entry.
   2073			 */
   2074			level = fnd->level - 1;
   2075		}
   2076
   2077		if (!de_has_vcn(e))
   2078			break;
   2079
   2080		/* This buffer is a node. Continue to go down. */
   2081		vbn = de_get_vbn(e);
   2082	}
   2083
   2084	if (level == -1)
   2085		goto out;
   2086
   2087	n = fnd->nodes[level];
   2088	te = hdr_first_de(&n->index->ihdr);
   2089	/* Copy the candidate entry into the replacement entry buffer. */
   2090	re = kmalloc(le16_to_cpu(te->size) + sizeof(u64), GFP_NOFS);
   2091	if (!re) {
   2092		err = -ENOMEM;
   2093		goto out;
   2094	}
   2095
   2096	*de_to_replace = re;
   2097	memcpy(re, te, le16_to_cpu(te->size));
   2098
   2099	if (!de_has_vcn(re)) {
   2100		/*
   2101		 * The replacement entry we found doesn't have a sub_vcn.
   2102		 * increase its size to hold one.
   2103		 */
   2104		le16_add_cpu(&re->size, sizeof(u64));
   2105		re->flags |= NTFS_IE_HAS_SUBNODES;
   2106	} else {
   2107		/*
   2108		 * The replacement entry we found was a node entry, which
   2109		 * means that all its child buffers are empty. Return them
   2110		 * to the free pool.
   2111		 */
   2112		indx_free_children(indx, ni, te, true);
   2113	}
   2114
   2115	/*
   2116	 * Expunge the replacement entry from its former location,
   2117	 * and then write that buffer.
   2118	 */
   2119	ib = n->index;
   2120	e = hdr_delete_de(&ib->ihdr, te);
   2121
   2122	fnd->de[level] = e;
   2123	indx_write(indx, ni, n, 0);
   2124
   2125	/* Check to see if this action created an empty leaf. */
   2126	if (ib_is_leaf(ib) && ib_is_empty(ib))
   2127		return 0;
   2128
   2129out:
   2130	fnd_clear(fnd);
   2131	return err;
   2132}
   2133
   2134/*
   2135 * indx_delete_entry - Delete an entry from the index.
   2136 */
   2137int indx_delete_entry(struct ntfs_index *indx, struct ntfs_inode *ni,
   2138		      const void *key, u32 key_len, const void *ctx)
   2139{
   2140	int err, diff;
   2141	struct INDEX_ROOT *root;
   2142	struct INDEX_HDR *hdr;
   2143	struct ntfs_fnd *fnd, *fnd2;
   2144	struct INDEX_BUFFER *ib;
   2145	struct NTFS_DE *e, *re, *next, *prev, *me;
   2146	struct indx_node *n, *n2d = NULL;
   2147	__le64 sub_vbn;
   2148	int level, level2;
   2149	struct ATTRIB *attr;
   2150	struct mft_inode *mi;
   2151	u32 e_size, root_size, new_root_size;
   2152	size_t trim_bit;
   2153	const struct INDEX_NAMES *in;
   2154
   2155	fnd = fnd_get();
   2156	if (!fnd) {
   2157		err = -ENOMEM;
   2158		goto out2;
   2159	}
   2160
   2161	fnd2 = fnd_get();
   2162	if (!fnd2) {
   2163		err = -ENOMEM;
   2164		goto out1;
   2165	}
   2166
   2167	root = indx_get_root(indx, ni, &attr, &mi);
   2168	if (!root) {
   2169		err = -EINVAL;
   2170		goto out;
   2171	}
   2172
   2173	/* Locate the entry to remove. */
   2174	err = indx_find(indx, ni, root, key, key_len, ctx, &diff, &e, fnd);
   2175	if (err)
   2176		goto out;
   2177
   2178	if (!e || diff) {
   2179		err = -ENOENT;
   2180		goto out;
   2181	}
   2182
   2183	level = fnd->level;
   2184
   2185	if (level) {
   2186		n = fnd->nodes[level - 1];
   2187		e = fnd->de[level - 1];
   2188		ib = n->index;
   2189		hdr = &ib->ihdr;
   2190	} else {
   2191		hdr = &root->ihdr;
   2192		e = fnd->root_de;
   2193		n = NULL;
   2194	}
   2195
   2196	e_size = le16_to_cpu(e->size);
   2197
   2198	if (!de_has_vcn_ex(e)) {
   2199		/* The entry to delete is a leaf, so we can just rip it out. */
   2200		hdr_delete_de(hdr, e);
   2201
   2202		if (!level) {
   2203			hdr->total = hdr->used;
   2204
   2205			/* Shrink resident root attribute. */
   2206			mi_resize_attr(mi, attr, 0 - e_size);
   2207			goto out;
   2208		}
   2209
   2210		indx_write(indx, ni, n, 0);
   2211
   2212		/*
   2213		 * Check to see if removing that entry made
   2214		 * the leaf empty.
   2215		 */
   2216		if (ib_is_leaf(ib) && ib_is_empty(ib)) {
   2217			fnd_pop(fnd);
   2218			fnd_push(fnd2, n, e);
   2219		}
   2220	} else {
   2221		/*
   2222		 * The entry we wish to delete is a node buffer, so we
   2223		 * have to find a replacement for it.
   2224		 */
   2225		next = de_get_next(e);
   2226
   2227		err = indx_get_entry_to_replace(indx, ni, next, &re, fnd2);
   2228		if (err)
   2229			goto out;
   2230
   2231		if (re) {
   2232			de_set_vbn_le(re, de_get_vbn_le(e));
   2233			hdr_delete_de(hdr, e);
   2234
   2235			err = level ? indx_insert_into_buffer(indx, ni, root,
   2236							      re, ctx,
   2237							      fnd->level - 1,
   2238							      fnd)
   2239				    : indx_insert_into_root(indx, ni, re, e,
   2240							    ctx, fnd, 0);
   2241			kfree(re);
   2242
   2243			if (err)
   2244				goto out;
   2245		} else {
   2246			/*
   2247			 * There is no replacement for the current entry.
   2248			 * This means that the subtree rooted at its node
   2249			 * is empty, and can be deleted, which turn means
   2250			 * that the node can just inherit the deleted
   2251			 * entry sub_vcn.
   2252			 */
   2253			indx_free_children(indx, ni, next, true);
   2254
   2255			de_set_vbn_le(next, de_get_vbn_le(e));
   2256			hdr_delete_de(hdr, e);
   2257			if (level) {
   2258				indx_write(indx, ni, n, 0);
   2259			} else {
   2260				hdr->total = hdr->used;
   2261
   2262				/* Shrink resident root attribute. */
   2263				mi_resize_attr(mi, attr, 0 - e_size);
   2264			}
   2265		}
   2266	}
   2267
   2268	/* Delete a branch of tree. */
   2269	if (!fnd2 || !fnd2->level)
   2270		goto out;
   2271
   2272	/* Reinit root 'cause it can be changed. */
   2273	root = indx_get_root(indx, ni, &attr, &mi);
   2274	if (!root) {
   2275		err = -EINVAL;
   2276		goto out;
   2277	}
   2278
   2279	n2d = NULL;
   2280	sub_vbn = fnd2->nodes[0]->index->vbn;
   2281	level2 = 0;
   2282	level = fnd->level;
   2283
   2284	hdr = level ? &fnd->nodes[level - 1]->index->ihdr : &root->ihdr;
   2285
   2286	/* Scan current level. */
   2287	for (e = hdr_first_de(hdr);; e = hdr_next_de(hdr, e)) {
   2288		if (!e) {
   2289			err = -EINVAL;
   2290			goto out;
   2291		}
   2292
   2293		if (de_has_vcn(e) && sub_vbn == de_get_vbn_le(e))
   2294			break;
   2295
   2296		if (de_is_last(e)) {
   2297			e = NULL;
   2298			break;
   2299		}
   2300	}
   2301
   2302	if (!e) {
   2303		/* Do slow search from root. */
   2304		struct indx_node *in;
   2305
   2306		fnd_clear(fnd);
   2307
   2308		in = indx_find_buffer(indx, ni, root, sub_vbn, NULL);
   2309		if (IS_ERR(in)) {
   2310			err = PTR_ERR(in);
   2311			goto out;
   2312		}
   2313
   2314		if (in)
   2315			fnd_push(fnd, in, NULL);
   2316	}
   2317
   2318	/* Merge fnd2 -> fnd. */
   2319	for (level = 0; level < fnd2->level; level++) {
   2320		fnd_push(fnd, fnd2->nodes[level], fnd2->de[level]);
   2321		fnd2->nodes[level] = NULL;
   2322	}
   2323	fnd2->level = 0;
   2324
   2325	hdr = NULL;
   2326	for (level = fnd->level; level; level--) {
   2327		struct indx_node *in = fnd->nodes[level - 1];
   2328
   2329		ib = in->index;
   2330		if (ib_is_empty(ib)) {
   2331			sub_vbn = ib->vbn;
   2332		} else {
   2333			hdr = &ib->ihdr;
   2334			n2d = in;
   2335			level2 = level;
   2336			break;
   2337		}
   2338	}
   2339
   2340	if (!hdr)
   2341		hdr = &root->ihdr;
   2342
   2343	e = hdr_first_de(hdr);
   2344	if (!e) {
   2345		err = -EINVAL;
   2346		goto out;
   2347	}
   2348
   2349	if (hdr != &root->ihdr || !de_is_last(e)) {
   2350		prev = NULL;
   2351		while (!de_is_last(e)) {
   2352			if (de_has_vcn(e) && sub_vbn == de_get_vbn_le(e))
   2353				break;
   2354			prev = e;
   2355			e = hdr_next_de(hdr, e);
   2356			if (!e) {
   2357				err = -EINVAL;
   2358				goto out;
   2359			}
   2360		}
   2361
   2362		if (sub_vbn != de_get_vbn_le(e)) {
   2363			/*
   2364			 * Didn't find the parent entry, although this buffer
   2365			 * is the parent trail. Something is corrupt.
   2366			 */
   2367			err = -EINVAL;
   2368			goto out;
   2369		}
   2370
   2371		if (de_is_last(e)) {
   2372			/*
   2373			 * Since we can't remove the end entry, we'll remove
   2374			 * its predecessor instead. This means we have to
   2375			 * transfer the predecessor's sub_vcn to the end entry.
   2376			 * Note: This index block is not empty, so the
   2377			 * predecessor must exist.
   2378			 */
   2379			if (!prev) {
   2380				err = -EINVAL;
   2381				goto out;
   2382			}
   2383
   2384			if (de_has_vcn(prev)) {
   2385				de_set_vbn_le(e, de_get_vbn_le(prev));
   2386			} else if (de_has_vcn(e)) {
   2387				le16_sub_cpu(&e->size, sizeof(u64));
   2388				e->flags &= ~NTFS_IE_HAS_SUBNODES;
   2389				le32_sub_cpu(&hdr->used, sizeof(u64));
   2390			}
   2391			e = prev;
   2392		}
   2393
   2394		/*
   2395		 * Copy the current entry into a temporary buffer (stripping
   2396		 * off its down-pointer, if any) and delete it from the current
   2397		 * buffer or root, as appropriate.
   2398		 */
   2399		e_size = le16_to_cpu(e->size);
   2400		me = kmemdup(e, e_size, GFP_NOFS);
   2401		if (!me) {
   2402			err = -ENOMEM;
   2403			goto out;
   2404		}
   2405
   2406		if (de_has_vcn(me)) {
   2407			me->flags &= ~NTFS_IE_HAS_SUBNODES;
   2408			le16_sub_cpu(&me->size, sizeof(u64));
   2409		}
   2410
   2411		hdr_delete_de(hdr, e);
   2412
   2413		if (hdr == &root->ihdr) {
   2414			level = 0;
   2415			hdr->total = hdr->used;
   2416
   2417			/* Shrink resident root attribute. */
   2418			mi_resize_attr(mi, attr, 0 - e_size);
   2419		} else {
   2420			indx_write(indx, ni, n2d, 0);
   2421			level = level2;
   2422		}
   2423
   2424		/* Mark unused buffers as free. */
   2425		trim_bit = -1;
   2426		for (; level < fnd->level; level++) {
   2427			ib = fnd->nodes[level]->index;
   2428			if (ib_is_empty(ib)) {
   2429				size_t k = le64_to_cpu(ib->vbn) >>
   2430					   indx->idx2vbn_bits;
   2431
   2432				indx_mark_free(indx, ni, k);
   2433				if (k < trim_bit)
   2434					trim_bit = k;
   2435			}
   2436		}
   2437
   2438		fnd_clear(fnd);
   2439		/*fnd->root_de = NULL;*/
   2440
   2441		/*
   2442		 * Re-insert the entry into the tree.
   2443		 * Find the spot the tree where we want to insert the new entry.
   2444		 */
   2445		err = indx_insert_entry(indx, ni, me, ctx, fnd, 0);
   2446		kfree(me);
   2447		if (err)
   2448			goto out;
   2449
   2450		if (trim_bit != -1)
   2451			indx_shrink(indx, ni, trim_bit);
   2452	} else {
   2453		/*
   2454		 * This tree needs to be collapsed down to an empty root.
   2455		 * Recreate the index root as an empty leaf and free all
   2456		 * the bits the index allocation bitmap.
   2457		 */
   2458		fnd_clear(fnd);
   2459		fnd_clear(fnd2);
   2460
   2461		in = &s_index_names[indx->type];
   2462
   2463		err = attr_set_size(ni, ATTR_ALLOC, in->name, in->name_len,
   2464				    &indx->alloc_run, 0, NULL, false, NULL);
   2465		err = ni_remove_attr(ni, ATTR_ALLOC, in->name, in->name_len,
   2466				     false, NULL);
   2467		run_close(&indx->alloc_run);
   2468
   2469		err = attr_set_size(ni, ATTR_BITMAP, in->name, in->name_len,
   2470				    &indx->bitmap_run, 0, NULL, false, NULL);
   2471		err = ni_remove_attr(ni, ATTR_BITMAP, in->name, in->name_len,
   2472				     false, NULL);
   2473		run_close(&indx->bitmap_run);
   2474
   2475		root = indx_get_root(indx, ni, &attr, &mi);
   2476		if (!root) {
   2477			err = -EINVAL;
   2478			goto out;
   2479		}
   2480
   2481		root_size = le32_to_cpu(attr->res.data_size);
   2482		new_root_size =
   2483			sizeof(struct INDEX_ROOT) + sizeof(struct NTFS_DE);
   2484
   2485		if (new_root_size != root_size &&
   2486		    !mi_resize_attr(mi, attr, new_root_size - root_size)) {
   2487			err = -EINVAL;
   2488			goto out;
   2489		}
   2490
   2491		/* Fill first entry. */
   2492		e = (struct NTFS_DE *)(root + 1);
   2493		e->ref.low = 0;
   2494		e->ref.high = 0;
   2495		e->ref.seq = 0;
   2496		e->size = cpu_to_le16(sizeof(struct NTFS_DE));
   2497		e->flags = NTFS_IE_LAST; // 0x02
   2498		e->key_size = 0;
   2499		e->res = 0;
   2500
   2501		hdr = &root->ihdr;
   2502		hdr->flags = 0;
   2503		hdr->used = hdr->total = cpu_to_le32(
   2504			new_root_size - offsetof(struct INDEX_ROOT, ihdr));
   2505		mi->dirty = true;
   2506	}
   2507
   2508out:
   2509	fnd_put(fnd2);
   2510out1:
   2511	fnd_put(fnd);
   2512out2:
   2513	return err;
   2514}
   2515
   2516/*
   2517 * Update duplicated information in directory entry
   2518 * 'dup' - info from MFT record
   2519 */
   2520int indx_update_dup(struct ntfs_inode *ni, struct ntfs_sb_info *sbi,
   2521		    const struct ATTR_FILE_NAME *fname,
   2522		    const struct NTFS_DUP_INFO *dup, int sync)
   2523{
   2524	int err, diff;
   2525	struct NTFS_DE *e = NULL;
   2526	struct ATTR_FILE_NAME *e_fname;
   2527	struct ntfs_fnd *fnd;
   2528	struct INDEX_ROOT *root;
   2529	struct mft_inode *mi;
   2530	struct ntfs_index *indx = &ni->dir;
   2531
   2532	fnd = fnd_get();
   2533	if (!fnd)
   2534		return -ENOMEM;
   2535
   2536	root = indx_get_root(indx, ni, NULL, &mi);
   2537	if (!root) {
   2538		err = -EINVAL;
   2539		goto out;
   2540	}
   2541
   2542	/* Find entry in directory. */
   2543	err = indx_find(indx, ni, root, fname, fname_full_size(fname), sbi,
   2544			&diff, &e, fnd);
   2545	if (err)
   2546		goto out;
   2547
   2548	if (!e) {
   2549		err = -EINVAL;
   2550		goto out;
   2551	}
   2552
   2553	if (diff) {
   2554		err = -EINVAL;
   2555		goto out;
   2556	}
   2557
   2558	e_fname = (struct ATTR_FILE_NAME *)(e + 1);
   2559
   2560	if (!memcmp(&e_fname->dup, dup, sizeof(*dup))) {
   2561		/*
   2562		 * Nothing to update in index! Try to avoid this call.
   2563		 */
   2564		goto out;
   2565	}
   2566
   2567	memcpy(&e_fname->dup, dup, sizeof(*dup));
   2568
   2569	if (fnd->level) {
   2570		/* Directory entry in index. */
   2571		err = indx_write(indx, ni, fnd->nodes[fnd->level - 1], sync);
   2572	} else {
   2573		/* Directory entry in directory MFT record. */
   2574		mi->dirty = true;
   2575		if (sync)
   2576			err = mi_write(mi, 1);
   2577		else
   2578			mark_inode_dirty(&ni->vfs_inode);
   2579	}
   2580
   2581out:
   2582	fnd_put(fnd);
   2583	return err;
   2584}