From d05932849c69d79aef383623850d98678d0b4e27 Mon Sep 17 00:00:00 2001 From: "cantab.net!aia21" Date: Wed, 17 Mar 2004 12:22:03 +0000 Subject: [PATCH] - Add new API device.[hc]::ntfs_device_partition_start_sector_get() and make mkntfs use it. - Provide a new command line option "-p" to allow the user to specify the partition start sector manually. - Add include sys/ioctl.h to fix sector size detection. (Logical change 1.336) --- ntfsprogs/mkntfs.c | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/ntfsprogs/mkntfs.c b/ntfsprogs/mkntfs.c index fe4fc148..4720a82d 100644 --- a/ntfsprogs/mkntfs.c +++ b/ntfsprogs/mkntfs.c @@ -70,6 +70,7 @@ extern int optind; #endif #include +#include #include #ifdef HAVE_LINUX_MAJOR_H # include @@ -160,6 +161,8 @@ char *dev_name; struct { int sector_size; /* -s, in bytes, power of 2, default is 512 bytes. */ + long long part_start_sect; /* start sector of partition on parent + device */ long long nr_sectors; /* size of device in sectors */ long long nr_clusters; /* Note: Win2k treats clusters as 32-bit entities! */ @@ -259,7 +262,7 @@ static void err_exit(const char *fmt, ...) */ static void copyright(void) { - fprintf(stderr, "Copyright (c) 2000-2003 Anton Altaparmakov\n" + fprintf(stderr, "Copyright (c) 2000-2004 Anton Altaparmakov\n" "Copyright (c) 2001-2003 Richard Russon\n" "Create an NTFS volume on a user specified (block) " "device.\n"); @@ -284,6 +287,8 @@ static void usage(void) "[number-of-sectors]\n" " -s sector-size Specify the sector size " "for the device\n" + " -p part-start-sect Specify the partition " + "start sector\n" " -c cluster-size Specify the cluster " "size for the volume\n" " -L volume-label Set the volume label\n" @@ -326,7 +331,7 @@ static void parse_options(int argc, char *argv[]) if (argc && *argv) EXEC_NAME = *argv; fprintf(stderr, "%s v%s\n", EXEC_NAME, VERSION); - while ((c = getopt(argc, argv, "c:fh?nqs:vz:CFIL:QVl")) != EOF) + while ((c = getopt(argc, argv, "c:fh?np:qs:vz:CFIL:QVl")) != EOF) switch (c) { case 'n': opts.no_action = 1; @@ -341,6 +346,16 @@ static void parse_options(int argc, char *argv[]) case 'Q': opts.quick_format = 1; break; + case 'p': + u = strtoul(optarg, &s, 0); + opts.part_start_sect = u; + if ((u >= ULONG_MAX && errno == ERANGE) || *s || + (opts.part_start_sect >> 32)) + err_exit("Invalid partition start sector: %s " + "Maximum is 4294967295 " + "(2^32-1).\n", + optarg); + break; case 'q': opts.quiet = 1; break; @@ -2447,6 +2462,7 @@ static int create_hardlink(INDEX_BLOCK *index, const MFT_REF ref_parent, static void init_options(void) { memset(&opts, 0, sizeof(opts)); + opts.part_start_sect = -1; opts.index_block_size = 4096; opts.attr_defs = (ATTR_DEF*)&attrdef_ntfs12_array; opts.attr_defs_len = sizeof(attrdef_ntfs12_array); @@ -2659,6 +2675,20 @@ int main(int argc, char **argv) opts.nr_sectors); /* Reserve the last sector for the backup boot sector. */ opts.nr_sectors--; + /* If user didn't specify the partition start sector, determine it. */ + if (opts.part_start_sect == -1) { + opts.part_start_sect = ntfs_device_partition_start_sector_get( + vol->dev); + if (opts.part_start_sect < 0) { + Eprintf("No partition start sector specified for %s " + "and it could not\nbe obtained " + "automatically. Setting it to 0.\n" + "This will probably cause Windows not " + "to be able to boot from this " + "volume.\n", vol->dev->d_name); + opts.part_start_sect = 0; + } + } /* If user didn't specify the volume size, determine it now. */ if (!opts.volume_size) opts.volume_size = opts.nr_sectors * opts.sector_size; @@ -3284,10 +3314,13 @@ int main(int argc, char **argv) bs->bpb.sectors_per_cluster = (u8)(vol->cluster_size / opts.sector_size); bs->bpb.media_type = 0xf8; /* hard disk */ + bs->bpb.hidden_sectors = cpu_to_le32(opts.part_start_sect); + Dprintf("hidden sectors = %lli (0x%llx)\n", opts.part_start_sect, + opts.part_start_sect); /* * If there are problems go back to bs->unused[0-3] and set them. See - * ../include/bootsect.h for details. Other fields to also consider - * setting are: bs->bpb.sectors_per_track, .heads, and .hidden_sectors. + * ../include/layout.h for details. Other fields to also consider + * setting are: bs->bpb.sectors_per_track and .heads. */ bs->number_of_sectors = scpu_to_le64(opts.nr_sectors); bs->mft_lcn = scpu_to_le64(opts.mft_lcn); @@ -3303,7 +3336,7 @@ int main(int argc, char **argv) "is wrong (= 0x%x)\n", bs->clusters_per_mft_record); } - Dprintf("Clusters per mft record = %i (0x%x)\n", + Dprintf("clusters per mft record = %i (0x%x)\n", bs->clusters_per_mft_record, bs->clusters_per_mft_record); if (opts.index_block_size >= (int)vol->cluster_size) @@ -3317,7 +3350,7 @@ int main(int argc, char **argv) "is wrong (= 0x%x)\n", bs->clusters_per_index_record); } - Dprintf("Clusters per index block = %i (0x%x)\n", + Dprintf("clusters per index block = %i (0x%x)\n", bs->clusters_per_index_record, bs->clusters_per_index_record); /* Generate a 64-bit random number for the serial number. */