diff --git a/lib/blkid/probe.c b/lib/blkid/probe.c
index 6a3bb2478..a79aa5a07 100644
--- a/lib/blkid/probe.c
+++ b/lib/blkid/probe.c
@@ -701,6 +701,21 @@ static int probe_ntfs(struct blkid_probe *probe,
 	bytes_per_sector = ns->bios_parameter_block[0] +
 		(ns->bios_parameter_block[1]  << 8);
 	sectors_per_cluster = ns->bios_parameter_block[2];
+	if (sectors_per_cluster >= 244 && sectors_per_cluster <= 248 &&
+	    (bytes_per_sector << (256 - sectors_per_cluster)) <= 2097152)
+	{
+		/* Special case: Above the value 128, the number of sectors per
+		 * cluster is encoded as a power of 2 / bitshift value, but only
+		 * up to and including the maximum cluster size, 2 MiB. */
+		sectors_per_cluster = 1 << (256 - sectors_per_cluster);
+	}
+	else if (sectors_per_cluster > 128 ||
+		(sectors_per_cluster & (sectors_per_cluster - 1)))
+	{
+		/* Sectors per cluster out of range or not a power of 2. Not a
+		 * valid NTFS volume. */
+		return 1;
+	}
 
 	if ((bytes_per_sector < 512) || (sectors_per_cluster == 0))
 		return 1;