Blame SOURCES/ntfs-3g-big-sectors.patch

0f6478
--- libntfs-3g/bootsect.c.ref	2017-03-23 10:42:44.000000000 +0100
0f6478
+++ libntfs-3g/bootsect.c	2018-05-07 09:11:13.004710800 +0200
0f6478
@@ -38,6 +38,7 @@ 
0f6478
 #include <errno.h>
0f6478
 #endif
0f6478
 
0f6478
+#include "param.h"
0f6478
 #include "compat.h"
0f6478
 #include "bootsect.h"
0f6478
 #include "debug.h"
0f6478
@@ -61,6 +62,7 @@ 
0f6478
 {
0f6478
 	u32 i;
0f6478
 	BOOL ret = FALSE;
0f6478
+	u16 sectors_per_cluster;
0f6478
 
0f6478
 	ntfs_log_debug("Beginning bootsector check.\n");
0f6478
 
0f6478
@@ -83,15 +85,27 @@ 
0f6478
 	case 1: case 2: case 4: case 8: case 16: case 32: case 64: case 128:
0f6478
 		break;
0f6478
 	default:
0f6478
-		ntfs_log_error("Unexpected sectors per cluster value (%d).\n",
0f6478
-			       b->bpb.sectors_per_cluster);
0f6478
-		goto not_ntfs;
0f6478
+		if ((b->bpb.sectors_per_cluster < 240)
0f6478
+		    || (b->bpb.sectors_per_cluster > 249)) {
0f6478
+			if (b->bpb.sectors_per_cluster > 128)
0f6478
+				ntfs_log_error("Unexpected sectors"
0f6478
+					" per cluster value (code 0x%x)\n",
0f6478
+					b->bpb.sectors_per_cluster);
0f6478
+			else
0f6478
+				ntfs_log_error("Unexpected sectors"
0f6478
+					" per cluster value (%d).\n",
0f6478
+					b->bpb.sectors_per_cluster);
0f6478
+			goto not_ntfs;
0f6478
+		}
0f6478
 	}
0f6478
 
0f6478
 	ntfs_log_debug("Checking cluster size.\n");
