Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fs/ntfs3: Fix handling of InitializeFileRecordSegment

Make the logic of handling the InitializeFileRecordSegment operation
similar to that in windows.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>

+14 -16
+14 -16
fs/ntfs3/fslog.c
··· 3091 3091 inode = ilookup(sbi->sb, rno); 3092 3092 if (inode) { 3093 3093 mi = &ntfs_i(inode)->mi; 3094 - } else if (op == InitializeFileRecordSegment) { 3095 - mi = kzalloc(sizeof(struct mft_inode), GFP_NOFS); 3096 - if (!mi) 3097 - return -ENOMEM; 3098 - err = mi_format_new(mi, sbi, rno, 0, false); 3099 - if (err) 3100 - goto out; 3101 3094 } else { 3102 3095 /* Read from disk. */ 3103 3096 err = mi_get(sbi, rno, &mi); 3097 + if (err && op == InitializeFileRecordSegment) { 3098 + mi = kzalloc(sizeof(struct mft_inode), 3099 + GFP_NOFS); 3100 + if (!mi) 3101 + return -ENOMEM; 3102 + err = mi_format_new(mi, sbi, rno, 0, false); 3103 + } 3104 3104 if (err) 3105 3105 return err; 3106 3106 } ··· 3109 3109 if (op == DeallocateFileRecordSegment) 3110 3110 goto skip_load_parent; 3111 3111 3112 - if (InitializeFileRecordSegment != op) { 3113 - if (rec->rhdr.sign == NTFS_BAAD_SIGNATURE) 3114 - goto dirty_vol; 3115 - if (!check_lsn(&rec->rhdr, rlsn)) 3116 - goto out; 3117 - if (!check_file_record(rec, NULL, sbi)) 3118 - goto dirty_vol; 3119 - attr = Add2Ptr(rec, roff); 3120 - } 3112 + if (rec->rhdr.sign == NTFS_BAAD_SIGNATURE) 3113 + goto dirty_vol; 3114 + if (!check_lsn(&rec->rhdr, rlsn)) 3115 + goto out; 3116 + if (!check_file_record(rec, NULL, sbi)) 3117 + goto dirty_vol; 3118 + attr = Add2Ptr(rec, roff); 3121 3119 3122 3120 if (is_rec_base(rec) || InitializeFileRecordSegment == op) { 3123 3121 rno_base = rno;