]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
NTFS: Fix comparison of $MFT and $MFTMirr to not bail out when there are
authorAnton Altaparmakov <aia21@cantab.net>
Thu, 23 Mar 2006 15:34:13 +0000 (15:34 +0000)
committerAnton Altaparmakov <aia21@cantab.net>
Thu, 23 Mar 2006 15:34:13 +0000 (15:34 +0000)
      unused, invalid mft records which are the same in both $MFT and
      $MFTMirr.

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

index 8df10700a9300ff3c82fecac70ce02416d64845c..548d9059a69792e9b78cfed19d78345fc80a22b9 100644 (file)
@@ -28,6 +28,9 @@ ToDo/Notes:
          continued the attribute lookup loop instead of aborting it.
        - Use buffer_migrate_page() for the ->migratepage function of all ntfs
          address space operations.
+       - Fix comparison of $MFT and $MFTMirr to not bail out when there are
+         unused, invalid mft records which are the same in both $MFT and
+         $MFTMirr.
 
 2.1.26 - Minor bug fixes and updates.
 
index 71c58eca580e410cde495b4321029b66b0779c10..fd4aecc5548ef12e795bfc9214d3109cfee54225 100644 (file)
@@ -1099,26 +1099,38 @@ static BOOL check_mft_mirror(ntfs_volume *vol)
                        kmirr = page_address(mirr_page);
                        ++index;
                }
-               /* Make sure the record is ok. */
-               if (ntfs_is_baad_recordp((le32*)kmft)) {
-                       ntfs_error(sb, "Incomplete multi sector transfer "
-                                       "detected in mft record %i.", i);
+               /* Do not check the record if it is not in use. */
+               if (((MFT_RECORD*)kmft)->flags & MFT_RECORD_IN_USE) {
+                       /* Make sure the record is ok. */
+                       if (ntfs_is_baad_recordp((le32*)kmft)) {
+                               ntfs_error(sb, "Incomplete multi sector "
+                                               "transfer detected in mft "
+                                               "record %i.", i);
 mm_unmap_out:
-                       ntfs_unmap_page(mirr_page);
+                               ntfs_unmap_page(mirr_page);
 mft_unmap_out:
-                       ntfs_unmap_page(mft_page);
-                       return FALSE;
+                               ntfs_unmap_page(mft_page);
+                               return FALSE;
+                       }
                }
-               if (ntfs_is_baad_recordp((le32*)kmirr)) {
-                       ntfs_error(sb, "Incomplete multi sector transfer "
-                                       "detected in mft mirror record %i.", i);
-                       goto mm_unmap_out;
+               /* Do not check the mirror record if it is not in use. */
+               if (((MFT_RECORD*)kmirr)->flags & MFT_RECORD_IN_USE) {
+                       if (ntfs_is_baad_recordp((le32*)kmirr)) {
+                               ntfs_error(sb, "Incomplete multi sector "
+                                               "transfer detected in mft "
+                                               "mirror record %i.", i);
+                               goto mm_unmap_out;
+                       }
                }
                /* Get the amount of data in the current record. */
                bytes = le32_to_cpu(((MFT_RECORD*)kmft)->bytes_in_use);
-               if (!bytes || bytes > vol->mft_record_size) {
+               if (bytes < sizeof(MFT_RECORD_OLD) ||
+                               bytes > vol->mft_record_size ||
+                               ntfs_is_baad_recordp((le32*)kmft)) {
                        bytes = le32_to_cpu(((MFT_RECORD*)kmirr)->bytes_in_use);
-                       if (!bytes || bytes > vol->mft_record_size)
+                       if (bytes < sizeof(MFT_RECORD_OLD) ||
+                                       bytes > vol->mft_record_size ||
+                                       ntfs_is_baad_recordp((le32*)kmirr))
                                bytes = vol->mft_record_size;
                }
                /* Compare the two records. */