summaryrefslogtreecommitdiffstats
path: root/fs/ntfs
diff options
context:
space:
mode:
authorAnton Altaparmakov <aia21@cantab.net>2005-06-25 18:04:55 +0200
committerAnton Altaparmakov <aia21@cantab.net>2005-06-25 18:04:55 +0200
commit1d58b27b8d77ecb816cfa8f846b78c845675eb89 (patch)
tree7c10e4182f87d00511aeb1d0583e3c09eeb807de /fs/ntfs
parentNTFS: Fix several occurences of a bug where we would perform 'var & ~const' (diff)
downloadlinux-1d58b27b8d77ecb816cfa8f846b78c845675eb89.tar.xz
linux-1d58b27b8d77ecb816cfa8f846b78c845675eb89.zip
NTFS: 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. Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
Diffstat (limited to 'fs/ntfs')
-rw-r--r--fs/ntfs/ChangeLog3
-rw-r--r--fs/ntfs/attrib.c8
2 files changed, 11 insertions, 0 deletions
diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog
index a916c8b0697a..aff749db314c 100644
--- a/fs/ntfs/ChangeLog
+++ b/fs/ntfs/ChangeLog
@@ -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.
diff --git a/fs/ntfs/attrib.c b/fs/ntfs/attrib.c
index 104eedfb2507..34ea405b883d 100644
--- a/fs/ntfs/attrib.c
+++ b/fs/ntfs/attrib.c
@@ -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;