root/fs/ntfs/runlist.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ntfs_rl_mm
  2. ntfs_rl_mc
  3. ntfs_rl_realloc
  4. ntfs_rl_realloc_nofail
  5. ntfs_are_rl_mergeable
  6. __ntfs_rl_merge
  7. ntfs_rl_append
  8. ntfs_rl_insert
  9. ntfs_rl_replace
  10. ntfs_rl_split
  11. ntfs_runlists_merge
  12. ntfs_mapping_pairs_decompress
  13. ntfs_rl_vcn_to_lcn
  14. ntfs_rl_find_vcn_nolock
  15. ntfs_get_nr_significant_bytes
  16. ntfs_get_size_for_mapping_pairs
  17. ntfs_write_significant_bytes
  18. ntfs_mapping_pairs_build
  19. ntfs_rl_truncate_nolock
  20. ntfs_rl_punch_nolock

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /**
   3  * runlist.c - NTFS runlist handling code.  Part of the Linux-NTFS project.
   4  *
   5  * Copyright (c) 2001-2007 Anton Altaparmakov
   6  * Copyright (c) 2002-2005 Richard Russon
   7  */
   8 
   9 #include "debug.h"
  10 #include "dir.h"
  11 #include "endian.h"
  12 #include "malloc.h"
  13 #include "ntfs.h"
  14 
  15 /**
  16  * ntfs_rl_mm - runlist memmove
  17  *
  18  * It is up to the caller to serialize access to the runlist @base.
  19  */
  20 static inline void ntfs_rl_mm(runlist_element *base, int dst, int src,
  21                 int size)
  22 {
  23         if (likely((dst != src) && (size > 0)))
  24                 memmove(base + dst, base + src, size * sizeof(*base));
  25 }
  26 
  27 /**
  28  * ntfs_rl_mc - runlist memory copy
  29  *
  30  * It is up to the caller to serialize access to the runlists @dstbase and
  31  * @srcbase.
  32  */
  33 static inline void ntfs_rl_mc(runlist_element *dstbase, int dst,
  34                 runlist_element *srcbase, int src, int size)
  35 {
  36         if (likely(size > 0))
  37                 memcpy(dstbase + dst, srcbase + src, size * sizeof(*dstbase));
  38 }
  39 
  40 /**
  41  * ntfs_rl_realloc - Reallocate memory for runlists
  42  * @rl:         original runlist
  43  * @old_size:   number of runlist elements in the original runlist @rl
  44  * @new_size:   number of runlist elements we need space for
  45  *
  46  * As the runlists grow, more memory will be required.  To prevent the
  47  * kernel having to allocate and reallocate large numbers of small bits of
  48  * memory, this function returns an entire page of memory.
  49  *
  50  * It is up to the caller to serialize access to the runlist @rl.
  51  *
  52  * N.B.  If the new allocation doesn't require a different number of pages in
  53  *       memory, the function will return the original pointer.
  54  *
  55  * On success, return a pointer to the newly allocated, or recycled, memory.
  56  * On error, return -errno. The following error codes are defined:
  57  *      -ENOMEM - Not enough memory to allocate runlist array.
  58  *      -EINVAL - Invalid parameters were passed in.
  59  */
  60 static inline runlist_element *ntfs_rl_realloc(runlist_element *rl,
  61                 int old_size, int new_size)
  62 {
  63         runlist_element *new_rl;
  64 
  65         old_size = PAGE_ALIGN(old_size * sizeof(*rl));
  66         new_size = PAGE_ALIGN(new_size * sizeof(*rl));
  67         if (old_size == new_size)
  68                 return rl;
  69 
  70         new_rl = ntfs_malloc_nofs(new_size);
  71         if (unlikely(!new_rl))
  72                 return ERR_PTR(-ENOMEM);
  73 
  74         if (likely(rl != NULL)) {
  75                 if (unlikely(old_size > new_size))
  76                         old_size = new_size;
  77                 memcpy(new_rl, rl, old_size);
  78                 ntfs_free(rl);
  79         }
  80         return new_rl;
  81 }
  82 
  83 /**
  84  * ntfs_rl_realloc_nofail - Reallocate memory for runlists
  85  * @rl:         original runlist
  86  * @old_size:   number of runlist elements in the original runlist @rl
  87  * @new_size:   number of runlist elements we need space for
  88  *
  89  * As the runlists grow, more memory will be required.  To prevent the
  90  * kernel having to allocate and reallocate large numbers of small bits of
  91  * memory, this function returns an entire page of memory.
  92  *
  93  * This function guarantees that the allocation will succeed.  It will sleep
  94  * for as long as it takes to complete the allocation.
  95  *
  96  * It is up to the caller to serialize access to the runlist @rl.
  97  *
  98  * N.B.  If the new allocation doesn't require a different number of pages in
  99  *       memory, the function will return the original pointer.
 100  *
 101  * On success, return a pointer to the newly allocated, or recycled, memory.
 102  * On error, return -errno. The following error codes are defined:
 103  *      -ENOMEM - Not enough memory to allocate runlist array.
 104  *      -EINVAL - Invalid parameters were passed in.
 105  */
 106 static inline runlist_element *ntfs_rl_realloc_nofail(runlist_element *rl,
 107                 int old_size, int new_size)
 108 {
 109         runlist_element *new_rl;
 110 
 111         old_size = PAGE_ALIGN(old_size * sizeof(*rl));
 112         new_size = PAGE_ALIGN(new_size * sizeof(*rl));
 113         if (old_size == new_size)
 114                 return rl;
 115 
 116         new_rl = ntfs_malloc_nofs_nofail(new_size);
 117         BUG_ON(!new_rl);
 118 
 119         if (likely(rl != NULL)) {
 120                 if (unlikely(old_size > new_size))
 121                         old_size = new_size;
 122                 memcpy(new_rl, rl, old_size);
 123                 ntfs_free(rl);
 124         }
 125         return new_rl;
 126 }
 127 
 128 /**
 129  * ntfs_are_rl_mergeable - test if two runlists can be joined together
 130  * @dst:        original runlist
 131  * @src:        new runlist to test for mergeability with @dst
 132  *
 133  * Test if two runlists can be joined together. For this, their VCNs and LCNs
 134  * must be adjacent.
 135  *
 136  * It is up to the caller to serialize access to the runlists @dst and @src.
 137  *
 138  * Return: true   Success, the runlists can be merged.
 139  *         false  Failure, the runlists cannot be merged.
 140  */
 141 static inline bool ntfs_are_rl_mergeable(runlist_element *dst,
 142                 runlist_element *src)
 143 {
 144         BUG_ON(!dst);
 145         BUG_ON(!src);
 146 
 147         /* We can merge unmapped regions even if they are misaligned. */
 148         if ((dst->lcn == LCN_RL_NOT_MAPPED) && (src->lcn == LCN_RL_NOT_MAPPED))
 149                 return true;
 150         /* If the runs are misaligned, we cannot merge them. */
 151         if ((dst->vcn + dst->length) != src->vcn)
 152                 return false;
 153         /* If both runs are non-sparse and contiguous, we can merge them. */
 154         if ((dst->lcn >= 0) && (src->lcn >= 0) &&
 155                         ((dst->lcn + dst->length) == src->lcn))
 156                 return true;
 157         /* If we are merging two holes, we can merge them. */
 158         if ((dst->lcn == LCN_HOLE) && (src->lcn == LCN_HOLE))
 159                 return true;
 160         /* Cannot merge. */
 161         return false;
 162 }
 163 
 164 /**
 165  * __ntfs_rl_merge - merge two runlists without testing if they can be merged
 166  * @dst:        original, destination runlist
 167  * @src:        new runlist to merge with @dst
 168  *
 169  * Merge the two runlists, writing into the destination runlist @dst. The
 170  * caller must make sure the runlists can be merged or this will corrupt the
 171  * destination runlist.
 172  *
 173  * It is up to the caller to serialize access to the runlists @dst and @src.
 174  */
 175 static inline void __ntfs_rl_merge(runlist_element *dst, runlist_element *src)
 176 {
 177         dst->length += src->length;
 178 }
 179 
 180 /**
 181  * ntfs_rl_append - append a runlist after a given element
 182  * @dst:        original runlist to be worked on
 183  * @dsize:      number of elements in @dst (including end marker)
 184  * @src:        runlist to be inserted into @dst
 185  * @ssize:      number of elements in @src (excluding end marker)
 186  * @loc:        append the new runlist @src after this element in @dst
 187  *
 188  * Append the runlist @src after element @loc in @dst.  Merge the right end of
 189  * the new runlist, if necessary. Adjust the size of the hole before the
 190  * appended runlist.
 191  *
 192  * It is up to the caller to serialize access to the runlists @dst and @src.
 193  *
 194  * On success, return a pointer to the new, combined, runlist. Note, both
 195  * runlists @dst and @src are deallocated before returning so you cannot use
 196  * the pointers for anything any more. (Strictly speaking the returned runlist
 197  * may be the same as @dst but this is irrelevant.)
 198  *
 199  * On error, return -errno. Both runlists are left unmodified. The following
 200  * error codes are defined:
 201  *      -ENOMEM - Not enough memory to allocate runlist array.
 202  *      -EINVAL - Invalid parameters were passed in.
 203  */
 204 static inline runlist_element *ntfs_rl_append(runlist_element *dst,
 205                 int dsize, runlist_element *src, int ssize, int loc)
 206 {
 207         bool right = false;     /* Right end of @src needs merging. */
 208         int marker;             /* End of the inserted runs. */
 209 
 210         BUG_ON(!dst);
 211         BUG_ON(!src);
 212 
 213         /* First, check if the right hand end needs merging. */
 214         if ((loc + 1) < dsize)
 215                 right = ntfs_are_rl_mergeable(src + ssize - 1, dst + loc + 1);
 216 
 217         /* Space required: @dst size + @src size, less one if we merged. */
 218         dst = ntfs_rl_realloc(dst, dsize, dsize + ssize - right);
 219         if (IS_ERR(dst))
 220                 return dst;
 221         /*
 222          * We are guaranteed to succeed from here so can start modifying the
 223          * original runlists.
 224          */
 225 
 226         /* First, merge the right hand end, if necessary. */
 227         if (right)
 228                 __ntfs_rl_merge(src + ssize - 1, dst + loc + 1);
 229 
 230         /* First run after the @src runs that have been inserted. */
 231         marker = loc + ssize + 1;
 232 
 233         /* Move the tail of @dst out of the way, then copy in @src. */
 234         ntfs_rl_mm(dst, marker, loc + 1 + right, dsize - (loc + 1 + right));
 235         ntfs_rl_mc(dst, loc + 1, src, 0, ssize);
 236 
 237         /* Adjust the size of the preceding hole. */
 238         dst[loc].length = dst[loc + 1].vcn - dst[loc].vcn;
 239 
 240         /* We may have changed the length of the file, so fix the end marker */
 241         if (dst[marker].lcn == LCN_ENOENT)
 242                 dst[marker].vcn = dst[marker - 1].vcn + dst[marker - 1].length;
 243 
 244         return dst;
 245 }
 246 
 247 /**
 248  * ntfs_rl_insert - insert a runlist into another
 249  * @dst:        original runlist to be worked on
 250  * @dsize:      number of elements in @dst (including end marker)
 251  * @src:        new runlist to be inserted
 252  * @ssize:      number of elements in @src (excluding end marker)
 253  * @loc:        insert the new runlist @src before this element in @dst
 254  *
 255  * Insert the runlist @src before element @loc in the runlist @dst. Merge the
 256  * left end of the new runlist, if necessary. Adjust the size of the hole
 257  * after the inserted runlist.
 258  *
 259  * It is up to the caller to serialize access to the runlists @dst and @src.
 260  *
 261  * On success, return a pointer to the new, combined, runlist. Note, both
 262  * runlists @dst and @src are deallocated before returning so you cannot use
 263  * the pointers for anything any more. (Strictly speaking the returned runlist
 264  * may be the same as @dst but this is irrelevant.)
 265  *
 266  * On error, return -errno. Both runlists are left unmodified. The following
 267  * error codes are defined:
 268  *      -ENOMEM - Not enough memory to allocate runlist array.
 269  *      -EINVAL - Invalid parameters were passed in.
 270  */
 271 static inline runlist_element *ntfs_rl_insert(runlist_element *dst,
 272                 int dsize, runlist_element *src, int ssize, int loc)
 273 {
 274         bool left = false;      /* Left end of @src needs merging. */
 275         bool disc = false;      /* Discontinuity between @dst and @src. */
 276         int marker;             /* End of the inserted runs. */
 277 
 278         BUG_ON(!dst);
 279         BUG_ON(!src);
 280 
 281         /*
 282          * disc => Discontinuity between the end of @dst and the start of @src.
 283          *         This means we might need to insert a "not mapped" run.
 284          */
 285         if (loc == 0)
 286                 disc = (src[0].vcn > 0);
 287         else {
 288                 s64 merged_length;
 289 
 290                 left = ntfs_are_rl_mergeable(dst + loc - 1, src);
 291 
 292                 merged_length = dst[loc - 1].length;
 293                 if (left)
 294                         merged_length += src->length;
 295 
 296                 disc = (src[0].vcn > dst[loc - 1].vcn + merged_length);
 297         }
 298         /*
 299          * Space required: @dst size + @src size, less one if we merged, plus
 300          * one if there was a discontinuity.
 301          */
 302         dst = ntfs_rl_realloc(dst, dsize, dsize + ssize - left + disc);
 303         if (IS_ERR(dst))
 304                 return dst;
 305         /*
 306          * We are guaranteed to succeed from here so can start modifying the
 307          * original runlist.
 308          */
 309         if (left)
 310                 __ntfs_rl_merge(dst + loc - 1, src);
 311         /*
 312          * First run after the @src runs that have been inserted.
 313          * Nominally,  @marker equals @loc + @ssize, i.e. location + number of
 314          * runs in @src.  However, if @left, then the first run in @src has
 315          * been merged with one in @dst.  And if @disc, then @dst and @src do
 316          * not meet and we need an extra run to fill the gap.
 317          */
 318         marker = loc + ssize - left + disc;
 319 
 320         /* Move the tail of @dst out of the way, then copy in @src. */
 321         ntfs_rl_mm(dst, marker, loc, dsize - loc);
 322         ntfs_rl_mc(dst, loc + disc, src, left, ssize - left);
 323 
 324         /* Adjust the VCN of the first run after the insertion... */
 325         dst[marker].vcn = dst[marker - 1].vcn + dst[marker - 1].length;
 326         /* ... and the length. */
 327         if (dst[marker].lcn == LCN_HOLE || dst[marker].lcn == LCN_RL_NOT_MAPPED)
 328                 dst[marker].length = dst[marker + 1].vcn - dst[marker].vcn;
 329 
 330         /* Writing beyond the end of the file and there is a discontinuity. */
 331         if (disc) {
 332                 if (loc > 0) {
 333                         dst[loc].vcn = dst[loc - 1].vcn + dst[loc - 1].length;
 334                         dst[loc].length = dst[loc + 1].vcn - dst[loc].vcn;
 335                 } else {
 336                         dst[loc].vcn = 0;
 337                         dst[loc].length = dst[loc + 1].vcn;
 338                 }
 339                 dst[loc].lcn = LCN_RL_NOT_MAPPED;
 340         }
 341         return dst;
 342 }
 343 
 344 /**
 345  * ntfs_rl_replace - overwrite a runlist element with another runlist
 346  * @dst:        original runlist to be worked on
 347  * @dsize:      number of elements in @dst (including end marker)
 348  * @src:        new runlist to be inserted
 349  * @ssize:      number of elements in @src (excluding end marker)
 350  * @loc:        index in runlist @dst to overwrite with @src
 351  *
 352  * Replace the runlist element @dst at @loc with @src. Merge the left and
 353  * right ends of the inserted runlist, if necessary.
 354  *
 355  * It is up to the caller to serialize access to the runlists @dst and @src.
 356  *
 357  * On success, return a pointer to the new, combined, runlist. Note, both
 358  * runlists @dst and @src are deallocated before returning so you cannot use
 359  * the pointers for anything any more. (Strictly speaking the returned runlist
 360  * may be the same as @dst but this is irrelevant.)
 361  *
 362  * On error, return -errno. Both runlists are left unmodified. The following
 363  * error codes are defined:
 364  *      -ENOMEM - Not enough memory to allocate runlist array.
 365  *      -EINVAL - Invalid parameters were passed in.
 366  */
 367 static inline runlist_element *ntfs_rl_replace(runlist_element *dst,
 368                 int dsize, runlist_element *src, int ssize, int loc)
 369 {
 370         signed delta;
 371         bool left = false;      /* Left end of @src needs merging. */
 372         bool right = false;     /* Right end of @src needs merging. */
 373         int tail;               /* Start of tail of @dst. */
 374         int marker;             /* End of the inserted runs. */
 375 
 376         BUG_ON(!dst);
 377         BUG_ON(!src);
 378 
 379         /* First, see if the left and right ends need merging. */
 380         if ((loc + 1) < dsize)
 381                 right = ntfs_are_rl_mergeable(src + ssize - 1, dst + loc + 1);
 382         if (loc > 0)
 383                 left = ntfs_are_rl_mergeable(dst + loc - 1, src);
 384         /*
 385          * Allocate some space.  We will need less if the left, right, or both
 386          * ends get merged.  The -1 accounts for the run being replaced.
 387          */
 388         delta = ssize - 1 - left - right;
 389         if (delta > 0) {
 390                 dst = ntfs_rl_realloc(dst, dsize, dsize + delta);
 391                 if (IS_ERR(dst))
 392                         return dst;
 393         }
 394         /*
 395          * We are guaranteed to succeed from here so can start modifying the
 396          * original runlists.
 397          */
 398 
 399         /* First, merge the left and right ends, if necessary. */
 400         if (right)
 401                 __ntfs_rl_merge(src + ssize - 1, dst + loc + 1);
 402         if (left)
 403                 __ntfs_rl_merge(dst + loc - 1, src);
 404         /*
 405          * Offset of the tail of @dst.  This needs to be moved out of the way
 406          * to make space for the runs to be copied from @src, i.e. the first
 407          * run of the tail of @dst.
 408          * Nominally, @tail equals @loc + 1, i.e. location, skipping the
 409          * replaced run.  However, if @right, then one of @dst's runs is
 410          * already merged into @src.
 411          */
 412         tail = loc + right + 1;
 413         /*
 414          * First run after the @src runs that have been inserted, i.e. where
 415          * the tail of @dst needs to be moved to.
 416          * Nominally, @marker equals @loc + @ssize, i.e. location + number of
 417          * runs in @src.  However, if @left, then the first run in @src has
 418          * been merged with one in @dst.
 419          */
 420         marker = loc + ssize - left;
 421 
 422         /* Move the tail of @dst out of the way, then copy in @src. */
 423         ntfs_rl_mm(dst, marker, tail, dsize - tail);
 424         ntfs_rl_mc(dst, loc, src, left, ssize - left);
 425 
 426         /* We may have changed the length of the file, so fix the end marker. */
 427         if (dsize - tail > 0 && dst[marker].lcn == LCN_ENOENT)
 428                 dst[marker].vcn = dst[marker - 1].vcn + dst[marker - 1].length;
 429         return dst;
 430 }
 431 
 432 /**
 433  * ntfs_rl_split - insert a runlist into the centre of a hole
 434  * @dst:        original runlist to be worked on
 435  * @dsize:      number of elements in @dst (including end marker)
 436  * @src:        new runlist to be inserted
 437  * @ssize:      number of elements in @src (excluding end marker)
 438  * @loc:        index in runlist @dst at which to split and insert @src
 439  *
 440  * Split the runlist @dst at @loc into two and insert @new in between the two
 441  * fragments. No merging of runlists is necessary. Adjust the size of the
 442  * holes either side.
 443  *
 444  * It is up to the caller to serialize access to the runlists @dst and @src.
 445  *
 446  * On success, return a pointer to the new, combined, runlist. Note, both
 447  * runlists @dst and @src are deallocated before returning so you cannot use
 448  * the pointers for anything any more. (Strictly speaking the returned runlist
 449  * may be the same as @dst but this is irrelevant.)
 450  *
 451  * On error, return -errno. Both runlists are left unmodified. The following
 452  * error codes are defined:
 453  *      -ENOMEM - Not enough memory to allocate runlist array.
 454  *      -EINVAL - Invalid parameters were passed in.
 455  */
 456 static inline runlist_element *ntfs_rl_split(runlist_element *dst, int dsize,
 457                 runlist_element *src, int ssize, int loc)
 458 {
 459         BUG_ON(!dst);
 460         BUG_ON(!src);
 461 
 462         /* Space required: @dst size + @src size + one new hole. */
 463         dst = ntfs_rl_realloc(dst, dsize, dsize + ssize + 1);
 464         if (IS_ERR(dst))
 465                 return dst;
 466         /*
 467          * We are guaranteed to succeed from here so can start modifying the
 468          * original runlists.
 469          */
 470 
 471         /* Move the tail of @dst out of the way, then copy in @src. */
 472         ntfs_rl_mm(dst, loc + 1 + ssize, loc, dsize - loc);
 473         ntfs_rl_mc(dst, loc + 1, src, 0, ssize);
 474 
 475         /* Adjust the size of the holes either size of @src. */
 476         dst[loc].length         = dst[loc+1].vcn       - dst[loc].vcn;
 477         dst[loc+ssize+1].vcn    = dst[loc+ssize].vcn   + dst[loc+ssize].length;
 478         dst[loc+ssize+1].length = dst[loc+ssize+2].vcn - dst[loc+ssize+1].vcn;
 479 
 480         return dst;
 481 }
 482 
 483 /**
 484  * ntfs_runlists_merge - merge two runlists into one
 485  * @drl:        original runlist to be worked on
 486  * @srl:        new runlist to be merged into @drl
 487  *
 488  * First we sanity check the two runlists @srl and @drl to make sure that they
 489  * are sensible and can be merged. The runlist @srl must be either after the
 490  * runlist @drl or completely within a hole (or unmapped region) in @drl.
 491  *
 492  * It is up to the caller to serialize access to the runlists @drl and @srl.
 493  *
 494  * Merging of runlists is necessary in two cases:
 495  *   1. When attribute lists are used and a further extent is being mapped.
 496  *   2. When new clusters are allocated to fill a hole or extend a file.
 497  *
 498  * There are four possible ways @srl can be merged. It can:
 499  *      - be inserted at the beginning of a hole,
 500  *      - split the hole in two and be inserted between the two fragments,
 501  *      - be appended at the end of a hole, or it can
 502  *      - replace the whole hole.
 503  * It can also be appended to the end of the runlist, which is just a variant
 504  * of the insert case.
 505  *
 506  * On success, return a pointer to the new, combined, runlist. Note, both
 507  * runlists @drl and @srl are deallocated before returning so you cannot use
 508  * the pointers for anything any more. (Strictly speaking the returned runlist
 509  * may be the same as @dst but this is irrelevant.)
 510  *
 511  * On error, return -errno. Both runlists are left unmodified. The following
 512  * error codes are defined:
 513  *      -ENOMEM - Not enough memory to allocate runlist array.
 514  *      -EINVAL - Invalid parameters were passed in.
 515  *      -ERANGE - The runlists overlap and cannot be merged.
 516  */
 517 runlist_element *ntfs_runlists_merge(runlist_element *drl,
 518                 runlist_element *srl)
 519 {
 520         int di, si;             /* Current index into @[ds]rl. */
 521         int sstart;             /* First index with lcn > LCN_RL_NOT_MAPPED. */
 522         int dins;               /* Index into @drl at which to insert @srl. */
 523         int dend, send;         /* Last index into @[ds]rl. */
 524         int dfinal, sfinal;     /* The last index into @[ds]rl with
 525                                    lcn >= LCN_HOLE. */
 526         int marker = 0;
 527         VCN marker_vcn = 0;
 528 
 529 #ifdef DEBUG
 530         ntfs_debug("dst:");
 531         ntfs_debug_dump_runlist(drl);
 532         ntfs_debug("src:");
 533         ntfs_debug_dump_runlist(srl);
 534 #endif
 535 
 536         /* Check for silly calling... */
 537         if (unlikely(!srl))
 538                 return drl;
 539         if (IS_ERR(srl) || IS_ERR(drl))
 540                 return ERR_PTR(-EINVAL);
 541 
 542         /* Check for the case where the first mapping is being done now. */
 543         if (unlikely(!drl)) {
 544                 drl = srl;
 545                 /* Complete the source runlist if necessary. */
 546                 if (unlikely(drl[0].vcn)) {
 547                         /* Scan to the end of the source runlist. */
 548                         for (dend = 0; likely(drl[dend].length); dend++)
 549                                 ;
 550                         dend++;
 551                         drl = ntfs_rl_realloc(drl, dend, dend + 1);
 552                         if (IS_ERR(drl))
 553                                 return drl;
 554                         /* Insert start element at the front of the runlist. */
 555                         ntfs_rl_mm(drl, 1, 0, dend);
 556                         drl[0].vcn = 0;
 557                         drl[0].lcn = LCN_RL_NOT_MAPPED;
 558                         drl[0].length = drl[1].vcn;
 559                 }
 560                 goto finished;
 561         }
 562 
 563         si = di = 0;
 564 
 565         /* Skip any unmapped start element(s) in the source runlist. */
 566         while (srl[si].length && srl[si].lcn < LCN_HOLE)
 567                 si++;
 568 
 569         /* Can't have an entirely unmapped source runlist. */
 570         BUG_ON(!srl[si].length);
 571 
 572         /* Record the starting points. */
 573         sstart = si;
 574 
 575         /*
 576          * Skip forward in @drl until we reach the position where @srl needs to
 577          * be inserted. If we reach the end of @drl, @srl just needs to be
 578          * appended to @drl.
 579          */
 580         for (; drl[di].length; di++) {
 581                 if (drl[di].vcn + drl[di].length > srl[sstart].vcn)
 582                         break;
 583         }
 584         dins = di;
 585 
 586         /* Sanity check for illegal overlaps. */
 587         if ((drl[di].vcn == srl[si].vcn) && (drl[di].lcn >= 0) &&
 588                         (srl[si].lcn >= 0)) {
 589                 ntfs_error(NULL, "Run lists overlap. Cannot merge!");
 590                 return ERR_PTR(-ERANGE);
 591         }
 592 
 593         /* Scan to the end of both runlists in order to know their sizes. */
 594         for (send = si; srl[send].length; send++)
 595                 ;
 596         for (dend = di; drl[dend].length; dend++)
 597                 ;
 598 
 599         if (srl[send].lcn == LCN_ENOENT)
 600                 marker_vcn = srl[marker = send].vcn;
 601 
 602         /* Scan to the last element with lcn >= LCN_HOLE. */
 603         for (sfinal = send; sfinal >= 0 && srl[sfinal].lcn < LCN_HOLE; sfinal--)
 604                 ;
 605         for (dfinal = dend; dfinal >= 0 && drl[dfinal].lcn < LCN_HOLE; dfinal--)
 606                 ;
 607 
 608         {
 609         bool start;
 610         bool finish;
 611         int ds = dend + 1;              /* Number of elements in drl & srl */
 612         int ss = sfinal - sstart + 1;
 613 
 614         start  = ((drl[dins].lcn <  LCN_RL_NOT_MAPPED) ||    /* End of file   */
 615                   (drl[dins].vcn == srl[sstart].vcn));       /* Start of hole */
 616         finish = ((drl[dins].lcn >= LCN_RL_NOT_MAPPED) &&    /* End of file   */
 617                  ((drl[dins].vcn + drl[dins].length) <=      /* End of hole   */
 618                   (srl[send - 1].vcn + srl[send - 1].length)));
 619 
 620         /* Or we will lose an end marker. */
 621         if (finish && !drl[dins].length)
 622                 ss++;
 623         if (marker && (drl[dins].vcn + drl[dins].length > srl[send - 1].vcn))
 624                 finish = false;
 625 #if 0
 626         ntfs_debug("dfinal = %i, dend = %i", dfinal, dend);
 627         ntfs_debug("sstart = %i, sfinal = %i, send = %i", sstart, sfinal, send);
 628         ntfs_debug("start = %i, finish = %i", start, finish);
 629         ntfs_debug("ds = %i, ss = %i, dins = %i", ds, ss, dins);
 630 #endif
 631         if (start) {
 632                 if (finish)
 633                         drl = ntfs_rl_replace(drl, ds, srl + sstart, ss, dins);
 634                 else
 635                         drl = ntfs_rl_insert(drl, ds, srl + sstart, ss, dins);
 636         } else {
 637                 if (finish)
 638                         drl = ntfs_rl_append(drl, ds, srl + sstart, ss, dins);
 639                 else
 640                         drl = ntfs_rl_split(drl, ds, srl + sstart, ss, dins);
 641         }
 642         if (IS_ERR(drl)) {
 643                 ntfs_error(NULL, "Merge failed.");
 644                 return drl;
 645         }
 646         ntfs_free(srl);
 647         if (marker) {
 648                 ntfs_debug("Triggering marker code.");
 649                 for (ds = dend; drl[ds].length; ds++)
 650                         ;
 651                 /* We only need to care if @srl ended after @drl. */
 652                 if (drl[ds].vcn <= marker_vcn) {
 653                         int slots = 0;
 654 
 655                         if (drl[ds].vcn == marker_vcn) {
 656                                 ntfs_debug("Old marker = 0x%llx, replacing "
 657                                                 "with LCN_ENOENT.",
 658                                                 (unsigned long long)
 659                                                 drl[ds].lcn);
 660                                 drl[ds].lcn = LCN_ENOENT;
 661                                 goto finished;
 662                         }
 663                         /*
 664                          * We need to create an unmapped runlist element in
 665                          * @drl or extend an existing one before adding the
 666                          * ENOENT terminator.
 667                          */
 668                         if (drl[ds].lcn == LCN_ENOENT) {
 669                                 ds--;
 670                                 slots = 1;
 671                         }
 672                         if (drl[ds].lcn != LCN_RL_NOT_MAPPED) {
 673                                 /* Add an unmapped runlist element. */
 674                                 if (!slots) {
 675                                         drl = ntfs_rl_realloc_nofail(drl, ds,
 676                                                         ds + 2);
 677                                         slots = 2;
 678                                 }
 679                                 ds++;
 680                                 /* Need to set vcn if it isn't set already. */
 681                                 if (slots != 1)
 682                                         drl[ds].vcn = drl[ds - 1].vcn +
 683                                                         drl[ds - 1].length;
 684                                 drl[ds].lcn = LCN_RL_NOT_MAPPED;
 685                                 /* We now used up a slot. */
 686                                 slots--;
 687                         }
 688                         drl[ds].length = marker_vcn - drl[ds].vcn;
 689                         /* Finally add the ENOENT terminator. */
 690                         ds++;
 691                         if (!slots)
 692                                 drl = ntfs_rl_realloc_nofail(drl, ds, ds + 1);
 693                         drl[ds].vcn = marker_vcn;
 694                         drl[ds].lcn = LCN_ENOENT;
 695                         drl[ds].length = (s64)0;
 696                 }
 697         }
 698         }
 699 
 700 finished:
 701         /* The merge was completed successfully. */
 702         ntfs_debug("Merged runlist:");
 703         ntfs_debug_dump_runlist(drl);
 704         return drl;
 705 }
 706 
 707 /**
 708  * ntfs_mapping_pairs_decompress - convert mapping pairs array to runlist
 709  * @vol:        ntfs volume on which the attribute resides
 710  * @attr:       attribute record whose mapping pairs array to decompress
 711  * @old_rl:     optional runlist in which to insert @attr's runlist
 712  *
 713  * It is up to the caller to serialize access to the runlist @old_rl.
 714  *
 715  * Decompress the attribute @attr's mapping pairs array into a runlist. On
 716  * success, return the decompressed runlist.
 717  *
 718  * If @old_rl is not NULL, decompressed runlist is inserted into the
 719  * appropriate place in @old_rl and the resultant, combined runlist is
 720  * returned. The original @old_rl is deallocated.
 721  *
 722  * On error, return -errno. @old_rl is left unmodified in that case.
 723  *
 724  * The following error codes are defined:
 725  *      -ENOMEM - Not enough memory to allocate runlist array.
 726  *      -EIO    - Corrupt runlist.
 727  *      -EINVAL - Invalid parameters were passed in.
 728  *      -ERANGE - The two runlists overlap.
 729  *
 730  * FIXME: For now we take the conceptionally simplest approach of creating the
 731  * new runlist disregarding the already existing one and then splicing the
 732  * two into one, if that is possible (we check for overlap and discard the new
 733  * runlist if overlap present before returning ERR_PTR(-ERANGE)).
 734  */
 735 runlist_element *ntfs_mapping_pairs_decompress(const ntfs_volume *vol,
 736                 const ATTR_RECORD *attr, runlist_element *old_rl)
 737 {
 738         VCN vcn;                /* Current vcn. */
 739         LCN lcn;                /* Current lcn. */
 740         s64 deltaxcn;           /* Change in [vl]cn. */
 741         runlist_element *rl;    /* The output runlist. */
 742         u8 *buf;                /* Current position in mapping pairs array. */
 743         u8 *attr_end;           /* End of attribute. */
 744         int rlsize;             /* Size of runlist buffer. */
 745         u16 rlpos;              /* Current runlist position in units of
 746                                    runlist_elements. */
 747         u8 b;                   /* Current byte offset in buf. */
 748 
 749 #ifdef DEBUG
 750         /* Make sure attr exists and is non-resident. */
 751         if (!attr || !attr->non_resident || sle64_to_cpu(
 752                         attr->data.non_resident.lowest_vcn) < (VCN)0) {
 753                 ntfs_error(vol->sb, "Invalid arguments.");
 754                 return ERR_PTR(-EINVAL);
 755         }
 756 #endif
 757         /* Start at vcn = lowest_vcn and lcn 0. */
 758         vcn = sle64_to_cpu(attr->data.non_resident.lowest_vcn);
 759         lcn = 0;
 760         /* Get start of the mapping pairs array. */
 761         buf = (u8*)attr + le16_to_cpu(
 762                         attr->data.non_resident.mapping_pairs_offset);
 763         attr_end = (u8*)attr + le32_to_cpu(attr->length);
 764         if (unlikely(buf < (u8*)attr || buf > attr_end)) {
 765                 ntfs_error(vol->sb, "Corrupt attribute.");
 766                 return ERR_PTR(-EIO);
 767         }
 768         /* If the mapping pairs array is valid but empty, nothing to do. */
 769         if (!vcn && !*buf)
 770                 return old_rl;
 771         /* Current position in runlist array. */
 772         rlpos = 0;
 773         /* Allocate first page and set current runlist size to one page. */
 774         rl = ntfs_malloc_nofs(rlsize = PAGE_SIZE);
 775         if (unlikely(!rl))
 776                 return ERR_PTR(-ENOMEM);
 777         /* Insert unmapped starting element if necessary. */
 778         if (vcn) {
 779                 rl->vcn = 0;
 780                 rl->lcn = LCN_RL_NOT_MAPPED;
 781                 rl->length = vcn;
 782                 rlpos++;
 783         }
 784         while (buf < attr_end && *buf) {
 785                 /*
 786                  * Allocate more memory if needed, including space for the
 787                  * not-mapped and terminator elements. ntfs_malloc_nofs()
 788                  * operates on whole pages only.
 789                  */
 790                 if (((rlpos + 3) * sizeof(*old_rl)) > rlsize) {
 791                         runlist_element *rl2;
 792 
 793                         rl2 = ntfs_malloc_nofs(rlsize + (int)PAGE_SIZE);
 794                         if (unlikely(!rl2)) {
 795                                 ntfs_free(rl);
 796                                 return ERR_PTR(-ENOMEM);
 797                         }
 798                         memcpy(rl2, rl, rlsize);
 799                         ntfs_free(rl);
 800                         rl = rl2;
 801                         rlsize += PAGE_SIZE;
 802                 }
 803                 /* Enter the current vcn into the current runlist element. */
 804                 rl[rlpos].vcn = vcn;
 805                 /*
 806                  * Get the change in vcn, i.e. the run length in clusters.
 807                  * Doing it this way ensures that we signextend negative values.
 808                  * A negative run length doesn't make any sense, but hey, I
 809                  * didn't make up the NTFS specs and Windows NT4 treats the run
 810                  * length as a signed value so that's how it is...
 811                  */
 812                 b = *buf & 0xf;
 813                 if (b) {
 814                         if (unlikely(buf + b > attr_end))
 815                                 goto io_error;
 816                         for (deltaxcn = (s8)buf[b--]; b; b--)
 817                                 deltaxcn = (deltaxcn << 8) + buf[b];
 818                 } else { /* The length entry is compulsory. */
 819                         ntfs_error(vol->sb, "Missing length entry in mapping "
 820                                         "pairs array.");
 821                         deltaxcn = (s64)-1;
 822                 }
 823                 /*
 824                  * Assume a negative length to indicate data corruption and
 825                  * hence clean-up and return NULL.
 826                  */
 827                 if (unlikely(deltaxcn < 0)) {
 828                         ntfs_error(vol->sb, "Invalid length in mapping pairs "
 829                                         "array.");
 830                         goto err_out;
 831                 }
 832                 /*
 833                  * Enter the current run length into the current runlist
 834                  * element.
 835                  */
 836                 rl[rlpos].length = deltaxcn;
 837                 /* Increment the current vcn by the current run length. */
 838                 vcn += deltaxcn;
 839                 /*
 840                  * There might be no lcn change at all, as is the case for
 841                  * sparse clusters on NTFS 3.0+, in which case we set the lcn
 842                  * to LCN_HOLE.
 843                  */
 844                 if (!(*buf & 0xf0))
 845                         rl[rlpos].lcn = LCN_HOLE;
 846                 else {
 847                         /* Get the lcn change which really can be negative. */
 848                         u8 b2 = *buf & 0xf;
 849                         b = b2 + ((*buf >> 4) & 0xf);
 850                         if (buf + b > attr_end)
 851                                 goto io_error;
 852                         for (deltaxcn = (s8)buf[b--]; b > b2; b--)
 853                                 deltaxcn = (deltaxcn << 8) + buf[b];
 854                         /* Change the current lcn to its new value. */
 855                         lcn += deltaxcn;
 856 #ifdef DEBUG
 857                         /*
 858                          * On NTFS 1.2-, apparently can have lcn == -1 to
 859                          * indicate a hole. But we haven't verified ourselves
 860                          * whether it is really the lcn or the deltaxcn that is
 861                          * -1. So if either is found give us a message so we
 862                          * can investigate it further!
 863                          */
 864                         if (vol->major_ver < 3) {
 865                                 if (unlikely(deltaxcn == (LCN)-1))
 866                                         ntfs_error(vol->sb, "lcn delta == -1");
 867                                 if (unlikely(lcn == (LCN)-1))
 868                                         ntfs_error(vol->sb, "lcn == -1");
 869                         }
 870 #endif
 871                         /* Check lcn is not below -1. */
 872                         if (unlikely(lcn < (LCN)-1)) {
 873                                 ntfs_error(vol->sb, "Invalid LCN < -1 in "
 874                                                 "mapping pairs array.");
 875                                 goto err_out;
 876                         }
 877                         /* Enter the current lcn into the runlist element. */
 878                         rl[rlpos].lcn = lcn;
 879                 }
 880                 /* Get to the next runlist element. */
 881                 rlpos++;
 882                 /* Increment the buffer position to the next mapping pair. */
 883                 buf += (*buf & 0xf) + ((*buf >> 4) & 0xf) + 1;
 884         }
 885         if (unlikely(buf >= attr_end))
 886                 goto io_error;
 887         /*
 888          * If there is a highest_vcn specified, it must be equal to the final
 889          * vcn in the runlist - 1, or something has gone badly wrong.
 890          */
 891         deltaxcn = sle64_to_cpu(attr->data.non_resident.highest_vcn);
 892         if (unlikely(deltaxcn && vcn - 1 != deltaxcn)) {
 893 mpa_err:
 894                 ntfs_error(vol->sb, "Corrupt mapping pairs array in "
 895                                 "non-resident attribute.");
 896                 goto err_out;
 897         }
 898         /* Setup not mapped runlist element if this is the base extent. */
 899         if (!attr->data.non_resident.lowest_vcn) {
 900                 VCN max_cluster;
 901 
 902                 max_cluster = ((sle64_to_cpu(
 903                                 attr->data.non_resident.allocated_size) +
 904                                 vol->cluster_size - 1) >>
 905                                 vol->cluster_size_bits) - 1;
 906                 /*
 907                  * A highest_vcn of zero means this is a single extent
 908                  * attribute so simply terminate the runlist with LCN_ENOENT).
 909                  */
 910                 if (deltaxcn) {
 911                         /*
 912                          * If there is a difference between the highest_vcn and
 913                          * the highest cluster, the runlist is either corrupt
 914                          * or, more likely, there are more extents following
 915                          * this one.
 916                          */
 917                         if (deltaxcn < max_cluster) {
 918                                 ntfs_debug("More extents to follow; deltaxcn "
 919                                                 "= 0x%llx, max_cluster = "
 920                                                 "0x%llx",
 921                                                 (unsigned long long)deltaxcn,
 922                                                 (unsigned long long)
 923                                                 max_cluster);
 924                                 rl[rlpos].vcn = vcn;
 925                                 vcn += rl[rlpos].length = max_cluster -
 926                                                 deltaxcn;
 927                                 rl[rlpos].lcn = LCN_RL_NOT_MAPPED;
 928                                 rlpos++;
 929                         } else if (unlikely(deltaxcn > max_cluster)) {
 930                                 ntfs_error(vol->sb, "Corrupt attribute.  "
 931                                                 "deltaxcn = 0x%llx, "
 932                                                 "max_cluster = 0x%llx",
 933                                                 (unsigned long long)deltaxcn,
 934                                                 (unsigned long long)
 935                                                 max_cluster);
 936                                 goto mpa_err;
 937                         }
 938                 }
 939                 rl[rlpos].lcn = LCN_ENOENT;
 940         } else /* Not the base extent. There may be more extents to follow. */
 941                 rl[rlpos].lcn = LCN_RL_NOT_MAPPED;
 942 
 943         /* Setup terminating runlist element. */
 944         rl[rlpos].vcn = vcn;
 945         rl[rlpos].length = (s64)0;
 946         /* If no existing runlist was specified, we are done. */
 947         if (!old_rl) {
 948                 ntfs_debug("Mapping pairs array successfully decompressed:");
 949                 ntfs_debug_dump_runlist(rl);
 950                 return rl;
 951         }
 952         /* Now combine the new and old runlists checking for overlaps. */
 953         old_rl = ntfs_runlists_merge(old_rl, rl);
 954         if (!IS_ERR(old_rl))
 955                 return old_rl;
 956         ntfs_free(rl);
 957         ntfs_error(vol->sb, "Failed to merge runlists.");
 958         return old_rl;
 959 io_error:
 960         ntfs_error(vol->sb, "Corrupt attribute.");
 961 err_out:
 962         ntfs_free(rl);
 963         return ERR_PTR(-EIO);
 964 }
 965 
 966 /**
 967  * ntfs_rl_vcn_to_lcn - convert a vcn into a lcn given a runlist
 968  * @rl:         runlist to use for conversion
 969  * @vcn:        vcn to convert
 970  *
 971  * Convert the virtual cluster number @vcn of an attribute into a logical
 972  * cluster number (lcn) of a device using the runlist @rl to map vcns to their
 973  * corresponding lcns.
 974  *
 975  * It is up to the caller to serialize access to the runlist @rl.
 976  *
 977  * Since lcns must be >= 0, we use negative return codes with special meaning:
 978  *
 979  * Return code          Meaning / Description
 980  * ==================================================
 981  *  LCN_HOLE            Hole / not allocated on disk.
 982  *  LCN_RL_NOT_MAPPED   This is part of the runlist which has not been
 983  *                      inserted into the runlist yet.
 984  *  LCN_ENOENT          There is no such vcn in the attribute.
 985  *
 986  * Locking: - The caller must have locked the runlist (for reading or writing).
 987  *          - This function does not touch the lock, nor does it modify the
 988  *            runlist.
 989  */
 990 LCN ntfs_rl_vcn_to_lcn(const runlist_element *rl, const VCN vcn)
 991 {
 992         int i;
 993 
 994         BUG_ON(vcn < 0);
 995         /*
 996          * If rl is NULL, assume that we have found an unmapped runlist. The
 997          * caller can then attempt to map it and fail appropriately if
 998          * necessary.
 999          */
1000         if (unlikely(!rl))
1001                 return LCN_RL_NOT_MAPPED;
1002 
1003         /* Catch out of lower bounds vcn. */
1004         if (unlikely(vcn < rl[0].vcn))
1005                 return LCN_ENOENT;
1006 
1007         for (i = 0; likely(rl[i].length); i++) {
1008                 if (unlikely(vcn < rl[i+1].vcn)) {
1009                         if (likely(rl[i].lcn >= (LCN)0))
1010                                 return rl[i].lcn + (vcn - rl[i].vcn);
1011                         return rl[i].lcn;
1012                 }
1013         }
1014         /*
1015          * The terminator element is setup to the correct value, i.e. one of
1016          * LCN_HOLE, LCN_RL_NOT_MAPPED, or LCN_ENOENT.
1017          */
1018         if (likely(rl[i].lcn < (LCN)0))
1019                 return rl[i].lcn;
1020         /* Just in case... We could replace this with BUG() some day. */
1021         return LCN_ENOENT;
1022 }
1023 
1024 #ifdef NTFS_RW
1025 
1026 /**
1027  * ntfs_rl_find_vcn_nolock - find a vcn in a runlist
1028  * @rl:         runlist to search
1029  * @vcn:        vcn to find
1030  *
1031  * Find the virtual cluster number @vcn in the runlist @rl and return the
1032  * address of the runlist element containing the @vcn on success.
1033  *
1034  * Return NULL if @rl is NULL or @vcn is in an unmapped part/out of bounds of
1035  * the runlist.
1036  *
1037  * Locking: The runlist must be locked on entry.
1038  */
1039 runlist_element *ntfs_rl_find_vcn_nolock(runlist_element *rl, const VCN vcn)
1040 {
1041         BUG_ON(vcn < 0);
1042         if (unlikely(!rl || vcn < rl[0].vcn))
1043                 return NULL;
1044         while (likely(rl->length)) {
1045                 if (unlikely(vcn < rl[1].vcn)) {
1046                         if (likely(rl->lcn >= LCN_HOLE))
1047                                 return rl;
1048                         return NULL;
1049                 }
1050                 rl++;
1051         }
1052         if (likely(rl->lcn == LCN_ENOENT))
1053                 return rl;
1054         return NULL;
1055 }
1056 
1057 /**
1058  * ntfs_get_nr_significant_bytes - get number of bytes needed to store a number
1059  * @n:          number for which to get the number of bytes for
1060  *
1061  * Return the number of bytes required to store @n unambiguously as
1062  * a signed number.
1063  *
1064  * This is used in the context of the mapping pairs array to determine how
1065  * many bytes will be needed in the array to store a given logical cluster
1066  * number (lcn) or a specific run length.
1067  *
1068  * Return the number of bytes written.  This function cannot fail.
1069  */
1070 static inline int ntfs_get_nr_significant_bytes(const s64 n)
1071 {
1072         s64 l = n;
1073         int i;
1074         s8 j;
1075 
1076         i = 0;
1077         do {
1078                 l >>= 8;
1079                 i++;
1080         } while (l != 0 && l != -1);
1081         j = (n >> 8 * (i - 1)) & 0xff;
1082         /* If the sign bit is wrong, we need an extra byte. */
1083         if ((n < 0 && j >= 0) || (n > 0 && j < 0))
1084                 i++;
1085         return i;
1086 }
1087 
1088 /**
1089  * ntfs_get_size_for_mapping_pairs - get bytes needed for mapping pairs array
1090  * @vol:        ntfs volume (needed for the ntfs version)
1091  * @rl:         locked runlist to determine the size of the mapping pairs of
1092  * @first_vcn:  first vcn which to include in the mapping pairs array
1093  * @last_vcn:   last vcn which to include in the mapping pairs array
1094  *
1095  * Walk the locked runlist @rl and calculate the size in bytes of the mapping
1096  * pairs array corresponding to the runlist @rl, starting at vcn @first_vcn and
1097  * finishing with vcn @last_vcn.
1098  *
1099  * A @last_vcn of -1 means end of runlist and in that case the size of the
1100  * mapping pairs array corresponding to the runlist starting at vcn @first_vcn
1101  * and finishing at the end of the runlist is determined.
1102  *
1103  * This for example allows us to allocate a buffer of the right size when
1104  * building the mapping pairs array.
1105  *
1106  * If @rl is NULL, just return 1 (for the single terminator byte).
1107  *
1108  * Return the calculated size in bytes on success.  On error, return -errno.
1109  * The following error codes are defined:
1110  *      -EINVAL - Run list contains unmapped elements.  Make sure to only pass
1111  *                fully mapped runlists to this function.
1112  *      -EIO    - The runlist is corrupt.
1113  *
1114  * Locking: @rl must be locked on entry (either for reading or writing), it
1115  *          remains locked throughout, and is left locked upon return.
1116  */
1117 int ntfs_get_size_for_mapping_pairs(const ntfs_volume *vol,
1118                 const runlist_element *rl, const VCN first_vcn,
1119                 const VCN last_vcn)
1120 {
1121         LCN prev_lcn;
1122         int rls;
1123         bool the_end = false;
1124 
1125         BUG_ON(first_vcn < 0);
1126         BUG_ON(last_vcn < -1);
1127         BUG_ON(last_vcn >= 0 && first_vcn > last_vcn);
1128         if (!rl) {
1129                 BUG_ON(first_vcn);
1130                 BUG_ON(last_vcn > 0);
1131                 return 1;
1132         }
1133         /* Skip to runlist element containing @first_vcn. */
1134         while (rl->length && first_vcn >= rl[1].vcn)
1135                 rl++;
1136         if (unlikely((!rl->length && first_vcn > rl->vcn) ||
1137                         first_vcn < rl->vcn))
1138                 return -EINVAL;
1139         prev_lcn = 0;
1140         /* Always need the termining zero byte. */
1141         rls = 1;
1142         /* Do the first partial run if present. */
1143         if (first_vcn > rl->vcn) {
1144                 s64 delta, length = rl->length;
1145 
1146                 /* We know rl->length != 0 already. */
1147                 if (unlikely(length < 0 || rl->lcn < LCN_HOLE))
1148                         goto err_out;
1149                 /*
1150                  * If @stop_vcn is given and finishes inside this run, cap the
1151                  * run length.
1152                  */
1153                 if (unlikely(last_vcn >= 0 && rl[1].vcn > last_vcn)) {
1154                         s64 s1 = last_vcn + 1;
1155                         if (unlikely(rl[1].vcn > s1))
1156                                 length = s1 - rl->vcn;
1157                         the_end = true;
1158                 }
1159                 delta = first_vcn - rl->vcn;
1160                 /* Header byte + length. */
1161                 rls += 1 + ntfs_get_nr_significant_bytes(length - delta);
1162                 /*
1163                  * If the logical cluster number (lcn) denotes a hole and we
1164                  * are on NTFS 3.0+, we don't store it at all, i.e. we need
1165                  * zero space.  On earlier NTFS versions we just store the lcn.
1166                  * Note: this assumes that on NTFS 1.2-, holes are stored with
1167                  * an lcn of -1 and not a delta_lcn of -1 (unless both are -1).
1168                  */
1169                 if (likely(rl->lcn >= 0 || vol->major_ver < 3)) {
1170                         prev_lcn = rl->lcn;
1171                         if (likely(rl->lcn >= 0))
1172                                 prev_lcn += delta;
1173                         /* Change in lcn. */
1174                         rls += ntfs_get_nr_significant_bytes(prev_lcn);
1175                 }
1176                 /* Go to next runlist element. */
1177                 rl++;
1178         }
1179         /* Do the full runs. */
1180         for (; rl->length && !the_end; rl++) {
1181                 s64 length = rl->length;
1182 
1183                 if (unlikely(length < 0 || rl->lcn < LCN_HOLE))
1184                         goto err_out;
1185                 /*
1186                  * If @stop_vcn is given and finishes inside this run, cap the
1187                  * run length.
1188                  */
1189                 if (unlikely(last_vcn >= 0 && rl[1].vcn > last_vcn)) {
1190                         s64 s1 = last_vcn + 1;
1191                         if (unlikely(rl[1].vcn > s1))
1192                                 length = s1 - rl->vcn;
1193                         the_end = true;
1194                 }
1195                 /* Header byte + length. */
1196                 rls += 1 + ntfs_get_nr_significant_bytes(length);
1197                 /*
1198                  * If the logical cluster number (lcn) denotes a hole and we
1199                  * are on NTFS 3.0+, we don't store it at all, i.e. we need
1200                  * zero space.  On earlier NTFS versions we just store the lcn.
1201                  * Note: this assumes that on NTFS 1.2-, holes are stored with
1202                  * an lcn of -1 and not a delta_lcn of -1 (unless both are -1).
1203                  */
1204                 if (likely(rl->lcn >= 0 || vol->major_ver < 3)) {
1205                         /* Change in lcn. */
1206                         rls += ntfs_get_nr_significant_bytes(rl->lcn -
1207                                         prev_lcn);
1208                         prev_lcn = rl->lcn;
1209                 }
1210         }
1211         return rls;
1212 err_out:
1213         if (rl->lcn == LCN_RL_NOT_MAPPED)
1214                 rls = -EINVAL;
1215         else
1216                 rls = -EIO;
1217         return rls;
1218 }
1219 
1220 /**
1221  * ntfs_write_significant_bytes - write the significant bytes of a number
1222  * @dst:        destination buffer to write to
1223  * @dst_max:    pointer to last byte of destination buffer for bounds checking
1224  * @n:          number whose significant bytes to write
1225  *
1226  * Store in @dst, the minimum bytes of the number @n which are required to
1227  * identify @n unambiguously as a signed number, taking care not to exceed
1228  * @dest_max, the maximum position within @dst to which we are allowed to
1229  * write.
1230  *
1231  * This is used when building the mapping pairs array of a runlist to compress
1232  * a given logical cluster number (lcn) or a specific run length to the minimum
1233  * size possible.
1234  *
1235  * Return the number of bytes written on success.  On error, i.e. the
1236  * destination buffer @dst is too small, return -ENOSPC.
1237  */
1238 static inline int ntfs_write_significant_bytes(s8 *dst, const s8 *dst_max,
1239                 const s64 n)
1240 {
1241         s64 l = n;
1242         int i;
1243         s8 j;
1244 
1245         i = 0;
1246         do {
1247                 if (unlikely(dst > dst_max))
1248                         goto err_out;
1249                 *dst++ = l & 0xffll;
1250                 l >>= 8;
1251                 i++;
1252         } while (l != 0 && l != -1);
1253         j = (n >> 8 * (i - 1)) & 0xff;
1254         /* If the sign bit is wrong, we need an extra byte. */
1255         if (n < 0 && j >= 0) {
1256                 if (unlikely(dst > dst_max))
1257                         goto err_out;
1258                 i++;
1259                 *dst = (s8)-1;
1260         } else if (n > 0 && j < 0) {
1261                 if (unlikely(dst > dst_max))
1262                         goto err_out;
1263                 i++;
1264                 *dst = (s8)0;
1265         }
1266         return i;
1267 err_out:
1268         return -ENOSPC;
1269 }
1270 
1271 /**
1272  * ntfs_mapping_pairs_build - build the mapping pairs array from a runlist
1273  * @vol:        ntfs volume (needed for the ntfs version)
1274  * @dst:        destination buffer to which to write the mapping pairs array
1275  * @dst_len:    size of destination buffer @dst in bytes
1276  * @rl:         locked runlist for which to build the mapping pairs array
1277  * @first_vcn:  first vcn which to include in the mapping pairs array
1278  * @last_vcn:   last vcn which to include in the mapping pairs array
1279  * @stop_vcn:   first vcn outside destination buffer on success or -ENOSPC
1280  *
1281  * Create the mapping pairs array from the locked runlist @rl, starting at vcn
1282  * @first_vcn and finishing with vcn @last_vcn and save the array in @dst.
1283  * @dst_len is the size of @dst in bytes and it should be at least equal to the
1284  * value obtained by calling ntfs_get_size_for_mapping_pairs().
1285  *
1286  * A @last_vcn of -1 means end of runlist and in that case the mapping pairs
1287  * array corresponding to the runlist starting at vcn @first_vcn and finishing
1288  * at the end of the runlist is created.
1289  *
1290  * If @rl is NULL, just write a single terminator byte to @dst.
1291  *
1292  * On success or -ENOSPC error, if @stop_vcn is not NULL, *@stop_vcn is set to
1293  * the first vcn outside the destination buffer.  Note that on error, @dst has
1294  * been filled with all the mapping pairs that will fit, thus it can be treated
1295  * as partial success, in that a new attribute extent needs to be created or
1296  * the next extent has to be used and the mapping pairs build has to be
1297  * continued with @first_vcn set to *@stop_vcn.
1298  *
1299  * Return 0 on success and -errno on error.  The following error codes are
1300  * defined:
1301  *      -EINVAL - Run list contains unmapped elements.  Make sure to only pass
1302  *                fully mapped runlists to this function.
1303  *      -EIO    - The runlist is corrupt.
1304  *      -ENOSPC - The destination buffer is too small.
1305  *
1306  * Locking: @rl must be locked on entry (either for reading or writing), it
1307  *          remains locked throughout, and is left locked upon return.
1308  */
1309 int ntfs_mapping_pairs_build(const ntfs_volume *vol, s8 *dst,
1310                 const int dst_len, const runlist_element *rl,
1311                 const VCN first_vcn, const VCN last_vcn, VCN *const stop_vcn)
1312 {
1313         LCN prev_lcn;
1314         s8 *dst_max, *dst_next;
1315         int err = -ENOSPC;
1316         bool the_end = false;
1317         s8 len_len, lcn_len;
1318 
1319         BUG_ON(first_vcn < 0);
1320         BUG_ON(last_vcn < -1);
1321         BUG_ON(last_vcn >= 0 && first_vcn > last_vcn);
1322         BUG_ON(dst_len < 1);
1323         if (!rl) {
1324                 BUG_ON(first_vcn);
1325                 BUG_ON(last_vcn > 0);
1326                 if (stop_vcn)
1327                         *stop_vcn = 0;
1328                 /* Terminator byte. */
1329                 *dst = 0;
1330                 return 0;
1331         }
1332         /* Skip to runlist element containing @first_vcn. */
1333         while (rl->length && first_vcn >= rl[1].vcn)
1334                 rl++;
1335         if (unlikely((!rl->length && first_vcn > rl->vcn) ||
1336                         first_vcn < rl->vcn))
1337                 return -EINVAL;
1338         /*
1339          * @dst_max is used for bounds checking in
1340          * ntfs_write_significant_bytes().
1341          */
1342         dst_max = dst + dst_len - 1;
1343         prev_lcn = 0;
1344         /* Do the first partial run if present. */
1345         if (first_vcn > rl->vcn) {
1346                 s64 delta, length = rl->length;
1347 
1348                 /* We know rl->length != 0 already. */
1349                 if (unlikely(length < 0 || rl->lcn < LCN_HOLE))
1350                         goto err_out;
1351                 /*
1352                  * If @stop_vcn is given and finishes inside this run, cap the
1353                  * run length.
1354                  */
1355                 if (unlikely(last_vcn >= 0 && rl[1].vcn > last_vcn)) {
1356                         s64 s1 = last_vcn + 1;
1357                         if (unlikely(rl[1].vcn > s1))
1358                                 length = s1 - rl->vcn;
1359                         the_end = true;
1360                 }
1361                 delta = first_vcn - rl->vcn;
1362                 /* Write length. */
1363                 len_len = ntfs_write_significant_bytes(dst + 1, dst_max,
1364                                 length - delta);
1365                 if (unlikely(len_len < 0))
1366                         goto size_err;
1367                 /*
1368                  * If the logical cluster number (lcn) denotes a hole and we
1369                  * are on NTFS 3.0+, we don't store it at all, i.e. we need
1370                  * zero space.  On earlier NTFS versions we just write the lcn
1371                  * change.  FIXME: Do we need to write the lcn change or just
1372                  * the lcn in that case?  Not sure as I have never seen this
1373                  * case on NT4. - We assume that we just need to write the lcn
1374                  * change until someone tells us otherwise... (AIA)
1375                  */
1376                 if (likely(rl->lcn >= 0 || vol->major_ver < 3)) {
1377                         prev_lcn = rl->lcn;
1378                         if (likely(rl->lcn >= 0))
1379                                 prev_lcn += delta;
1380                         /* Write change in lcn. */
1381                         lcn_len = ntfs_write_significant_bytes(dst + 1 +
1382                                         len_len, dst_max, prev_lcn);
1383                         if (unlikely(lcn_len < 0))
1384                                 goto size_err;
1385                 } else
1386                         lcn_len = 0;
1387                 dst_next = dst + len_len + lcn_len + 1;
1388                 if (unlikely(dst_next > dst_max))
1389                         goto size_err;
1390                 /* Update header byte. */
1391                 *dst = lcn_len << 4 | len_len;
1392                 /* Position at next mapping pairs array element. */
1393                 dst = dst_next;
1394                 /* Go to next runlist element. */
1395                 rl++;
1396         }
1397         /* Do the full runs. */
1398         for (; rl->length && !the_end; rl++) {
1399                 s64 length = rl->length;
1400 
1401                 if (unlikely(length < 0 || rl->lcn < LCN_HOLE))
1402                         goto err_out;
1403                 /*
1404                  * If @stop_vcn is given and finishes inside this run, cap the
1405                  * run length.
1406                  */
1407                 if (unlikely(last_vcn >= 0 && rl[1].vcn > last_vcn)) {
1408                         s64 s1 = last_vcn + 1;
1409                         if (unlikely(rl[1].vcn > s1))
1410                                 length = s1 - rl->vcn;
1411                         the_end = true;
1412                 }
1413                 /* Write length. */
1414                 len_len = ntfs_write_significant_bytes(dst + 1, dst_max,
1415                                 length);
1416                 if (unlikely(len_len < 0))
1417                         goto size_err;
1418                 /*
1419                  * If the logical cluster number (lcn) denotes a hole and we
1420                  * are on NTFS 3.0+, we don't store it at all, i.e. we need
1421                  * zero space.  On earlier NTFS versions we just write the lcn
1422                  * change.  FIXME: Do we need to write the lcn change or just
1423                  * the lcn in that case?  Not sure as I have never seen this
1424                  * case on NT4. - We assume that we just need to write the lcn
1425                  * change until someone tells us otherwise... (AIA)
1426                  */
1427                 if (likely(rl->lcn >= 0 || vol->major_ver < 3)) {
1428                         /* Write change in lcn. */
1429                         lcn_len = ntfs_write_significant_bytes(dst + 1 +
1430                                         len_len, dst_max, rl->lcn - prev_lcn);
1431                         if (unlikely(lcn_len < 0))
1432                                 goto size_err;
1433                         prev_lcn = rl->lcn;
1434                 } else
1435                         lcn_len = 0;
1436                 dst_next = dst + len_len + lcn_len + 1;
1437                 if (unlikely(dst_next > dst_max))
1438                         goto size_err;
1439                 /* Update header byte. */
1440                 *dst = lcn_len << 4 | len_len;
1441                 /* Position at next mapping pairs array element. */
1442                 dst = dst_next;
1443         }
1444         /* Success. */
1445         err = 0;
1446 size_err:
1447         /* Set stop vcn. */
1448         if (stop_vcn)
1449                 *stop_vcn = rl->vcn;
1450         /* Add terminator byte. */
1451         *dst = 0;
1452         return err;
1453 err_out:
1454         if (rl->lcn == LCN_RL_NOT_MAPPED)
1455                 err = -EINVAL;
1456         else
1457                 err = -EIO;
1458         return err;
1459 }
1460 
1461 /**
1462  * ntfs_rl_truncate_nolock - truncate a runlist starting at a specified vcn
1463  * @vol:        ntfs volume (needed for error output)
1464  * @runlist:    runlist to truncate
1465  * @new_length: the new length of the runlist in VCNs
1466  *
1467  * Truncate the runlist described by @runlist as well as the memory buffer
1468  * holding the runlist elements to a length of @new_length VCNs.
1469  *
1470  * If @new_length lies within the runlist, the runlist elements with VCNs of
1471  * @new_length and above are discarded.  As a special case if @new_length is
1472  * zero, the runlist is discarded and set to NULL.
1473  *
1474  * If @new_length lies beyond the runlist, a sparse runlist element is added to
1475  * the end of the runlist @runlist or if the last runlist element is a sparse
1476  * one already, this is extended.
1477  *
1478  * Note, no checking is done for unmapped runlist elements.  It is assumed that
1479  * the caller has mapped any elements that need to be mapped already.
1480  *
1481  * Return 0 on success and -errno on error.
1482  *
1483  * Locking: The caller must hold @runlist->lock for writing.
1484  */
1485 int ntfs_rl_truncate_nolock(const ntfs_volume *vol, runlist *const runlist,
1486                 const s64 new_length)
1487 {
1488         runlist_element *rl;
1489         int old_size;
1490 
1491         ntfs_debug("Entering for new_length 0x%llx.", (long long)new_length);
1492         BUG_ON(!runlist);
1493         BUG_ON(new_length < 0);
1494         rl = runlist->rl;
1495         if (!new_length) {
1496                 ntfs_debug("Freeing runlist.");
1497                 runlist->rl = NULL;
1498                 if (rl)
1499                         ntfs_free(rl);
1500                 return 0;
1501         }
1502         if (unlikely(!rl)) {
1503                 /*
1504                  * Create a runlist consisting of a sparse runlist element of
1505                  * length @new_length followed by a terminator runlist element.
1506                  */
1507                 rl = ntfs_malloc_nofs(PAGE_SIZE);
1508                 if (unlikely(!rl)) {
1509                         ntfs_error(vol->sb, "Not enough memory to allocate "
1510                                         "runlist element buffer.");
1511                         return -ENOMEM;
1512                 }
1513                 runlist->rl = rl;
1514                 rl[1].length = rl->vcn = 0;
1515                 rl->lcn = LCN_HOLE;
1516                 rl[1].vcn = rl->length = new_length;
1517                 rl[1].lcn = LCN_ENOENT;
1518                 return 0;
1519         }
1520         BUG_ON(new_length < rl->vcn);
1521         /* Find @new_length in the runlist. */
1522         while (likely(rl->length && new_length >= rl[1].vcn))
1523                 rl++;
1524         /*
1525          * If not at the end of the runlist we need to shrink it.
1526          * If at the end of the runlist we need to expand it.
1527          */
1528         if (rl->length) {
1529                 runlist_element *trl;
1530                 bool is_end;
1531 
1532                 ntfs_debug("Shrinking runlist.");
1533                 /* Determine the runlist size. */
1534                 trl = rl + 1;
1535                 while (likely(trl->length))
1536                         trl++;
1537                 old_size = trl - runlist->rl + 1;
1538                 /* Truncate the run. */
1539                 rl->length = new_length - rl->vcn;
1540                 /*
1541                  * If a run was partially truncated, make the following runlist
1542                  * element a terminator.
1543                  */
1544                 is_end = false;
1545                 if (rl->length) {
1546                         rl++;
1547                         if (!rl->length)
1548                                 is_end = true;
1549                         rl->vcn = new_length;
1550                         rl->length = 0;
1551                 }
1552                 rl->lcn = LCN_ENOENT;
1553                 /* Reallocate memory if necessary. */
1554                 if (!is_end) {
1555                         int new_size = rl - runlist->rl + 1;
1556                         rl = ntfs_rl_realloc(runlist->rl, old_size, new_size);
1557                         if (IS_ERR(rl))
1558                                 ntfs_warning(vol->sb, "Failed to shrink "
1559                                                 "runlist buffer.  This just "
1560                                                 "wastes a bit of memory "
1561                                                 "temporarily so we ignore it "
1562                                                 "and return success.");
1563                         else
1564                                 runlist->rl = rl;
1565                 }
1566         } else if (likely(/* !rl->length && */ new_length > rl->vcn)) {
1567                 ntfs_debug("Expanding runlist.");
1568                 /*
1569                  * If there is a previous runlist element and it is a sparse
1570                  * one, extend it.  Otherwise need to add a new, sparse runlist
1571                  * element.
1572                  */
1573                 if ((rl > runlist->rl) && ((rl - 1)->lcn == LCN_HOLE))
1574                         (rl - 1)->length = new_length - (rl - 1)->vcn;
1575                 else {
1576                         /* Determine the runlist size. */
1577                         old_size = rl - runlist->rl + 1;
1578                         /* Reallocate memory if necessary. */
1579                         rl = ntfs_rl_realloc(runlist->rl, old_size,
1580                                         old_size + 1);
1581                         if (IS_ERR(rl)) {
1582                                 ntfs_error(vol->sb, "Failed to expand runlist "
1583                                                 "buffer, aborting.");
1584                                 return PTR_ERR(rl);
1585                         }
1586                         runlist->rl = rl;
1587                         /*
1588                          * Set @rl to the same runlist element in the new
1589                          * runlist as before in the old runlist.
1590                          */
1591                         rl += old_size - 1;
1592                         /* Add a new, sparse runlist element. */
1593                         rl->lcn = LCN_HOLE;
1594                         rl->length = new_length - rl->vcn;
1595                         /* Add a new terminator runlist element. */
1596                         rl++;
1597                         rl->length = 0;
1598                 }
1599                 rl->vcn = new_length;
1600                 rl->lcn = LCN_ENOENT;
1601         } else /* if (unlikely(!rl->length && new_length == rl->vcn)) */ {
1602                 /* Runlist already has same size as requested. */
1603                 rl->lcn = LCN_ENOENT;
1604         }
1605         ntfs_debug("Done.");
1606         return 0;
1607 }
1608 
1609 /**
1610  * ntfs_rl_punch_nolock - punch a hole into a runlist
1611  * @vol:        ntfs volume (needed for error output)
1612  * @runlist:    runlist to punch a hole into
1613  * @start:      starting VCN of the hole to be created
1614  * @length:     size of the hole to be created in units of clusters
1615  *
1616  * Punch a hole into the runlist @runlist starting at VCN @start and of size
1617  * @length clusters.
1618  *
1619  * Return 0 on success and -errno on error, in which case @runlist has not been
1620  * modified.
1621  *
1622  * If @start and/or @start + @length are outside the runlist return error code
1623  * -ENOENT.
1624  *
1625  * If the runlist contains unmapped or error elements between @start and @start
1626  * + @length return error code -EINVAL.
1627  *
1628  * Locking: The caller must hold @runlist->lock for writing.
1629  */
1630 int ntfs_rl_punch_nolock(const ntfs_volume *vol, runlist *const runlist,
1631                 const VCN start, const s64 length)
1632 {
1633         const VCN end = start + length;
1634         s64 delta;
1635         runlist_element *rl, *rl_end, *rl_real_end, *trl;
1636         int old_size;
1637         bool lcn_fixup = false;
1638 
1639         ntfs_debug("Entering for start 0x%llx, length 0x%llx.",
1640                         (long long)start, (long long)length);
1641         BUG_ON(!runlist);
1642         BUG_ON(start < 0);
1643         BUG_ON(length < 0);
1644         BUG_ON(end < 0);
1645         rl = runlist->rl;
1646         if (unlikely(!rl)) {
1647                 if (likely(!start && !length))
1648                         return 0;
1649                 return -ENOENT;
1650         }
1651         /* Find @start in the runlist. */
1652         while (likely(rl->length && start >= rl[1].vcn))
1653                 rl++;
1654         rl_end = rl;
1655         /* Find @end in the runlist. */
1656         while (likely(rl_end->length && end >= rl_end[1].vcn)) {
1657                 /* Verify there are no unmapped or error elements. */
1658                 if (unlikely(rl_end->lcn < LCN_HOLE))
1659                         return -EINVAL;
1660                 rl_end++;
1661         }
1662         /* Check the last element. */
1663         if (unlikely(rl_end->length && rl_end->lcn < LCN_HOLE))
1664                 return -EINVAL;
1665         /* This covers @start being out of bounds, too. */
1666         if (!rl_end->length && end > rl_end->vcn)
1667                 return -ENOENT;
1668         if (!length)
1669                 return 0;
1670         if (!rl->length)
1671                 return -ENOENT;
1672         rl_real_end = rl_end;
1673         /* Determine the runlist size. */
1674         while (likely(rl_real_end->length))
1675                 rl_real_end++;
1676         old_size = rl_real_end - runlist->rl + 1;
1677         /* If @start is in a hole simply extend the hole. */
1678         if (rl->lcn == LCN_HOLE) {
1679                 /*
1680                  * If both @start and @end are in the same sparse run, we are
1681                  * done.
1682                  */
1683                 if (end <= rl[1].vcn) {
1684                         ntfs_debug("Done (requested hole is already sparse).");
1685                         return 0;
1686                 }
1687 extend_hole:
1688                 /* Extend the hole. */
1689                 rl->length = end - rl->vcn;
1690                 /* If @end is in a hole, merge it with the current one. */
1691                 if (rl_end->lcn == LCN_HOLE) {
1692                         rl_end++;
1693                         rl->length = rl_end->vcn - rl->vcn;
1694                 }
1695                 /* We have done the hole.  Now deal with the remaining tail. */
1696                 rl++;
1697                 /* Cut out all runlist elements up to @end. */
1698                 if (rl < rl_end)
1699                         memmove(rl, rl_end, (rl_real_end - rl_end + 1) *
1700                                         sizeof(*rl));
1701                 /* Adjust the beginning of the tail if necessary. */
1702                 if (end > rl->vcn) {
1703                         delta = end - rl->vcn;
1704                         rl->vcn = end;
1705                         rl->length -= delta;
1706                         /* Only adjust the lcn if it is real. */
1707                         if (rl->lcn >= 0)
1708                                 rl->lcn += delta;
1709                 }
1710 shrink_allocation:
1711                 /* Reallocate memory if the allocation changed. */
1712                 if (rl < rl_end) {
1713                         rl = ntfs_rl_realloc(runlist->rl, old_size,
1714                                         old_size - (rl_end - rl));
1715                         if (IS_ERR(rl))
1716                                 ntfs_warning(vol->sb, "Failed to shrink "
1717                                                 "runlist buffer.  This just "
1718                                                 "wastes a bit of memory "
1719                                                 "temporarily so we ignore it "
1720                                                 "and return success.");
1721                         else
1722                                 runlist->rl = rl;
1723                 }
1724                 ntfs_debug("Done (extend hole).");
1725                 return 0;
1726         }
1727         /*
1728          * If @start is at the beginning of a run things are easier as there is
1729          * no need to split the first run.
1730          */
1731         if (start == rl->vcn) {
1732                 /*
1733                  * @start is at the beginning of a run.
1734                  *
1735                  * If the previous run is sparse, extend its hole.
1736                  *
1737                  * If @end is not in the same run, switch the run to be sparse
1738                  * and extend the newly created hole.
1739                  *
1740                  * Thus both of these cases reduce the problem to the above
1741                  * case of "@start is in a hole".
1742                  */
1743                 if (rl > runlist->rl && (rl - 1)->lcn == LCN_HOLE) {
1744                         rl--;
1745                         goto extend_hole;
1746                 }
1747                 if (end >= rl[1].vcn) {
1748                         rl->lcn = LCN_HOLE;
1749                         goto extend_hole;
1750                 }
1751                 /*
1752                  * The final case is when @end is in the same run as @start.
1753                  * For this need to split the run into two.  One run for the
1754                  * sparse region between the beginning of the old run, i.e.
1755                  * @start, and @end and one for the remaining non-sparse
1756                  * region, i.e. between @end and the end of the old run.
1757                  */
1758                 trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 1);
1759                 if (IS_ERR(trl))
1760                         goto enomem_out;
1761                 old_size++;
1762                 if (runlist->rl != trl) {
1763                         rl = trl + (rl - runlist->rl);
1764                         rl_end = trl + (rl_end - runlist->rl);
1765                         rl_real_end = trl + (rl_real_end - runlist->rl);
1766                         runlist->rl = trl;
1767                 }
1768 split_end:
1769                 /* Shift all the runs up by one. */
1770                 memmove(rl + 1, rl, (rl_real_end - rl + 1) * sizeof(*rl));
1771                 /* Finally, setup the two split runs. */
1772                 rl->lcn = LCN_HOLE;
1773                 rl->length = length;
1774                 rl++;
1775                 rl->vcn += length;
1776                 /* Only adjust the lcn if it is real. */
1777                 if (rl->lcn >= 0 || lcn_fixup)
1778                         rl->lcn += length;
1779                 rl->length -= length;
1780                 ntfs_debug("Done (split one).");
1781                 return 0;
1782         }
1783         /*
1784          * @start is neither in a hole nor at the beginning of a run.
1785          *
1786          * If @end is in a hole, things are easier as simply truncating the run
1787          * @start is in to end at @start - 1, deleting all runs after that up
1788          * to @end, and finally extending the beginning of the run @end is in
1789          * to be @start is all that is needed.
1790          */
1791         if (rl_end->lcn == LCN_HOLE) {
1792                 /* Truncate the run containing @start. */
1793                 rl->length = start - rl->vcn;
1794                 rl++;
1795                 /* Cut out all runlist elements up to @end. */
1796                 if (rl < rl_end)
1797                         memmove(rl, rl_end, (rl_real_end - rl_end + 1) *
1798                                         sizeof(*rl));
1799                 /* Extend the beginning of the run @end is in to be @start. */
1800                 rl->vcn = start;
1801                 rl->length = rl[1].vcn - start;
1802                 goto shrink_allocation;
1803         }
1804         /* 
1805          * If @end is not in a hole there are still two cases to distinguish.
1806          * Either @end is or is not in the same run as @start.
1807          *
1808          * The second case is easier as it can be reduced to an already solved
1809          * problem by truncating the run @start is in to end at @start - 1.
1810          * Then, if @end is in the next run need to split the run into a sparse
1811          * run followed by a non-sparse run (already covered above) and if @end
1812          * is not in the next run switching it to be sparse, again reduces the
1813          * problem to the already covered case of "@start is in a hole".
1814          */
1815         if (end >= rl[1].vcn) {
1816                 /*
1817                  * If @end is not in the next run, reduce the problem to the
1818                  * case of "@start is in a hole".
1819                  */
1820                 if (rl[1].length && end >= rl[2].vcn) {
1821                         /* Truncate the run containing @start. */
1822                         rl->length = start - rl->vcn;
1823                         rl++;
1824                         rl->vcn = start;
1825                         rl->lcn = LCN_HOLE;
1826                         goto extend_hole;
1827                 }
1828                 trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 1);
1829                 if (IS_ERR(trl))
1830                         goto enomem_out;
1831                 old_size++;
1832                 if (runlist->rl != trl) {
1833                         rl = trl + (rl - runlist->rl);
1834                         rl_end = trl + (rl_end - runlist->rl);
1835                         rl_real_end = trl + (rl_real_end - runlist->rl);
1836                         runlist->rl = trl;
1837                 }
1838                 /* Truncate the run containing @start. */
1839                 rl->length = start - rl->vcn;
1840                 rl++;
1841                 /*
1842                  * @end is in the next run, reduce the problem to the case
1843                  * where "@start is at the beginning of a run and @end is in
1844                  * the same run as @start".
1845                  */
1846                 delta = rl->vcn - start;
1847                 rl->vcn = start;
1848                 if (rl->lcn >= 0) {
1849                         rl->lcn -= delta;
1850                         /* Need this in case the lcn just became negative. */
1851                         lcn_fixup = true;
1852                 }
1853                 rl->length += delta;
1854                 goto split_end;
1855         }
1856         /*
1857          * The first case from above, i.e. @end is in the same run as @start.
1858          * We need to split the run into three.  One run for the non-sparse
1859          * region between the beginning of the old run and @start, one for the
1860          * sparse region between @start and @end, and one for the remaining
1861          * non-sparse region, i.e. between @end and the end of the old run.
1862          */
1863         trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 2);
1864         if (IS_ERR(trl))
1865                 goto enomem_out;
1866         old_size += 2;
1867         if (runlist->rl != trl) {
1868                 rl = trl + (rl - runlist->rl);
1869                 rl_end = trl + (rl_end - runlist->rl);
1870                 rl_real_end = trl + (rl_real_end - runlist->rl);
1871                 runlist->rl = trl;
1872         }
1873         /* Shift all the runs up by two. */
1874         memmove(rl + 2, rl, (rl_real_end - rl + 1) * sizeof(*rl));
1875         /* Finally, setup the three split runs. */
1876         rl->length = start - rl->vcn;
1877         rl++;
1878         rl->vcn = start;
1879         rl->lcn = LCN_HOLE;
1880         rl->length = length;
1881         rl++;
1882         delta = end - rl->vcn;
1883         rl->vcn = end;
1884         rl->lcn += delta;
1885         rl->length -= delta;
1886         ntfs_debug("Done (split both).");
1887         return 0;
1888 enomem_out:
1889         ntfs_error(vol->sb, "Not enough memory to extend runlist buffer.");
1890         return -ENOMEM;
1891 }
1892 
1893 #endif /* NTFS_RW */

/* [<][>][^][v][top][bottom][index][help] */