linux/fs/ntfs3/index.c
<<
>>
Prefs
   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}
2585