summaryrefslogtreecommitdiffstats
path: root/libblkid/src/superblocks/ntfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'libblkid/src/superblocks/ntfs.c')
-rw-r--r--libblkid/src/superblocks/ntfs.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/libblkid/src/superblocks/ntfs.c b/libblkid/src/superblocks/ntfs.c
index 3a9d5cb01..723d27503 100644
--- a/libblkid/src/superblocks/ntfs.c
+++ b/libblkid/src/superblocks/ntfs.c
@@ -72,7 +72,8 @@ struct file_attribute {
} __attribute__((__packed__));
#define MFT_RECORD_VOLUME 3
-#define NTFS_MAX_CLUSTER_SIZE (64 * 1024)
+/* Windows 10 Creators edition has extended the cluster size limit to 2MB */
+#define NTFS_MAX_CLUSTER_SIZE (2 * 1024 * 1024)
enum {
MFT_RECORD_ATTR_VOLUME_NAME = 0x60,
@@ -97,16 +98,19 @@ static int probe_ntfs(blkid_probe pr, const struct blkid_idmag *mag)
* Check bios parameters block
*/
sector_size = le16_to_cpu(ns->bpb.sector_size);
- sectors_per_cluster = ns->bpb.sectors_per_cluster;
if (sector_size < 256 || sector_size > 4096)
return 1;
- switch (sectors_per_cluster) {
+ switch (ns->bpb.sectors_per_cluster) {
case 1: case 2: case 4: case 8: case 16: case 32: case 64: case 128:
+ sectors_per_cluster = ns->bpb.sectors_per_cluster;
break;
default:
- return 1;
+ if ((ns->bpb.sectors_per_cluster < 240)
+ || (ns->bpb.sectors_per_cluster > 249))
+ return 1;
+ sectors_per_cluster = 1 << (256 - ns->bpb.sectors_per_cluster);
}
if ((uint16_t) le16_to_cpu(ns->bpb.sector_size) *