linux/fs/ntfs3/bitmap.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *
   4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
   5 *
   6 * This code builds two trees of free clusters extents.
   7 * Trees are sorted by start of extent and by length of extent.
   8 * NTFS_MAX_WND_EXTENTS defines the maximum number of elements in trees.
   9 * In extreme case code reads on-disk bitmap to find free clusters.
  10 *
  11 */
  12
  13#include <linux/buffer_head.h>
  14#include <linux/fs.h>
  15#include <linux/kernel.h>
  16
  17#include "ntfs.h"
  18#include "ntfs_fs.h"
  19
  20/*
  21 * Maximum number of extents in tree.
  22 */
  23#define NTFS_MAX_WND_EXTENTS (32u * 1024u)
  24
  25struct rb_node_key {
  26        struct rb_node node;
  27        size_t key;
  28};
  29
  30struct e_node {
  31        struct rb_node_key start; /* Tree sorted by start. */
  32        struct rb_node_key count; /* Tree sorted by len. */
  33};
  34
  35static int wnd_rescan(struct wnd_bitmap *wnd);
  36static struct buffer_head *wnd_map(struct wnd_bitmap *wnd, size_t iw);
  37static bool wnd_is_free_hlp(struct wnd_bitmap *wnd, size_t bit, size_t bits);
  38
  39static struct kmem_cache *ntfs_enode_cachep;
  40
  41int __init ntfs3_init_bitmap(void)
  42{
  43        ntfs_enode_cachep =
  44                kmem_cache_create("ntfs3_enode_cache", sizeof(struct e_node), 0,
  45                                  SLAB_RECLAIM_ACCOUNT, NULL);
  46        return ntfs_enode_cachep ? 0 : -ENOMEM;
  47}
  48
  49void ntfs3_exit_bitmap(void)
  50{
  51        kmem_cache_destroy(ntfs_enode_cachep);
  52}
  53
  54static inline u32 wnd_bits(const struct wnd_bitmap *wnd, size_t i)
  55{
  56        return i + 1 == wnd->nwnd ? wnd->bits_last : wnd->sb->s_blocksize * 8;
  57}
  58
  59/*
  60 * wnd_scan
  61 *
  62 * b_pos + b_len - biggest fragment.
  63 * Scan range [wpos wbits) window @buf.
  64 *
  65 * Return: -1 if not found.
  66 */
  67static size_t wnd_scan(const ulong *buf, size_t wbit, u32 wpos, u32 wend,
  68                       size_t to_alloc, size_t *prev_tail, size_t *b_pos,
  69                       size_t *b_len)
  70{
  71        while (wpos < wend) {
  72                size_t free_len;
  73                u32 free_bits, end;
  74                u32 used = find_next_zero_bit(buf, wend, wpos);
  75
  76                if (used >= wend) {
  77                        if (*b_len < *prev_tail) {
  78                                *b_pos = wbit - *prev_tail;
  79                                *b_len = *prev_tail;
  80                        }
  81
  82                        *prev_tail = 0;
  83                        return -1;
  84                }
  85
  86                if (used > wpos) {
  87                        wpos = used;
  88                        if (*b_len < *prev_tail) {
  89                                *b_pos = wbit - *prev_tail;
  90                                *b_len = *prev_tail;
  91                        }
  92
  93                        *prev_tail = 0;
  94                }
  95
  96                /*
  97                 * Now we have a fragment [wpos, wend) staring with 0.
  98                 */
  99                end = wpos + to_alloc - *prev_tail;
 100                free_bits = find_next_bit(buf, min(end, wend), wpos);
 101
 102                free_len = *prev_tail + free_bits - wpos;
 103
 104                if (*b_len < free_len) {
 105                        *b_pos = wbit + wpos - *prev_tail;
 106                        *b_len = free_len;
 107                }
 108
 109                if (free_len >= to_alloc)
 110                        return wbit + wpos - *prev_tail;
 111
 112                if (free_bits >= wend) {
 113                        *prev_tail += free_bits - wpos;
 114                        return -1;
 115                }
 116
 117                wpos = free_bits + 1;
 118
 119                *prev_tail = 0;
 120        }
 121
 122        return -1;
 123}
 124
 125/*
 126 * wnd_close - Frees all resources.
 127 */
 128void wnd_close(struct wnd_bitmap *wnd)
 129{
 130        struct rb_node *node, *next;
 131
 132        kfree(wnd->free_bits);
 133        run_close(&wnd->run);
 134
 135        node = rb_first(&wnd->start_tree);
 136
 137        while (node) {
 138                next = rb_next(node);
 139                rb_erase(node, &wnd->start_tree);
 140                kmem_cache_free(ntfs_enode_cachep,
 141                                rb_entry(node, struct e_node, start.node));
 142                node = next;
 143        }
 144}
 145
 146static struct rb_node *rb_lookup(struct rb_root *root, size_t v)
 147{
 148        struct rb_node **p = &root->rb_node;
 149        struct rb_node *r = NULL;
 150
 151        while (*p) {
 152                struct rb_node_key *k;
 153
 154                k = rb_entry(*p, struct rb_node_key, node);
 155                if (v < k->key) {
 156                        p = &(*p)->rb_left;
 157                } else if (v > k->key) {
 158                        r = &k->node;
 159                        p = &(*p)->rb_right;
 160                } else {
 161                        return &k->node;
 162                }
 163        }
 164
 165        return r;
 166}
 167
 168/*
 169 * rb_insert_count - Helper function to insert special kind of 'count' tree.
 170 */
 171static inline bool rb_insert_count(struct rb_root *root, struct e_node *e)
 172{
 173        struct rb_node **p = &root->rb_node;
 174        struct rb_node *parent = NULL;
 175        size_t e_ckey = e->count.key;
 176        size_t e_skey = e->start.key;
 177
 178        while (*p) {
 179                struct e_node *k =
 180                        rb_entry(parent = *p, struct e_node, count.node);
 181
 182                if (e_ckey > k->count.key) {
 183                        p = &(*p)->rb_left;
 184                } else if (e_ckey < k->count.key) {
 185                        p = &(*p)->rb_right;
 186                } else if (e_skey < k->start.key) {
 187                        p = &(*p)->rb_left;
 188                } else if (e_skey > k->start.key) {
 189                        p = &(*p)->rb_right;
 190                } else {
 191                        WARN_ON(1);
 192                        return false;
 193                }
 194        }
 195
 196        rb_link_node(&e->count.node, parent, p);
 197        rb_insert_color(&e->count.node, root);
 198        return true;
 199}
 200
 201/*
 202 * rb_insert_start - Helper function to insert special kind of 'count' tree.
 203 */
 204static inline bool rb_insert_start(struct rb_root *root, struct e_node *e)
 205{
 206        struct rb_node **p = &root->rb_node;
 207        struct rb_node *parent = NULL;
 208        size_t e_skey = e->start.key;
 209
 210        while (*p) {
 211                struct e_node *k;
 212
 213                parent = *p;
 214
 215                k = rb_entry(parent, struct e_node, start.node);
 216                if (e_skey < k->start.key) {
 217                        p = &(*p)->rb_left;
 218                } else if (e_skey > k->start.key) {
 219                        p = &(*p)->rb_right;
 220                } else {
 221                        WARN_ON(1);
 222                        return false;
 223                }
 224        }
 225
 226        rb_link_node(&e->start.node, parent, p);
 227        rb_insert_color(&e->start.node, root);
 228        return true;
 229}
 230
 231/*
 232 * wnd_add_free_ext - Adds a new extent of free space.
 233 * @build:      1 when building tree.
 234 */
 235static void wnd_add_free_ext(struct wnd_bitmap *wnd, size_t bit, size_t len,
 236                             bool build)
 237{
 238        struct e_node *e, *e0 = NULL;
 239        size_t ib, end_in = bit + len;
 240        struct rb_node *n;
 241
 242        if (build) {
 243                /* Use extent_min to filter too short extents. */
 244                if (wnd->count >= NTFS_MAX_WND_EXTENTS &&
 245                    len <= wnd->extent_min) {
 246                        wnd->uptodated = -1;
 247                        return;
 248                }
 249        } else {
 250                /* Try to find extent before 'bit'. */
 251                n = rb_lookup(&wnd->start_tree, bit);
 252
 253                if (!n) {
 254                        n = rb_first(&wnd->start_tree);
 255                } else {
 256                        e = rb_entry(n, struct e_node, start.node);
 257                        n = rb_next(n);
 258                        if (e->start.key + e->count.key == bit) {
 259                                /* Remove left. */
 260                                bit = e->start.key;
 261                                len += e->count.key;
 262                                rb_erase(&e->start.node, &wnd->start_tree);
 263                                rb_erase(&e->count.node, &wnd->count_tree);
 264                                wnd->count -= 1;
 265                                e0 = e;
 266                        }
 267                }
 268
 269                while (n) {
 270                        size_t next_end;
 271
 272                        e = rb_entry(n, struct e_node, start.node);
 273                        next_end = e->start.key + e->count.key;
 274                        if (e->start.key > end_in)
 275                                break;
 276
 277                        /* Remove right. */
 278                        n = rb_next(n);
 279                        len += next_end - end_in;
 280                        end_in = next_end;
 281                        rb_erase(&e->start.node, &wnd->start_tree);
 282                        rb_erase(&e->count.node, &wnd->count_tree);
 283                        wnd->count -= 1;
 284
 285                        if (!e0)
 286                                e0 = e;
 287                        else
 288                                kmem_cache_free(ntfs_enode_cachep, e);
 289                }
 290
 291                if (wnd->uptodated != 1) {
 292                        /* Check bits before 'bit'. */
 293                        ib = wnd->zone_bit == wnd->zone_end ||
 294                                             bit < wnd->zone_end
 295                                     ? 0
 296                                     : wnd->zone_end;
 297
 298                        while (bit > ib && wnd_is_free_hlp(wnd, bit - 1, 1)) {
 299                                bit -= 1;
 300                                len += 1;
 301                        }
 302
 303                        /* Check bits after 'end_in'. */
 304                        ib = wnd->zone_bit == wnd->zone_end ||
 305                                             end_in > wnd->zone_bit
 306                                     ? wnd->nbits
 307                                     : wnd->zone_bit;
 308
 309                        while (end_in < ib && wnd_is_free_hlp(wnd, end_in, 1)) {
 310                                end_in += 1;
 311                                len += 1;
 312                        }
 313                }
 314        }
 315        /* Insert new fragment. */
 316        if (wnd->count >= NTFS_MAX_WND_EXTENTS) {
 317                if (e0)
 318                        kmem_cache_free(ntfs_enode_cachep, e0);
 319
 320                wnd->uptodated = -1;
 321
 322                /* Compare with smallest fragment. */
 323                n = rb_last(&wnd->count_tree);
 324                e = rb_entry(n, struct e_node, count.node);
 325                if (len <= e->count.key)
 326                        goto out; /* Do not insert small fragments. */
 327
 328                if (build) {
 329                        struct e_node *e2;
 330
 331                        n = rb_prev(n);
 332                        e2 = rb_entry(n, struct e_node, count.node);
 333                        /* Smallest fragment will be 'e2->count.key'. */
 334                        wnd->extent_min = e2->count.key;
 335                }
 336
 337                /* Replace smallest fragment by new one. */
 338                rb_erase(&e->start.node, &wnd->start_tree);
 339                rb_erase(&e->count.node, &wnd->count_tree);
 340                wnd->count -= 1;
 341        } else {
 342                e = e0 ? e0 : kmem_cache_alloc(ntfs_enode_cachep, GFP_ATOMIC);
 343                if (!e) {
 344                        wnd->uptodated = -1;
 345                        goto out;
 346                }
 347
 348                if (build && len <= wnd->extent_min)
 349                        wnd->extent_min = len;
 350        }
 351        e->start.key = bit;
 352        e->count.key = len;
 353        if (len > wnd->extent_max)
 354                wnd->extent_max = len;
 355
 356        rb_insert_start(&wnd->start_tree, e);
 357        rb_insert_count(&wnd->count_tree, e);
 358        wnd->count += 1;
 359
 360out:;
 361}
 362
 363/*
 364 * wnd_remove_free_ext - Remove a run from the cached free space.
 365 */
 366static void wnd_remove_free_ext(struct wnd_bitmap *wnd, size_t bit, size_t len)
 367{
 368        struct rb_node *n, *n3;
 369        struct e_node *e, *e3;
 370        size_t end_in = bit + len;
 371        size_t end3, end, new_key, new_len, max_new_len;
 372
 373        /* Try to find extent before 'bit'. */
 374        n = rb_lookup(&wnd->start_tree, bit);
 375
 376        if (!n)
 377                return;
 378
 379        e = rb_entry(n, struct e_node, start.node);
 380        end = e->start.key + e->count.key;
 381
 382        new_key = new_len = 0;
 383        len = e->count.key;
 384
 385        /* Range [bit,end_in) must be inside 'e' or outside 'e' and 'n'. */
 386        if (e->start.key > bit)
 387                ;
 388        else if (end_in <= end) {
 389                /* Range [bit,end_in) inside 'e'. */
 390                new_key = end_in;
 391                new_len = end - end_in;
 392                len = bit - e->start.key;
 393        } else if (bit > end) {
 394                bool bmax = false;
 395
 396                n3 = rb_next(n);
 397
 398                while (n3) {
 399                        e3 = rb_entry(n3, struct e_node, start.node);
 400                        if (e3->start.key >= end_in)
 401                                break;
 402
 403                        if (e3->count.key == wnd->extent_max)
 404                                bmax = true;
 405
 406                        end3 = e3->start.key + e3->count.key;
 407                        if (end3 > end_in) {
 408                                e3->start.key = end_in;
 409                                rb_erase(&e3->count.node, &wnd->count_tree);
 410                                e3->count.key = end3 - end_in;
 411                                rb_insert_count(&wnd->count_tree, e3);
 412                                break;
 413                        }
 414
 415                        n3 = rb_next(n3);
 416                        rb_erase(&e3->start.node, &wnd->start_tree);
 417                        rb_erase(&e3->count.node, &wnd->count_tree);
 418                        wnd->count -= 1;
 419                        kmem_cache_free(ntfs_enode_cachep, e3);
 420                }
 421                if (!bmax)
 422                        return;
 423                n3 = rb_first(&wnd->count_tree);
 424                wnd->extent_max =
 425                        n3 ? rb_entry(n3, struct e_node, count.node)->count.key
 426                           : 0;
 427                return;
 428        }
 429
 430        if (e->count.key != wnd->extent_max) {
 431                ;
 432        } else if (rb_prev(&e->count.node)) {
 433                ;
 434        } else {
 435                n3 = rb_next(&e->count.node);
 436                max_new_len = max(len, new_len);
 437                if (!n3) {
 438                        wnd->extent_max = max_new_len;
 439                } else {
 440                        e3 = rb_entry(n3, struct e_node, count.node);
 441                        wnd->extent_max = max(e3->count.key, max_new_len);
 442                }
 443        }
 444
 445        if (!len) {
 446                if (new_len) {
 447                        e->start.key = new_key;
 448                        rb_erase(&e->count.node, &wnd->count_tree);
 449                        e->count.key = new_len;
 450                        rb_insert_count(&wnd->count_tree, e);
 451                } else {
 452                        rb_erase(&e->start.node, &wnd->start_tree);
 453                        rb_erase(&e->count.node, &wnd->count_tree);
 454                        wnd->count -= 1;
 455                        kmem_cache_free(ntfs_enode_cachep, e);
 456                }
 457                goto out;
 458        }
 459        rb_erase(&e->count.node, &wnd->count_tree);
 460        e->count.key = len;
 461        rb_insert_count(&wnd->count_tree, e);
 462
 463        if (!new_len)
 464                goto out;
 465
 466        if (wnd->count >= NTFS_MAX_WND_EXTENTS) {
 467                wnd->uptodated = -1;
 468
 469                /* Get minimal extent. */
 470                e = rb_entry(rb_last(&wnd->count_tree), struct e_node,
 471                             count.node);
 472                if (e->count.key > new_len)
 473                        goto out;
 474
 475                /* Replace minimum. */
 476                rb_erase(&e->start.node, &wnd->start_tree);
 477                rb_erase(&e->count.node, &wnd->count_tree);
 478                wnd->count -= 1;
 479        } else {
 480                e = kmem_cache_alloc(ntfs_enode_cachep, GFP_ATOMIC);
 481                if (!e)
 482                        wnd->uptodated = -1;
 483        }
 484
 485        if (e) {
 486                e->start.key = new_key;
 487                e->count.key = new_len;
 488                rb_insert_start(&wnd->start_tree, e);
 489                rb_insert_count(&wnd->count_tree, e);
 490                wnd->count += 1;
 491        }
 492
 493out:
 494        if (!wnd->count && 1 != wnd->uptodated)
 495                wnd_rescan(wnd);
 496}
 497
 498/*
 499 * wnd_rescan - Scan all bitmap. Used while initialization.
 500 */
 501static int wnd_rescan(struct wnd_bitmap *wnd)
 502{
 503        int err = 0;
 504        size_t prev_tail = 0;
 505        struct super_block *sb = wnd->sb;
 506        struct ntfs_sb_info *sbi = sb->s_fs_info;
 507        u64 lbo, len = 0;
 508        u32 blocksize = sb->s_blocksize;
 509        u8 cluster_bits = sbi->cluster_bits;
 510        u32 wbits = 8 * sb->s_blocksize;
 511        u32 used, frb;
 512        const ulong *buf;
 513        size_t wpos, wbit, iw, vbo;
 514        struct buffer_head *bh = NULL;
 515        CLST lcn, clen;
 516
 517        wnd->uptodated = 0;
 518        wnd->extent_max = 0;
 519        wnd->extent_min = MINUS_ONE_T;
 520        wnd->total_zeroes = 0;
 521
 522        vbo = 0;
 523
 524        for (iw = 0; iw < wnd->nwnd; iw++) {
 525                if (iw + 1 == wnd->nwnd)
 526                        wbits = wnd->bits_last;
 527
 528                if (wnd->inited) {
 529                        if (!wnd->free_bits[iw]) {
 530                                /* All ones. */
 531                                if (prev_tail) {
 532                                        wnd_add_free_ext(wnd,
 533                                                         vbo * 8 - prev_tail,
 534                                                         prev_tail, true);
 535                                        prev_tail = 0;
 536                                }
 537                                goto next_wnd;
 538                        }
 539                        if (wbits == wnd->free_bits[iw]) {
 540                                /* All zeroes. */
 541                                prev_tail += wbits;
 542                                wnd->total_zeroes += wbits;
 543                                goto next_wnd;
 544                        }
 545                }
 546
 547                if (!len) {
 548                        u32 off = vbo & sbi->cluster_mask;
 549
 550                        if (!run_lookup_entry(&wnd->run, vbo >> cluster_bits,
 551                                              &lcn, &clen, NULL)) {
 552                                err = -ENOENT;
 553                                goto out;
 554                        }
 555
 556                        lbo = ((u64)lcn << cluster_bits) + off;
 557                        len = ((u64)clen << cluster_bits) - off;
 558                }
 559
 560                bh = ntfs_bread(sb, lbo >> sb->s_blocksize_bits);
 561                if (!bh) {
 562                        err = -EIO;
 563                        goto out;
 564                }
 565
 566                buf = (ulong *)bh->b_data;
 567
 568                used = __bitmap_weight(buf, wbits);
 569                if (used < wbits) {
 570                        frb = wbits - used;
 571                        wnd->free_bits[iw] = frb;
 572                        wnd->total_zeroes += frb;
 573                }
 574
 575                wpos = 0;
 576                wbit = vbo * 8;
 577
 578                if (wbit + wbits > wnd->nbits)
 579                        wbits = wnd->nbits - wbit;
 580
 581                do {
 582                        used = find_next_zero_bit(buf, wbits, wpos);
 583
 584                        if (used > wpos && prev_tail) {
 585                                wnd_add_free_ext(wnd, wbit + wpos - prev_tail,
 586                                                 prev_tail, true);
 587                                prev_tail = 0;
 588                        }
 589
 590                        wpos = used;
 591
 592                        if (wpos >= wbits) {
 593                                /* No free blocks. */
 594                                prev_tail = 0;
 595                                break;
 596                        }
 597
 598                        frb = find_next_bit(buf, wbits, wpos);
 599                        if (frb >= wbits) {
 600                                /* Keep last free block. */
 601                                prev_tail += frb - wpos;
 602                                break;
 603                        }
 604
 605                        wnd_add_free_ext(wnd, wbit + wpos - prev_tail,
 606                                         frb + prev_tail - wpos, true);
 607
 608                        /* Skip free block and first '1'. */
 609                        wpos = frb + 1;
 610                        /* Reset previous tail. */
 611                        prev_tail = 0;
 612                } while (wpos < wbits);
 613
 614next_wnd:
 615
 616                if (bh)
 617                        put_bh(bh);
 618                bh = NULL;
 619
 620                vbo += blocksize;
 621                if (len) {
 622                        len -= blocksize;
 623                        lbo += blocksize;
 624                }
 625        }
 626
 627        /* Add last block. */
 628        if (prev_tail)
 629                wnd_add_free_ext(wnd, wnd->nbits - prev_tail, prev_tail, true);
 630
 631        /*
 632         * Before init cycle wnd->uptodated was 0.
 633         * If any errors or limits occurs while initialization then
 634         * wnd->uptodated will be -1.
 635         * If 'uptodated' is still 0 then Tree is really updated.
 636         */
 637        if (!wnd->uptodated)
 638                wnd->uptodated = 1;
 639
 640        if (wnd->zone_bit != wnd->zone_end) {
 641                size_t zlen = wnd->zone_end - wnd->zone_bit;
 642
 643                wnd->zone_end = wnd->zone_bit;
 644                wnd_zone_set(wnd, wnd->zone_bit, zlen);
 645        }
 646
 647out:
 648        return err;
 649}
 650
 651int wnd_init(struct wnd_bitmap *wnd, struct super_block *sb, size_t nbits)
 652{
 653        int err;
 654        u32 blocksize = sb->s_blocksize;
 655        u32 wbits = blocksize * 8;
 656
 657        init_rwsem(&wnd->rw_lock);
 658
 659        wnd->sb = sb;
 660        wnd->nbits = nbits;
 661        wnd->total_zeroes = nbits;
 662        wnd->extent_max = MINUS_ONE_T;
 663        wnd->zone_bit = wnd->zone_end = 0;
 664        wnd->nwnd = bytes_to_block(sb, bitmap_size(nbits));
 665        wnd->bits_last = nbits & (wbits - 1);
 666        if (!wnd->bits_last)
 667                wnd->bits_last = wbits;
 668
 669        wnd->free_bits = kcalloc(wnd->nwnd, sizeof(u16), GFP_NOFS);
 670        if (!wnd->free_bits)
 671                return -ENOMEM;
 672
 673        err = wnd_rescan(wnd);
 674        if (err)
 675                return err;
 676
 677        wnd->inited = true;
 678
 679        return 0;
 680}
 681
 682/*
 683 * wnd_map - Call sb_bread for requested window.
 684 */
 685static struct buffer_head *wnd_map(struct wnd_bitmap *wnd, size_t iw)
 686{
 687        size_t vbo;
 688        CLST lcn, clen;
 689        struct super_block *sb = wnd->sb;
 690        struct ntfs_sb_info *sbi;
 691        struct buffer_head *bh;
 692        u64 lbo;
 693
 694        sbi = sb->s_fs_info;
 695        vbo = (u64)iw << sb->s_blocksize_bits;
 696
 697        if (!run_lookup_entry(&wnd->run, vbo >> sbi->cluster_bits, &lcn, &clen,
 698                              NULL)) {
 699                return ERR_PTR(-ENOENT);
 700        }
 701
 702        lbo = ((u64)lcn << sbi->cluster_bits) + (vbo & sbi->cluster_mask);
 703
 704        bh = ntfs_bread(wnd->sb, lbo >> sb->s_blocksize_bits);
 705        if (!bh)
 706                return ERR_PTR(-EIO);
 707
 708        return bh;
 709}
 710
 711/*
 712 * wnd_set_free - Mark the bits range from bit to bit + bits as free.
 713 */
 714int wnd_set_free(struct wnd_bitmap *wnd, size_t bit, size_t bits)
 715{
 716        int err = 0;
 717        struct super_block *sb = wnd->sb;
 718        size_t bits0 = bits;
 719        u32 wbits = 8 * sb->s_blocksize;
 720        size_t iw = bit >> (sb->s_blocksize_bits + 3);
 721        u32 wbit = bit & (wbits - 1);
 722        struct buffer_head *bh;
 723
 724        while (iw < wnd->nwnd && bits) {
 725                u32 tail, op;
 726                ulong *buf;
 727
 728                if (iw + 1 == wnd->nwnd)
 729                        wbits = wnd->bits_last;
 730
 731                tail = wbits - wbit;
 732                op = min_t(u32, tail, bits);
 733
 734                bh = wnd_map(wnd, iw);
 735                if (IS_ERR(bh)) {
 736                        err = PTR_ERR(bh);
 737                        break;
 738                }
 739
 740                buf = (ulong *)bh->b_data;
 741
 742                lock_buffer(bh);
 743
 744                __bitmap_clear(buf, wbit, op);
 745
 746                wnd->free_bits[iw] += op;
 747
 748                set_buffer_uptodate(bh);
 749                mark_buffer_dirty(bh);
 750                unlock_buffer(bh);
 751                put_bh(bh);
 752
 753                wnd->total_zeroes += op;
 754                bits -= op;
 755                wbit = 0;
 756                iw += 1;
 757        }
 758
 759        wnd_add_free_ext(wnd, bit, bits0, false);
 760
 761        return err;
 762}
 763
 764/*
 765 * wnd_set_used - Mark the bits range from bit to bit + bits as used.
 766 */
 767int wnd_set_used(struct wnd_bitmap *wnd, size_t bit, size_t bits)
 768{
 769        int err = 0;
 770        struct super_block *sb = wnd->sb;
 771        size_t bits0 = bits;
 772        size_t iw = bit >> (sb->s_blocksize_bits + 3);
 773        u32 wbits = 8 * sb->s_blocksize;
 774        u32 wbit = bit & (wbits - 1);
 775        struct buffer_head *bh;
 776
 777        while (iw < wnd->nwnd && bits) {
 778                u32 tail, op;
 779                ulong *buf;
 780
 781                if (unlikely(iw + 1 == wnd->nwnd))
 782                        wbits = wnd->bits_last;
 783
 784                tail = wbits - wbit;
 785                op = min_t(u32, tail, bits);
 786
 787                bh = wnd_map(wnd, iw);
 788                if (IS_ERR(bh)) {
 789                        err = PTR_ERR(bh);
 790                        break;
 791                }
 792                buf = (ulong *)bh->b_data;
 793
 794                lock_buffer(bh);
 795
 796                __bitmap_set(buf, wbit, op);
 797                wnd->free_bits[iw] -= op;
 798
 799                set_buffer_uptodate(bh);
 800                mark_buffer_dirty(bh);
 801                unlock_buffer(bh);
 802                put_bh(bh);
 803
 804                wnd->total_zeroes -= op;
 805                bits -= op;
 806                wbit = 0;
 807                iw += 1;
 808        }
 809
 810        if (!RB_EMPTY_ROOT(&wnd->start_tree))
 811                wnd_remove_free_ext(wnd, bit, bits0);
 812
 813        return err;
 814}
 815
 816/*
 817 * wnd_is_free_hlp
 818 *
 819 * Return: True if all clusters [bit, bit+bits) are free (bitmap only).
 820 */
 821static bool wnd_is_free_hlp(struct wnd_bitmap *wnd, size_t bit, size_t bits)
 822{
 823        struct super_block *sb = wnd->sb;
 824        size_t iw = bit >> (sb->s_blocksize_bits + 3);
 825        u32 wbits = 8 * sb->s_blocksize;
 826        u32 wbit = bit & (wbits - 1);
 827
 828        while (iw < wnd->nwnd && bits) {
 829                u32 tail, op;
 830
 831                if (unlikely(iw + 1 == wnd->nwnd))
 832                        wbits = wnd->bits_last;
 833
 834                tail = wbits - wbit;
 835                op = min_t(u32, tail, bits);
 836
 837                if (wbits != wnd->free_bits[iw]) {
 838                        bool ret;
 839                        struct buffer_head *bh = wnd_map(wnd, iw);
 840
 841                        if (IS_ERR(bh))
 842                                return false;
 843
 844                        ret = are_bits_clear((ulong *)bh->b_data, wbit, op);
 845
 846                        put_bh(bh);
 847                        if (!ret)
 848                                return false;
 849                }
 850
 851                bits -= op;
 852                wbit = 0;
 853                iw += 1;
 854        }
 855
 856        return true;
 857}
 858
 859/*
 860 * wnd_is_free
 861 *
 862 * Return: True if all clusters [bit, bit+bits) are free.
 863 */
 864bool wnd_is_free(struct wnd_bitmap *wnd, size_t bit, size_t bits)
 865{
 866        bool ret;
 867        struct rb_node *n;
 868        size_t end;
 869        struct e_node *e;
 870
 871        if (RB_EMPTY_ROOT(&wnd->start_tree))
 872                goto use_wnd;
 873
 874        n = rb_lookup(&wnd->start_tree, bit);
 875        if (!n)
 876                goto use_wnd;
 877
 878        e = rb_entry(n, struct e_node, start.node);
 879
 880        end = e->start.key + e->count.key;
 881
 882        if (bit < end && bit + bits <= end)
 883                return true;
 884
 885use_wnd:
 886        ret = wnd_is_free_hlp(wnd, bit, bits);
 887
 888        return ret;
 889}
 890
 891/*
 892 * wnd_is_used
 893 *
 894 * Return: True if all clusters [bit, bit+bits) are used.
 895 */
 896bool wnd_is_used(struct wnd_bitmap *wnd, size_t bit, size_t bits)
 897{
 898        bool ret = false;
 899        struct super_block *sb = wnd->sb;
 900        size_t iw = bit >> (sb->s_blocksize_bits + 3);
 901        u32 wbits = 8 * sb->s_blocksize;
 902        u32 wbit = bit & (wbits - 1);
 903        size_t end;
 904        struct rb_node *n;
 905        struct e_node *e;
 906
 907        if (RB_EMPTY_ROOT(&wnd->start_tree))
 908                goto use_wnd;
 909
 910        end = bit + bits;
 911        n = rb_lookup(&wnd->start_tree, end - 1);
 912        if (!n)
 913                goto use_wnd;
 914
 915        e = rb_entry(n, struct e_node, start.node);
 916        if (e->start.key + e->count.key > bit)
 917                return false;
 918
 919use_wnd:
 920        while (iw < wnd->nwnd && bits) {
 921                u32 tail, op;
 922
 923                if (unlikely(iw + 1 == wnd->nwnd))
 924                        wbits = wnd->bits_last;
 925
 926                tail = wbits - wbit;
 927                op = min_t(u32, tail, bits);
 928
 929                if (wnd->free_bits[iw]) {
 930                        bool ret;
 931                        struct buffer_head *bh = wnd_map(wnd, iw);
 932
 933                        if (IS_ERR(bh))
 934                                goto out;
 935
 936                        ret = are_bits_set((ulong *)bh->b_data, wbit, op);
 937                        put_bh(bh);
 938                        if (!ret)
 939                                goto out;
 940                }
 941
 942                bits -= op;
 943                wbit = 0;
 944                iw += 1;
 945        }
 946        ret = true;
 947
 948out:
 949        return ret;
 950}
 951
 952/*
 953 * wnd_find - Look for free space.
 954 *
 955 * - flags - BITMAP_FIND_XXX flags
 956 *
 957 * Return: 0 if not found.
 958 */
 959size_t wnd_find(struct wnd_bitmap *wnd, size_t to_alloc, size_t hint,
 960                size_t flags, size_t *allocated)
 961{
 962        struct super_block *sb;
 963        u32 wbits, wpos, wzbit, wzend;
 964        size_t fnd, max_alloc, b_len, b_pos;
 965        size_t iw, prev_tail, nwnd, wbit, ebit, zbit, zend;
 966        size_t to_alloc0 = to_alloc;
 967        const ulong *buf;
 968        const struct e_node *e;
 969        const struct rb_node *pr, *cr;
 970        u8 log2_bits;
 971        bool fbits_valid;
 972        struct buffer_head *bh;
 973
 974        /* Fast checking for available free space. */
 975        if (flags & BITMAP_FIND_FULL) {
 976                size_t zeroes = wnd_zeroes(wnd);
 977
 978                zeroes -= wnd->zone_end - wnd->zone_bit;
 979                if (zeroes < to_alloc0)
 980                        goto no_space;
 981
 982                if (to_alloc0 > wnd->extent_max)
 983                        goto no_space;
 984        } else {
 985                if (to_alloc > wnd->extent_max)
 986                        to_alloc = wnd->extent_max;
 987        }
 988
 989        if (wnd->zone_bit <= hint && hint < wnd->zone_end)
 990                hint = wnd->zone_end;
 991
 992        max_alloc = wnd->nbits;
 993        b_len = b_pos = 0;
 994
 995        if (hint >= max_alloc)
 996                hint = 0;
 997
 998        if (RB_EMPTY_ROOT(&wnd->start_tree)) {
 999                if (wnd->uptodated == 1) {
1000                        /* Extents tree is updated -> No free space. */
1001                        goto no_space;
1002                }
1003                goto scan_bitmap;
1004        }
1005
1006        e = NULL;
1007        if (!hint)
1008                goto allocate_biggest;
1009
1010        /* Use hint: Enumerate extents by start >= hint. */
1011        pr = NULL;
1012        cr = wnd->start_tree.rb_node;
1013
1014        for (;;) {
1015                e = rb_entry(cr, struct e_node, start.node);
1016
1017                if (e->start.key == hint)
1018                        break;
1019
1020                if (e->start.key < hint) {
1021                        pr = cr;
1022                        cr = cr->rb_right;
1023                        if (!cr)
1024                                break;
1025                        continue;
1026                }
1027
1028                cr = cr->rb_left;
1029                if (!cr) {
1030                        e = pr ? rb_entry(pr, struct e_node, start.node) : NULL;
1031                        break;
1032                }
1033        }
1034
1035        if (!e)
1036                goto allocate_biggest;
1037
1038        if (e->start.key + e->count.key > hint) {
1039                /* We have found extension with 'hint' inside. */
1040                size_t len = e->start.key + e->count.key - hint;
1041
1042                if (len >= to_alloc && hint + to_alloc <= max_alloc) {
1043                        fnd = hint;
1044                        goto found;
1045                }
1046
1047                if (!(flags & BITMAP_FIND_FULL)) {
1048                        if (len > to_alloc)
1049                                len = to_alloc;
1050
1051                        if (hint + len <= max_alloc) {
1052                                fnd = hint;
1053                                to_alloc = len;
1054                                goto found;
1055                        }
1056                }
1057        }
1058
1059allocate_biggest:
1060        /* Allocate from biggest free extent. */
1061        e = rb_entry(rb_first(&wnd->count_tree), struct e_node, count.node);
1062        if (e->count.key != wnd->extent_max)
1063                wnd->extent_max = e->count.key;
1064
1065        if (e->count.key < max_alloc) {
1066                if (e->count.key >= to_alloc) {
1067                        ;
1068                } else if (flags & BITMAP_FIND_FULL) {
1069                        if (e->count.key < to_alloc0) {
1070                                /* Biggest free block is less then requested. */
1071                                goto no_space;
1072                        }
1073                        to_alloc = e->count.key;
1074                } else if (-1 != wnd->uptodated) {
1075                        to_alloc = e->count.key;
1076                } else {
1077                        /* Check if we can use more bits. */
1078                        size_t op, max_check;
1079                        struct rb_root start_tree;
1080
1081                        memcpy(&start_tree, &wnd->start_tree,
1082                               sizeof(struct rb_root));
1083                        memset(&wnd->start_tree, 0, sizeof(struct rb_root));
1084
1085                        max_check = e->start.key + to_alloc;
1086                        if (max_check > max_alloc)
1087                                max_check = max_alloc;
1088                        for (op = e->start.key + e->count.key; op < max_check;
1089                             op++) {
1090                                if (!wnd_is_free(wnd, op, 1))
1091                                        break;
1092                        }
1093                        memcpy(&wnd->start_tree, &start_tree,
1094                               sizeof(struct rb_root));
1095                        to_alloc = op - e->start.key;
1096                }
1097
1098                /* Prepare to return. */
1099                fnd = e->start.key;
1100                if (e->start.key + to_alloc > max_alloc)
1101                        to_alloc = max_alloc - e->start.key;
1102                goto found;
1103        }
1104
1105        if (wnd->uptodated == 1) {
1106                /* Extents tree is updated -> no free space. */
1107                goto no_space;
1108        }
1109
1110        b_len = e->count.key;
1111        b_pos = e->start.key;
1112
1113scan_bitmap:
1114        sb = wnd->sb;
1115        log2_bits = sb->s_blocksize_bits + 3;
1116
1117        /* At most two ranges [hint, max_alloc) + [0, hint). */
1118Again:
1119
1120        /* TODO: Optimize request for case nbits > wbits. */
1121        iw = hint >> log2_bits;
1122        wbits = sb->s_blocksize * 8;
1123        wpos = hint & (wbits - 1);
1124        prev_tail = 0;
1125        fbits_valid = true;
1126
1127        if (max_alloc == wnd->nbits) {
1128                nwnd = wnd->nwnd;
1129        } else {
1130                size_t t = max_alloc + wbits - 1;
1131
1132                nwnd = likely(t > max_alloc) ? (t >> log2_bits) : wnd->nwnd;
1133        }
1134
1135        /* Enumerate all windows. */
1136        for (; iw < nwnd; iw++) {
1137                wbit = iw << log2_bits;
1138
1139                if (!wnd->free_bits[iw]) {
1140                        if (prev_tail > b_len) {
1141                                b_pos = wbit - prev_tail;
1142                                b_len = prev_tail;
1143                        }
1144
1145                        /* Skip full used window. */
1146                        prev_tail = 0;
1147                        wpos = 0;
1148                        continue;
1149                }
1150
1151                if (unlikely(iw + 1 == nwnd)) {
1152                        if (max_alloc == wnd->nbits) {
1153                                wbits = wnd->bits_last;
1154                        } else {
1155                                size_t t = max_alloc & (wbits - 1);
1156
1157                                if (t) {
1158                                        wbits = t;
1159                                        fbits_valid = false;
1160                                }
1161                        }
1162                }
1163
1164                if (wnd->zone_end > wnd->zone_bit) {
1165                        ebit = wbit + wbits;
1166                        zbit = max(wnd->zone_bit, wbit);
1167                        zend = min(wnd->zone_end, ebit);
1168
1169                        /* Here we have a window [wbit, ebit) and zone [zbit, zend). */
1170                        if (zend <= zbit) {
1171                                /* Zone does not overlap window. */
1172                        } else {
1173                                wzbit = zbit - wbit;
1174                                wzend = zend - wbit;
1175
1176                                /* Zone overlaps window. */
1177                                if (wnd->free_bits[iw] == wzend - wzbit) {
1178                                        prev_tail = 0;
1179                                        wpos = 0;
1180                                        continue;
1181                                }
1182
1183                                /* Scan two ranges window: [wbit, zbit) and [zend, ebit). */
1184                                bh = wnd_map(wnd, iw);
1185
1186                                if (IS_ERR(bh)) {
1187                                        /* TODO: Error */
1188                                        prev_tail = 0;
1189                                        wpos = 0;
1190                                        continue;
1191                                }
1192
1193                                buf = (ulong *)bh->b_data;
1194
1195                                /* Scan range [wbit, zbit). */
1196                                if (wpos < wzbit) {
1197                                        /* Scan range [wpos, zbit). */
1198                                        fnd = wnd_scan(buf, wbit, wpos, wzbit,
1199                                                       to_alloc, &prev_tail,
1200                                                       &b_pos, &b_len);
1201                                        if (fnd != MINUS_ONE_T) {
1202                                                put_bh(bh);
1203                                                goto found;
1204                                        }
1205                                }
1206
1207                                prev_tail = 0;
1208
1209                                /* Scan range [zend, ebit). */
1210                                if (wzend < wbits) {
1211                                        fnd = wnd_scan(buf, wbit,
1212                                                       max(wzend, wpos), wbits,
1213                                                       to_alloc, &prev_tail,
1214                                                       &b_pos, &b_len);
1215                                        if (fnd != MINUS_ONE_T) {
1216                                                put_bh(bh);
1217                                                goto found;
1218                                        }
1219                                }
1220
1221                                wpos = 0;
1222                                put_bh(bh);
1223                                continue;
1224                        }
1225                }
1226
1227                /* Current window does not overlap zone. */
1228                if (!wpos && fbits_valid && wnd->free_bits[iw] == wbits) {
1229                        /* Window is empty. */
1230                        if (prev_tail + wbits >= to_alloc) {
1231                                fnd = wbit + wpos - prev_tail;
1232                                goto found;
1233                        }
1234
1235                        /* Increase 'prev_tail' and process next window. */
1236                        prev_tail += wbits;
1237                        wpos = 0;
1238                        continue;
1239                }
1240
1241                /* Read window. */
1242                bh = wnd_map(wnd, iw);
1243                if (IS_ERR(bh)) {
1244                        // TODO: Error.
1245                        prev_tail = 0;
1246                        wpos = 0;
1247                        continue;
1248                }
1249
1250                buf = (ulong *)bh->b_data;
1251
1252                /* Scan range [wpos, eBits). */
1253                fnd = wnd_scan(buf, wbit, wpos, wbits, to_alloc, &prev_tail,
1254                               &b_pos, &b_len);
1255                put_bh(bh);
1256                if (fnd != MINUS_ONE_T)
1257                        goto found;
1258        }
1259
1260        if (b_len < prev_tail) {
1261                /* The last fragment. */
1262                b_len = prev_tail;
1263                b_pos = max_alloc - prev_tail;
1264        }
1265
1266        if (hint) {
1267                /*
1268                 * We have scanned range [hint max_alloc).
1269                 * Prepare to scan range [0 hint + to_alloc).
1270                 */
1271                size_t nextmax = hint + to_alloc;
1272
1273                if (likely(nextmax >= hint) && nextmax < max_alloc)
1274                        max_alloc = nextmax;
1275                hint = 0;
1276                goto Again;
1277        }
1278
1279        if (!b_len)
1280                goto no_space;
1281
1282        wnd->extent_max = b_len;
1283
1284        if (flags & BITMAP_FIND_FULL)
1285                goto no_space;
1286
1287        fnd = b_pos;
1288        to_alloc = b_len;
1289
1290found:
1291        if (flags & BITMAP_FIND_MARK_AS_USED) {
1292                /* TODO: Optimize remove extent (pass 'e'?). */
1293                if (wnd_set_used(wnd, fnd, to_alloc))
1294                        goto no_space;
1295        } else if (wnd->extent_max != MINUS_ONE_T &&
1296                   to_alloc > wnd->extent_max) {
1297                wnd->extent_max = to_alloc;
1298        }
1299
1300        *allocated = fnd;
1301        return to_alloc;
1302
1303no_space:
1304        return 0;
1305}
1306
1307/*
1308 * wnd_extend - Extend bitmap ($MFT bitmap).
1309 */
1310int wnd_extend(struct wnd_bitmap *wnd, size_t new_bits)
1311{
1312        int err;
1313        struct super_block *sb = wnd->sb;
1314        struct ntfs_sb_info *sbi = sb->s_fs_info;
1315        u32 blocksize = sb->s_blocksize;
1316        u32 wbits = blocksize * 8;
1317        u32 b0, new_last;
1318        size_t bits, iw, new_wnd;
1319        size_t old_bits = wnd->nbits;
1320        u16 *new_free;
1321
1322        if (new_bits <= old_bits)
1323                return -EINVAL;
1324
1325        /* Align to 8 byte boundary. */
1326        new_wnd = bytes_to_block(sb, bitmap_size(new_bits));
1327        new_last = new_bits & (wbits - 1);
1328        if (!new_last)
1329                new_last = wbits;
1330
1331        if (new_wnd != wnd->nwnd) {
1332                new_free = kmalloc(new_wnd * sizeof(u16), GFP_NOFS);
1333                if (!new_free)
1334                        return -ENOMEM;
1335
1336                if (new_free != wnd->free_bits)
1337                        memcpy(new_free, wnd->free_bits,
1338                               wnd->nwnd * sizeof(short));
1339                memset(new_free + wnd->nwnd, 0,
1340                       (new_wnd - wnd->nwnd) * sizeof(short));
1341                kfree(wnd->free_bits);
1342                wnd->free_bits = new_free;
1343        }
1344
1345        /* Zero bits [old_bits,new_bits). */
1346        bits = new_bits - old_bits;
1347        b0 = old_bits & (wbits - 1);
1348
1349        for (iw = old_bits >> (sb->s_blocksize_bits + 3); bits; iw += 1) {
1350                u32 op;
1351                size_t frb;
1352                u64 vbo, lbo, bytes;
1353                struct buffer_head *bh;
1354                ulong *buf;
1355
1356                if (iw + 1 == new_wnd)
1357                        wbits = new_last;
1358
1359                op = b0 + bits > wbits ? wbits - b0 : bits;
1360                vbo = (u64)iw * blocksize;
1361
1362                err = ntfs_vbo_to_lbo(sbi, &wnd->run, vbo, &lbo, &bytes);
1363                if (err)
1364                        break;
1365
1366                bh = ntfs_bread(sb, lbo >> sb->s_blocksize_bits);
1367                if (!bh)
1368                        return -EIO;
1369
1370                lock_buffer(bh);
1371                buf = (ulong *)bh->b_data;
1372
1373                __bitmap_clear(buf, b0, blocksize * 8 - b0);
1374                frb = wbits - __bitmap_weight(buf, wbits);
1375                wnd->total_zeroes += frb - wnd->free_bits[iw];
1376                wnd->free_bits[iw] = frb;
1377
1378                set_buffer_uptodate(bh);
1379                mark_buffer_dirty(bh);
1380                unlock_buffer(bh);
1381                /* err = sync_dirty_buffer(bh); */
1382
1383                b0 = 0;
1384                bits -= op;
1385        }
1386
1387        wnd->nbits = new_bits;
1388        wnd->nwnd = new_wnd;
1389        wnd->bits_last = new_last;
1390
1391        wnd_add_free_ext(wnd, old_bits, new_bits - old_bits, false);
1392
1393        return 0;
1394}
1395
1396void wnd_zone_set(struct wnd_bitmap *wnd, size_t lcn, size_t len)
1397{
1398        size_t zlen;
1399
1400        zlen = wnd->zone_end - wnd->zone_bit;
1401        if (zlen)
1402                wnd_add_free_ext(wnd, wnd->zone_bit, zlen, false);
1403
1404        if (!RB_EMPTY_ROOT(&wnd->start_tree) && len)
1405                wnd_remove_free_ext(wnd, lcn, len);
1406
1407        wnd->zone_bit = lcn;
1408        wnd->zone_end = lcn + len;
1409}
1410
1411int ntfs_trim_fs(struct ntfs_sb_info *sbi, struct fstrim_range *range)
1412{
1413        int err = 0;
1414        struct super_block *sb = sbi->sb;
1415        struct wnd_bitmap *wnd = &sbi->used.bitmap;
1416        u32 wbits = 8 * sb->s_blocksize;
1417        CLST len = 0, lcn = 0, done = 0;
1418        CLST minlen = bytes_to_cluster(sbi, range->minlen);
1419        CLST lcn_from = bytes_to_cluster(sbi, range->start);
1420        size_t iw = lcn_from >> (sb->s_blocksize_bits + 3);
1421        u32 wbit = lcn_from & (wbits - 1);
1422        const ulong *buf;
1423        CLST lcn_to;
1424
1425        if (!minlen)
1426                minlen = 1;
1427
1428        if (range->len == (u64)-1)
1429                lcn_to = wnd->nbits;
1430        else
1431                lcn_to = bytes_to_cluster(sbi, range->start + range->len);
1432
1433        down_read_nested(&wnd->rw_lock, BITMAP_MUTEX_CLUSTERS);
1434
1435        for (; iw < wnd->nbits; iw++, wbit = 0) {
1436                CLST lcn_wnd = iw * wbits;
1437                struct buffer_head *bh;
1438
1439                if (lcn_wnd > lcn_to)
1440                        break;
1441
1442                if (!wnd->free_bits[iw])
1443                        continue;
1444
1445                if (iw + 1 == wnd->nwnd)
1446                        wbits = wnd->bits_last;
1447
1448                if (lcn_wnd + wbits > lcn_to)
1449                        wbits = lcn_to - lcn_wnd;
1450
1451                bh = wnd_map(wnd, iw);
1452                if (IS_ERR(bh)) {
1453                        err = PTR_ERR(bh);
1454                        break;
1455                }
1456
1457                buf = (ulong *)bh->b_data;
1458
1459                for (; wbit < wbits; wbit++) {
1460                        if (!test_bit(wbit, buf)) {
1461                                if (!len)
1462                                        lcn = lcn_wnd + wbit;
1463                                len += 1;
1464                                continue;
1465                        }
1466                        if (len >= minlen) {
1467                                err = ntfs_discard(sbi, lcn, len);
1468                                if (err)
1469                                        goto out;
1470                                done += len;
1471                        }
1472                        len = 0;
1473                }
1474                put_bh(bh);
1475        }
1476
1477        /* Process the last fragment. */
1478        if (len >= minlen) {
1479                err = ntfs_discard(sbi, lcn, len);
1480                if (err)
1481                        goto out;
1482                done += len;
1483        }
1484
1485out:
1486        range->len = (u64)done << sbi->cluster_bits;
1487
1488        up_read(&wnd->rw_lock);
1489
1490        return err;
1491}
1492