0f6478
-	i = (u32)le16_to_cpu(b->bpb.bytes_per_sector) * 
0f6478
-		b->bpb.sectors_per_cluster;
0f6478
-	if (i > 65536) {
0f6478
+	if (b->bpb.sectors_per_cluster > 128)
0f6478
+		sectors_per_cluster = 1 << (256 - b->bpb.sectors_per_cluster);
0f6478
+	else
0f6478
+		sectors_per_cluster = b->bpb.sectors_per_cluster;
0f6478
+	i = (u32)le16_to_cpu(b->bpb.bytes_per_sector) * sectors_per_cluster;
0f6478
+	if (i > NTFS_MAX_CLUSTER_SIZE) {
0f6478
 		ntfs_log_error("Unexpected cluster size (%d).\n", i);
0f6478
 		goto not_ntfs;
0f6478
 	}
0f6478
@@ -171,7 +185,7 @@ 
0f6478
 int ntfs_boot_sector_parse(ntfs_volume *vol, const NTFS_BOOT_SECTOR *bs)
0f6478
 {
0f6478
 	s64 sectors;
0f6478
-	u8  sectors_per_cluster;
0f6478
+	u16  sectors_per_cluster;
0f6478
 	s8  c;
0f6478
 
0f6478
 	/* We return -1 with errno = EINVAL on error. */
0f6478
@@ -186,7 +200,10 @@ 
0f6478
 	 * below or equal the number_of_clusters) really belong in the
0f6478
 	 * ntfs_boot_sector_is_ntfs but in this way we can just do this once.
0f6478
 	 */
0f6478
-	sectors_per_cluster = bs->bpb.sectors_per_cluster;
0f6478
+	if (bs->bpb.sectors_per_cluster > 128)
0f6478
+		sectors_per_cluster = 1 << (256 - bs->bpb.sectors_per_cluster);
0f6478
+	else
0f6478
+		sectors_per_cluster = bs->bpb.sectors_per_cluster;
0f6478
 	ntfs_log_debug("SectorsPerCluster = 0x%x\n", sectors_per_cluster);
0f6478
 	if (sectors_per_cluster & (sectors_per_cluster - 1)) {
0f6478
 		ntfs_log_error("sectors_per_cluster (%d) is not a power of 2."
0f6478
--- ntfsprogs/mkntfs.8.in.ref	2017-03-23 10:42:44.000000000 +0100
0f6478
+++ ntfsprogs/mkntfs.8.in	2018-05-07 09:11:13.014132400 +0200
0f6478
@@ -132,7 +132,7 @@ 
0f6478
 .TP
0f6478
 \fB\-c\fR, \fB\-\-cluster\-size\fR BYTES
0f6478
 Specify the size of clusters in bytes. Valid cluster size values are powers of
0f6478
-two, with at least 256, and at most 65536 bytes per cluster. If omitted,
0f6478
+two, with at least 256, and at most 2097152 bytes (2MB) per cluster. If omitted,
0f6478
 .B mkntfs
0f6478
 uses 4096 bytes as the default cluster size.
0f6478
 .sp
0f6478
--- ntfsprogs/mkntfs.c.ref	2017-03-23 10:42:44.000000000 +0100
0f6478
+++ ntfsprogs/mkntfs.c	2018-05-07 09:11:13.035522300 +0200
0f6478
@@ -6,7 +6,7 @@ 
0f6478
  * Copyright (c) 2002-2006 Szabolcs Szakacsits
0f6478
  * Copyright (c) 2005      Erik Sornes
0f6478
  * Copyright (c) 2007      Yura Pakhuchiy
0f6478
- * Copyright (c) 2010-2014 Jean-Pierre Andre
0f6478
+ * Copyright (c) 2010-2018 Jean-Pierre Andre
0f6478
  *
0f6478
  * This utility will create an NTFS 1.2 or 3.1 volume on a user
0f6478
  * specified (block) device.
0f6478
@@ -119,6 +119,7 @@ 
0f6478
 #	endif
0f6478
 #endif
0f6478
 
0f6478
+#include "param.h"
0f6478
 #include "security.h"
0f6478
 #include "types.h"
0f6478
 #include "attrib.h"
0f6478
@@ -287,7 +288,7 @@ 
0f6478
 	ntfs_log_info("Copyright (c) 2002-2006 Szabolcs Szakacsits\n");
0f6478
 	ntfs_log_info("Copyright (c) 2005      Erik Sornes\n");
0f6478
 	ntfs_log_info("Copyright (c) 2007      Yura Pakhuchiy\n");
0f6478
-	ntfs_log_info("Copyright (c) 2010-2014 Jean-Pierre Andre\n");
0f6478
+	ntfs_log_info("Copyright (c) 2010-2018 Jean-Pierre Andre\n");
0f6478
 	ntfs_log_info("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
0f6478
 }
0f6478
 
0f6478
@@ -3719,11 +3720,11 @@ 
0f6478
 		/*
0f6478
 		 * For huge volumes, grow the cluster size until the number of
0f6478
 		 * clusters fits into 32 bits or the cluster size exceeds the
0f6478
-		 * maximum limit of 64kiB.
0f6478
+		 * maximum limit of NTFS_MAX_CLUSTER_SIZE.
0f6478
 		 */
0f6478
 		while (volume_size >> (ffs(vol->cluster_size) - 1 + 32)) {
0f6478
 			vol->cluster_size <<= 1;
0f6478
-			if (vol->cluster_size > 65535) {
0f6478
+			if (vol->cluster_size >= NTFS_MAX_CLUSTER_SIZE) {
0f6478
 				ntfs_log_error("Device is too large to hold an "
0f6478
 						"NTFS volume (maximum size is "
0f6478
 						"256TiB).\n");
0f6478
@@ -3744,15 +3745,18 @@ 
0f6478
 				"to, or larger than, the sector size.\n");
0f6478
 		return FALSE;
0f6478
 	}
0f6478
-	if (vol->cluster_size > 128 * (u32)opts.sector_size) {
0f6478
+		/* Before Windows 10 Creators, the limit was 128 */
0f6478
+	if (vol->cluster_size > 4096 * (u32)opts.sector_size) {
0f6478
 		ntfs_log_error("The cluster size is invalid.  It cannot be "
0f6478
-				"more that 128 times the size of the sector "
0f6478
+				"more that 4096 times the size of the sector "
0f6478
 				"size.\n");
0f6478
 		return FALSE;
0f6478
 	}
0f6478
-	if (vol->cluster_size > 65536) {
0f6478
+	if (vol->cluster_size > NTFS_MAX_CLUSTER_SIZE) {
0f6478
 		ntfs_log_error("The cluster size is invalid.  The maximum "
0f6478
-			"cluster size is 65536 bytes (64kiB).\n");
0f6478
+			"cluster size is %lu bytes (%lukiB).\n",
0f6478
+			(unsigned long)NTFS_MAX_CLUSTER_SIZE,
0f6478
+			(unsigned long)(NTFS_MAX_CLUSTER_SIZE >> 10));
0f6478
 		return FALSE;
0f6478
 	}
0f6478
 	vol->cluster_size_bits = ffs(vol->cluster_size) - 1;
0f6478
@@ -4387,6 +4391,7 @@ 
0f6478
 	u8 *sd;
0f6478
 	FILE_ATTR_FLAGS extend_flags;
0f6478
 	VOLUME_FLAGS volume_flags = const_cpu_to_le16(0);
0f6478
+	int sectors_per_cluster;
0f6478
 	int nr_sysfiles;
0f6478
 	int buf_sds_first_size;
0f6478
 	char *buf_sds;
0f6478
@@ -4639,8 +4644,11 @@ 
0f6478
 	 * already inserted, so no need to worry about these things.
0f6478
 	 */
0f6478
 	bs->bpb.bytes_per_sector = cpu_to_le16(opts.sector_size);
0f6478
-	bs->bpb.sectors_per_cluster = (u8)(g_vol->cluster_size /
0f6478
-			opts.sector_size);
0f6478
+	sectors_per_cluster = g_vol->cluster_size / opts.sector_size;
0f6478
+	if (sectors_per_cluster > 128)
0f6478
+		bs->bpb.sectors_per_cluster = 257 - ffs(sectors_per_cluster);
0f6478
+	else
0f6478
+		bs->bpb.sectors_per_cluster = sectors_per_cluster;
0f6478
 	bs->bpb.media_type = 0xf8; /* hard disk */
0f6478
 	bs->bpb.sectors_per_track = cpu_to_le16(opts.sectors_per_track);
0f6478
 	ntfs_log_debug("sectors per track = %ld (0x%lx)\n",
0f6478
--- ntfsprogs/ntfsclone.c.ref	2017-03-23 10:42:44.000000000 +0100
0f6478
+++ ntfsprogs/ntfsclone.c	2018-05-07 09:11:38.245007100 +0200
0f6478
@@ -3,7 +3,7 @@ 
0f6478
  *
0f6478
  * Copyright (c) 2003-2006 Szabolcs Szakacsits
0f6478
  * Copyright (c) 2004-2006 Anton Altaparmakov
0f6478
- * Copyright (c) 2010-2016 Jean-Pierre Andre
0f6478
+ * Copyright (c) 2010-2018 Jean-Pierre Andre
0f6478
  * Special image format support copyright (c) 2004 Per Olofsson
0f6478
  *
0f6478
  * Clone NTFS data and/or metadata to a sparse file, image, device or stdout.
0f6478
@@ -71,6 +71,7 @@ 
0f6478
  */
0f6478
 #define NTFS_DO_NOT_CHECK_ENDIANS
0f6478
 
0f6478
+#include "param.h"
0f6478
 #include "debug.h"
0f6478
 #include "types.h"
0f6478
 #include "support.h"
0f6478
@@ -270,7 +271,6 @@ 
0f6478
 
0f6478
 #define LAST_METADATA_INODE	11
0f6478
 
0f6478
-#define NTFS_MAX_CLUSTER_SIZE	65536
0f6478
 #define NTFS_SECTOR_SIZE	  512
0f6478
 
0f6478
 #define rounded_up_division(a, b) (((a) + (b - 1)) / (b))
0f6478
@@ -393,7 +393,7 @@ 
0f6478
 		   "Efficiently clone, image, restore or rescue an NTFS Volume.\n\n"
0f6478
 		   "Copyright (c) 2003-2006 Szabolcs Szakacsits\n"
0f6478
 		   "Copyright (c) 2004-2006 Anton Altaparmakov\n"
0f6478
-		   "Copyright (c) 2010-2016 Jean-Pierre Andre\n\n");
0f6478
+		   "Copyright (c) 2010-2018 Jean-Pierre Andre\n\n");
0f6478
 	fprintf(stderr, "%s\n%s%s", ntfs_gpl, ntfs_bugs, ntfs_home);
0f6478
 	exit(0);
0f6478
 }
0f6478
@@ -756,7 +756,7 @@ 
0f6478
 
0f6478
 static void copy_cluster(int rescue, u64 rescue_lcn, u64 lcn)
0f6478
 {
0f6478
-	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
0f6478
+	char *buff;
0f6478
 	/* vol is NULL if opt.restore_image is set */
0f6478
 	s32 csize = le32_to_cpu(image_hdr.cluster_size);
0f6478
 	BOOL backup_bootsector;
0f6478
@@ -783,6 +783,10 @@ 
0f6478
 		}
0f6478
 	}
0f6478
 
0f6478
+	buff = (char*)ntfs_malloc(csize);
0f6478
+	if (!buff)
0f6478
+		err_exit("Not enough memory");
0f6478
+
0f6478
 // need reading when not about to write ?
0f6478
 	if (read_all(fd, buff, csize) == -1) {
0f6478
 
0f6478
@@ -858,6 +862,7 @@ 
0f6478
 		perr_printf("Write failed");
0f6478
 #endif
0f6478
 	}
0f6478
+	free(buff);
0f6478
 }
0f6478
 
0f6478
 static s64 lseek_out(int fd, s64 pos, int mode)
0f6478
@@ -995,7 +1000,11 @@ 
0f6478
 				 struct progress_bar *progress, u64 *p_counter)
