NTFS: Change the runlist terminator of the newly allocated cluster(s) to
authorAnton Altaparmakov <aia21@cantab.net>
Sat, 25 Jun 2005 16:04:55 +0000 (17:04 +0100)
committerAnton Altaparmakov <aia21@cantab.net>
Sat, 25 Jun 2005 16:04:55 +0000 (17:04 +0100)
      LCN_ENOENT in ntfs_attr_make_non_resident().  Otherwise the runlist
      code gets confused.

Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
fs/ntfs/ChangeLog
fs/ntfs/attrib.c

index a916c8b..aff749d 100644 (file)
@@ -132,6 +132,9 @@ ToDo/Notes:
          with a 64-bit variable and a int, i.e. 32-bit, constant.  This causes
          the higher order 32-bits of the 64-bit variable to be zeroed.  To fix
          this cast the 'const' to the same 64-bit type as 'var'.
+       - Change the runlist terminator of the newly allocated cluster(s) to
+         LCN_ENOENT in ntfs_attr_make_non_resident().  Otherwise the runlist
+         code gets confused.
 
 2.1.22 - Many bug and race fixes and error handling improvements.
 
index 104eedf..34ea405 100644 (file)
@@ -1285,6 +1285,8 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
        new_size = (i_size_read(vi) + vol->cluster_size - 1) &
                        ~(vol->cluster_size - 1);
        if (new_size > 0) {
+               runlist_element *rl2;
+
                /*
                 * Will need the page later and since the page lock nests
                 * outside all ntfs locks, we need to get the page now.
@@ -1304,6 +1306,12 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
                                        err);
                        goto page_err_out;
                }
+               /* Change the runlist terminator to LCN_ENOENT. */
+               rl2 = rl;
+               while (rl2->length)
+                       rl2++;
+               BUG_ON(rl2->lcn != LCN_RL_NOT_MAPPED);
+               rl2->lcn = LCN_ENOENT;
        } else {
                rl = NULL;
                page = NULL;