浏览代码

NTFS: Fix a bug in fs/ntfs/inode.c::ntfs_read_locked_index_inode() where we
forgot to update a temporary variable so loading index inodes which
have an index allocation attribute failed.

Signed-off-by: Anton Altaparmakov <aia21@cantab.net>

Anton Altaparmakov 19 年之前
父节点
当前提交
a778f21732
共有 3 个文件被更改,包括 15 次插入19 次删除
  1. 3 0
      fs/ntfs/ChangeLog
  2. 11 15
      fs/ntfs/inode.c
  3. 1 4
      fs/ntfs/mft.c

+ 3 - 0
fs/ntfs/ChangeLog

@@ -38,6 +38,9 @@ ToDo/Notes:
 	  allowed by NTFS, i.e. 255 Unicode characters, not including the
 	  allowed by NTFS, i.e. 255 Unicode characters, not including the
 	  terminating NULL (which is not stored on disk).
 	  terminating NULL (which is not stored on disk).
 	- Improve comments on file attribute flags in fs/ntfs/layout.h.
 	- Improve comments on file attribute flags in fs/ntfs/layout.h.
+	- Fix a bug in fs/ntfs/inode.c::ntfs_read_locked_index_inode() where we
+	  forgot to update a temporary variable so loading index inodes which
+	  have an index allocation attribute failed.
 
 
 2.1.26 - Minor bug fixes and updates.
 2.1.26 - Minor bug fixes and updates.
 
 

+ 11 - 15
fs/ntfs/inode.c

@@ -19,15 +19,19 @@
  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  */
 
 
-#include <linux/pagemap.h>
 #include <linux/buffer_head.h>
 #include <linux/buffer_head.h>
-#include <linux/smp_lock.h>
-#include <linux/quotaops.h>
+#include <linux/fs.h>
+#include <linux/mm.h>
 #include <linux/mount.h>
 #include <linux/mount.h>
 #include <linux/mutex.h>
 #include <linux/mutex.h>
+#include <linux/pagemap.h>
+#include <linux/quotaops.h>
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
 
 
 #include "aops.h"
 #include "aops.h"
 #include "attrib.h"
 #include "attrib.h"
+#include "bitmap.h"
 #include "dir.h"
 #include "dir.h"
 #include "debug.h"
 #include "debug.h"
 #include "inode.h"
 #include "inode.h"
@@ -1428,7 +1432,6 @@ err_out:
 			"Run chkdsk.", err, vi->i_ino, ni->type, ni->name_len,
 			"Run chkdsk.", err, vi->i_ino, ni->type, ni->name_len,
 			base_vi->i_ino);
 			base_vi->i_ino);
 	make_bad_inode(vi);
 	make_bad_inode(vi);
-	make_bad_inode(base_vi);
 	if (err != -ENOMEM)
 	if (err != -ENOMEM)
 		NVolSetErrors(vol);
 		NVolSetErrors(vol);
 	return err;
 	return err;
@@ -1613,6 +1616,7 @@ static int ntfs_read_locked_index_inode(struct inode *base_vi, struct inode *vi)
 					"$INDEX_ALLOCATION attribute.");
 					"$INDEX_ALLOCATION attribute.");
 		goto unm_err_out;
 		goto unm_err_out;
 	}
 	}
+	a = ctx->attr;
 	if (!a->non_resident) {
 	if (!a->non_resident) {
 		ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
 		ntfs_error(vi->i_sb, "$INDEX_ALLOCATION attribute is "
 				"resident.");
 				"resident.");
@@ -2845,11 +2849,8 @@ done:
 old_bad_out:
 old_bad_out:
 	old_size = -1;
 	old_size = -1;
 bad_out:
 bad_out:
-	if (err != -ENOMEM && err != -EOPNOTSUPP) {
-		make_bad_inode(vi);
-		make_bad_inode(VFS_I(base_ni));
+	if (err != -ENOMEM && err != -EOPNOTSUPP)
 		NVolSetErrors(vol);
 		NVolSetErrors(vol);
-	}
 	if (err != -EOPNOTSUPP)
 	if (err != -EOPNOTSUPP)
 		NInoSetTruncateFailed(ni);
 		NInoSetTruncateFailed(ni);
 	else if (old_size >= 0)
 	else if (old_size >= 0)
@@ -2864,11 +2865,8 @@ out:
 	ntfs_debug("Failed.  Returning error code %i.", err);
 	ntfs_debug("Failed.  Returning error code %i.", err);
 	return err;
 	return err;
 conv_err_out:
 conv_err_out:
-	if (err != -ENOMEM && err != -EOPNOTSUPP) {
-		make_bad_inode(vi);
-		make_bad_inode(VFS_I(base_ni));
+	if (err != -ENOMEM && err != -EOPNOTSUPP)
 		NVolSetErrors(vol);
 		NVolSetErrors(vol);
-	}
 	if (err != -EOPNOTSUPP)
 	if (err != -EOPNOTSUPP)
 		NInoSetTruncateFailed(ni);
 		NInoSetTruncateFailed(ni);
 	else
 	else
@@ -3116,9 +3114,7 @@ err_out:
 				"retries later.");
 				"retries later.");
 		mark_inode_dirty(vi);
 		mark_inode_dirty(vi);
 	} else {
 	} else {
-		ntfs_error(vi->i_sb, "Failed (error code %i):  Marking inode "
-				"as bad.  You should run chkdsk.", -err);
-		make_bad_inode(vi);
+		ntfs_error(vi->i_sb, "Failed (error %i):  Run chkdsk.", -err);
 		NVolSetErrors(ni->vol);
 		NVolSetErrors(ni->vol);
 	}
 	}
 	return err;
 	return err;

+ 1 - 4
fs/ntfs/mft.c

@@ -651,10 +651,7 @@ err_out:
  * fs/ntfs/aops.c::mark_ntfs_record_dirty().
  * fs/ntfs/aops.c::mark_ntfs_record_dirty().
  *
  *
  * On success, clean the mft record and return 0.  On error, leave the mft
  * On success, clean the mft record and return 0.  On error, leave the mft
- * record dirty and return -errno.  The caller should call make_bad_inode() on
- * the base inode to ensure no more access happens to this inode.  We do not do
- * it here as the caller may want to finish writing other extent mft records
- * first to minimize on-disk metadata inconsistencies.
+ * record dirty and return -errno.
  *
  *
  * NOTE:  We always perform synchronous i/o and ignore the @sync parameter.
  * NOTE:  We always perform synchronous i/o and ignore the @sync parameter.
  * However, if the mft record has a counterpart in the mft mirror and @sync is
  * However, if the mft record has a counterpart in the mft mirror and @sync is