0f6478
 {
0f6478
 	s64 i;
0f6478
-	char buff[NTFS_MAX_CLUSTER_SIZE];
0f6478
+	char *buff;
0f6478
+
0f6478
+	buff = (char*)ntfs_malloc(csize);
0f6478
+	if (!buff)
0f6478
+		err_exit("Not enough memory");
0f6478
 
0f6478
 	memset(buff, 0, csize);
0f6478
 
0f6478
@@ -1004,6 +1013,7 @@ 
0f6478
 			perr_exit("write_all");
0f6478
 		progress_update(progress, ++(*p_counter));
0f6478
 	}
0f6478
+	free(buff);
0f6478
 }
0f6478
 
0f6478
 static void restore_image(void)
0f6478
@@ -1492,7 +1502,7 @@ 
0f6478
 
0f6478
 static void copy_wipe_mft(ntfs_walk_clusters_ctx *image, runlist *rl)
0f6478
 {
0f6478
-	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
0f6478
+	char *buff;
0f6478
 	void *fd;
0f6478
 	s64 mft_no;
0f6478
 	u32 mft_record_size;
0f6478
@@ -1522,6 +1532,10 @@ 
0f6478
 		clusters_per_set = mft_record_size/csize;
0f6478
 		records_per_set = 1;
0f6478
 	}
