diff options
| author | Anton Altaparmakov <aia21@cantab.net> | 2005-06-25 17:04:55 +0100 | 
|---|---|---|
| committer | Anton Altaparmakov <aia21@cantab.net> | 2005-06-25 17:04:55 +0100 | 
| commit | 1d58b27b8d77ecb816cfa8f846b78c845675eb89 (patch) | |
| tree | 7c10e4182f87d00511aeb1d0583e3c09eeb807de | |
| parent | 3bd1f4a173a3445f9919c21e775de2d8b9deacf8 (diff) | |
| download | olio-linux-3.10-1d58b27b8d77ecb816cfa8f846b78c845675eb89.tar.xz olio-linux-3.10-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>
| -rw-r--r-- | fs/ntfs/ChangeLog | 3 | ||||
| -rw-r--r-- | fs/ntfs/attrib.c | 8 | 
2 files changed, 11 insertions, 0 deletions
diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog index a916c8b0697..aff749db314 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 104eedfb250..34ea405b883 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;  |