summaryrefslogtreecommitdiff
path: root/fs/ntfs/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ntfs/dir.c')
-rw-r--r--fs/ntfs/dir.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c
index df60138f9b2d..fce10baa2b93 100644
--- a/fs/ntfs/dir.c
+++ b/fs/ntfs/dir.c
@@ -8,6 +8,7 @@
*/
#include <linux/blkdev.h>
+#include <linux/string.h>
#include "dir.h"
#include "mft.h"
@@ -238,7 +239,7 @@ found_it:
*/
rc = ntfs_collate_names(uname, uname_len,
(__le16 *)&ie->key.file_name.file_name,
- ie->key.file_name.file_name_length, 1,
+ ie->key.file_name.file_name_length, false,
IGNORE_CASE, vol->upcase, vol->upcase_len);
/*
* If uname collates before the name of the current entry, there
@@ -257,7 +258,7 @@ found_it:
*/
rc = ntfs_collate_names(uname, uname_len,
(__le16 *)&ie->key.file_name.file_name,
- ie->key.file_name.file_name_length, 1,
+ ie->key.file_name.file_name_length, false,
CASE_SENSITIVE, vol->upcase, vol->upcase_len);
if (rc == -1)
break;
@@ -331,7 +332,6 @@ descend_into_child_node:
}
memcpy_from_folio(kaddr, folio, 0, PAGE_SIZE);
- post_read_mst_fixup((struct ntfs_record *)kaddr, PAGE_SIZE);
folio_unlock(folio);
folio_put(folio);
fast_descend_into_child_node:
@@ -352,6 +352,14 @@ fast_descend_into_child_node:
vcn, dir_ni->mft_no);
goto unm_err_out;
}
+ err = post_read_mst_fixup((struct ntfs_record *)ia,
+ dir_ni->itype.index.block_size);
+ if (err) {
+ ntfs_error(sb,
+ "MST fixup failed for index block vcn %lld in directory inode 0x%llx.",
+ vcn, dir_ni->mft_no);
+ goto unm_err_out;
+ }
err = ntfs_index_block_inconsistent(vol, ia,
dir_ni->itype.index.block_size,
vcn, COLLATION_FILE_NAME,
@@ -474,7 +482,7 @@ found_it2:
*/
rc = ntfs_collate_names(uname, uname_len,
(__le16 *)&ie->key.file_name.file_name,
- ie->key.file_name.file_name_length, 1,
+ ie->key.file_name.file_name_length, false,
IGNORE_CASE, vol->upcase, vol->upcase_len);
/*
* If uname collates before the name of the current entry, there
@@ -493,7 +501,7 @@ found_it2:
*/
rc = ntfs_collate_names(uname, uname_len,
(__le16 *)&ie->key.file_name.file_name,
- ie->key.file_name.file_name_length, 1,
+ ie->key.file_name.file_name_length, false,
CASE_SENSITIVE, vol->upcase, vol->upcase_len);
if (rc == -1)
break;
@@ -617,7 +625,6 @@ static inline int ntfs_filldir(struct ntfs_volume *vol,
ntfs_debug("Skipping hidden file.");
return 0;
}
-
name_len = ntfs_ucstonls(vol, (__le16 *)&ie->key.file_name.file_name,
ie->key.file_name.file_name_length, &name,
NTFS_MAX_NAME_LEN * NLS_MAX_CHARSET_SIZE + 1);
@@ -626,13 +633,16 @@ static inline int ntfs_filldir(struct ntfs_volume *vol,
(long long)MREF_LE(ie->data.dir.indexed_file));
return 0;
}
-
+ if (NVolStreamsWindows(vol) && strchr((char *)name, ':')) {
+ ntfs_debug("Skipping file name containing a stream separator.");
+ return 0;
+ }
mref = MREF_LE(ie->data.dir.indexed_file);
- if (ie->key.file_name.file_attributes &
+ if (ie->key.file_name.file_attributes & FILE_ATTR_REPARSE_POINT)
+ dt_type = ntfs_reparse_tag_dt_types(vol, mref);
+ else if (ie->key.file_name.file_attributes &
FILE_ATTR_DUP_FILE_NAME_INDEX_PRESENT)
dt_type = DT_DIR;
- else if (ie->key.file_name.file_attributes & FILE_ATTR_REPARSE_POINT)
- dt_type = ntfs_reparse_tag_dt_types(vol, mref);
else
dt_type = DT_REG;
@@ -1182,6 +1192,8 @@ static int ntfs_dir_fsync(struct file *filp, loff_t start, loff_t end,
err = sync_blockdev(vi->i_sb->s_bdev);
if (unlikely(err && !ret))
ret = err;
+ if (!ret)
+ ret = blkdev_issue_flush(vi->i_sb->s_bdev);
if (likely(!ret))
ntfs_debug("Done.");
else