0f6478
+	buff = (char*)ntfs_malloc(mft_record_size);
0f6478
+	if (!buff)
0f6478
+		err_exit("Not enough memory");
0f6478
+
0f6478
 	mft_no = 0;
0f6478
 	ri = rj = 0;
0f6478
 	wi = wj = 0;
0f6478
@@ -1554,6 +1568,7 @@ 
0f6478
 		}
0f6478
 	}
0f6478
 	image->current_lcn = current_lcn;
0f6478
+	free(buff);
0f6478
 }
0f6478
 
0f6478
 /*
0f6478
@@ -1566,7 +1581,7 @@ 
0f6478
 
0f6478
 static void copy_wipe_i30(ntfs_walk_clusters_ctx *image, runlist *rl)
0f6478
 {
0f6478
-	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
0f6478
+	char *buff;
0f6478
 	void *fd;
0f6478
 	u32 indx_record_size;
0f6478
 	u32 csize;
0f6478
@@ -1595,6 +1610,10 @@ 
0f6478
 		clusters_per_set = indx_record_size/csize;
0f6478
 		records_per_set = 1;
0f6478
 	}
0f6478
+	buff = (char*)ntfs_malloc(indx_record_size);
0f6478
+	if (!buff)
0f6478
+		err_exit("Not enough memory");
0f6478
+
0f6478
 	ri = rj = 0;
0f6478
 	wi = wj = 0;
0f6478
 	if (rl[ri].length)
0f6478
@@ -1627,6 +1646,7 @@ 
0f6478
 		}
0f6478
 	}
0f6478
 	image->current_lcn = current_lcn;
0f6478
+	free(buff);
0f6478
 }
0f6478
 
0f6478
 static void dump_clusters(ntfs_walk_clusters_ctx *image, runlist *rl)
0f6478
--- ntfsprogs/ntfsresize.c.ref	2017-03-23 10:42:44.000000000 +0100
0f6478
+++ ntfsprogs/ntfsresize.c	2018-05-07 09:11:13.076883400 +0200
0f6478
@@ -59,6 +59,7 @@ 
0f6478
 #include <fcntl.h>
0f6478
 #endif
0f6478
 
0f6478
+#include "param.h"
0f6478
 #include "debug.h"
0f6478
 #include "types.h"
0f6478
 #include "support.h"
0f6478
@@ -243,8 +244,6 @@ 
0f6478
 #define DIRTY_INODE		(1)
0f6478
 #define DIRTY_ATTRIB		(2)
0f6478
 
0f6478
-#define NTFS_MAX_CLUSTER_SIZE	(65536)
0f6478
-
0f6478
 static s64 rounded_up_division(s64 numer, s64 denom)
0f6478
 {
0f6478
 	return (numer + (denom - 1)) / denom;
0f6478
@@ -404,7 +403,7 @@ 
0f6478
 	printf("Copyright (c) 2002-2005  Anton Altaparmakov\n");
0f6478
 	printf("Copyright (c) 2002-2003  Richard Russon\n");
0f6478
 	printf("Copyright (c) 2007       Yura Pakhuchiy\n");
0f6478
-	printf("Copyright (c) 2011-2016  Jean-Pierre Andre\n");
0f6478
+	printf("Copyright (c) 2011-2018  Jean-Pierre Andre\n");
0f6478
 	printf("\n%s\n%s%s", ntfs_gpl, ntfs_bugs, ntfs_home);
0f6478
 }
0f6478
 
0f6478
@@ -1849,9 +1848,13 @@ 
0f6478
 static void copy_clusters(ntfs_resize_t *resize, s64 dest, s64 src, s64 len)
0f6478
 {
0f6478
 	s64 i;
0f6478
-	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
0f6478
+	char *buff;
0f6478
 	ntfs_volume *vol = resize->vol;
0f6478
 
0f6478
+	buff = (char*)ntfs_malloc(vol->cluster_size);
0f6478
+	if (!buff)
0f6478
+		perr_exit("ntfs_malloc");
0f6478
+
0f6478
 	for (i = 0; i < len; i++) {
0f6478
 
0f6478
 		lseek_to_cluster(vol, src + i);
0f6478
@@ -1875,6 +1878,7 @@ 
0f6478
 		resize->relocations++;
0f6478
 		progress_update(&resize->progress, resize->relocations);
0f6478
 	}
0f6478
+	free(buff);
0f6478
 }
0f6478
 
0f6478
 static void relocate_clusters(ntfs_resize_t *r, runlist *dest_rl, s64 src_lcn)
0f6478
--- include/ntfs-3g/param.h.ref	2017-03-23 10:42:44.000000000 +0100
0f6478
+++ include/ntfs-3g/param.h	2018-05-07 09:11:13.088302600 +0200
0f6478
@@ -40,6 +40,13 @@ 
0f6478
 };
0f6478
 
0f6478
 /*
0f6478
+ *		Parameters for formatting
0f6478
+ */
0f6478
+
0f6478
+		/* Up to Windows 10, the cluster size was limited to 64K */
0f6478
+#define NTFS_MAX_CLUSTER_SIZE 2097152 /* Windows 10 Creators allows 2MB */
0f6478
+
0f6478
+/*
0f6478
  *		Parameters for compression
0f6478
  */
0f6478