]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/ntfs3: Fix handling of InitializeFileRecordSegment
authorKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Wed, 23 Apr 2025 18:01:15 +0000 (21:01 +0300)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Fri, 16 May 2025 14:26:07 +0000 (16:26 +0200)
Make the logic of handling the InitializeFileRecordSegment operation
similar to that in windows.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/fslog.c

index e69f623b2e4985e39e5f1572298607885a9c798e..38934e6978ececd6630017ef01d9ef14911032f1 100644 (file)
@@ -3091,16 +3091,16 @@ static int do_action(struct ntfs_log *log, struct OPEN_ATTR_ENRTY *oe,
                inode = ilookup(sbi->sb, rno);
                if (inode) {
                        mi = &ntfs_i(inode)->mi;
-               } else if (op == InitializeFileRecordSegment) {
-                       mi = kzalloc(sizeof(struct mft_inode), GFP_NOFS);
-                       if (!mi)
-                               return -ENOMEM;
-                       err = mi_format_new(mi, sbi, rno, 0, false);
-                       if (err)
-                               goto out;
                } else {
                        /* Read from disk. */
                        err = mi_get(sbi, rno, &mi);
+                       if (err && op == InitializeFileRecordSegment) {
+                               mi = kzalloc(sizeof(struct mft_inode),
+                                            GFP_NOFS);
+                               if (!mi)
+                                       return -ENOMEM;
+                               err = mi_format_new(mi, sbi, rno, 0, false);
+                       }
                        if (err)
                                return err;
                }
@@ -3109,15 +3109,13 @@ static int do_action(struct ntfs_log *log, struct OPEN_ATTR_ENRTY *oe,
                if (op == DeallocateFileRecordSegment)
                        goto skip_load_parent;
 
-               if (InitializeFileRecordSegment != op) {
-                       if (rec->rhdr.sign == NTFS_BAAD_SIGNATURE)
-                               goto dirty_vol;
-                       if (!check_lsn(&rec->rhdr, rlsn))
-                               goto out;
-                       if (!check_file_record(rec, NULL, sbi))
-                               goto dirty_vol;
-                       attr = Add2Ptr(rec, roff);
-               }
+               if (rec->rhdr.sign == NTFS_BAAD_SIGNATURE)
+                       goto dirty_vol;
+               if (!check_lsn(&rec->rhdr, rlsn))
+                       goto out;
+               if (!check_file_record(rec, NULL, sbi))
+                       goto dirty_vol;
+               attr = Add2Ptr(rec, roff);
 
                if (is_rec_base(rec) || InitializeFileRecordSegment == op) {
                        rno_base = rno;