Skip to content

Commit 7cbf0bb

Browse files
oliverkurthGitHub Enterprise
authored andcommitted
Merge pull request #18 from vcf/topic/okurth/grain-order
reorder grains if needed
2 parents 643cae0 + 03e266b commit 7cbf0bb

File tree

4 files changed

+493
-101
lines changed

4 files changed

+493
-101
lines changed

vmdk/diskinfo.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ typedef struct {
3030
int (*close)(DiskInfo *self);
3131
int (*abort)(DiskInfo *self);
3232
ssize_t (*copyDisk)(DiskInfo *self, DiskInfo *src, int numThreads);
33+
bool (*checkGrainOrder)(DiskInfo *self); /* Returns true if grains are ordered in the grain table */
3334
} DiskInfoVMT;
3435

3536
struct DiskInfo {
@@ -41,6 +42,6 @@ extern char *toolsVersion; /* toolsVersion in metadata */
4142
DiskInfo *Flat_Open(const char *fileName);
4243
DiskInfo *Flat_Create(const char *fileName, off_t capacity);
4344
DiskInfo *Sparse_Open(const char *fileName);
44-
DiskInfo *StreamOptimized_Create(const char *fileName, off_t capacity, int compressionLevel);
45+
DiskInfo *StreamOptimized_Create(const char *fileName, off_t capacity, int compressionLevel, bool doReorder);
4546

4647
#endif /* _DISKINFO_H_ */

vmdk/flat.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ static DiskInfoVMT flatDiskInfoVMT = {
113113
.pwrite = FlatPwrite,
114114
.nextData = FlatNextData,
115115
.close = FlatClose,
116-
.abort = FlatClose
116+
.abort = FlatClose,
117+
.copyDisk = NULL,
118+
.checkGrainOrder = NULL
117119
};
118120

119121
DiskInfo *

vmdk/mkdisk.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,11 @@ printUsage(char *cmd, int compressionLevel, int numThreads)
109109
{
110110
printf("Usage:\n");
111111
printf("%s -i [--detailed] src.vmdk: displays information for specified virtual disk\n", cmd);
112-
printf("%s [-c compressionlevel] [-n threads] [-t toolsVersion] src.vmdk dst.vmdk: converts source disk to destination disk with given tools version\n\n", cmd);
112+
printf("%s [-c compressionlevel] [-n threads] [-t toolsVersion] [--noreorder] src.vmdk dst.vmdk: converts source disk to destination disk with given tools version\n\n", cmd);
113113
printf("-c <level> sets the compression level. Valid values are 1 (fastest) to 9 (best). Only when writing to VMDK. Current is %d.\n", compressionLevel);
114114
printf("-n <threads> sets the number of threads used for compression level. Only when writing to VMDK. Current is (%d).\n", numThreads);
115115
printf("--detailed shows detailed sparse extent header information (only with -i)\n");
116+
printf("--noreorder disables grain reordering after compression (default: reordering enabled)\n");
116117

117118
return 1;
118119
}
@@ -149,13 +150,15 @@ main(int argc,
149150
bool doInfo = false;
150151
bool doDetailed = false;
151152
bool doConvert = false;
153+
bool doReorder = true; // Default to true for backward compatibility
152154
int compressionLevel = Z_BEST_COMPRESSION;
153155
int numThreads = get_nprocs();
154156
const char *env;
155157

156158
static struct option long_options[] = {
157159
{"detailed", no_argument, 0, 'd'},
158160
{"help", no_argument, 0, 'h'},
161+
{"noreorder", no_argument, 0, 'r'},
159162
{0, 0, 0, 0}
160163
};
161164

@@ -200,6 +203,9 @@ main(int argc,
200203
}
201204
numThreads = atoi(optarg);
202205
break;
206+
case 'r':
207+
doReorder = false;
208+
break;
203209
case 't':
204210
doConvert = true;
205211
toolsVersion = optarg;
@@ -220,8 +226,8 @@ main(int argc,
220226
exit(1);
221227
}
222228

223-
if (compressionLevel <= 0 || compressionLevel > 9) {
224-
fprintf(stderr, "compression level must be > 0 and <= 9: %d\n", compressionLevel);
229+
if (compressionLevel < 0 || compressionLevel > 9) {
230+
fprintf(stderr, "compression level must be >= 0 and <= 9: %d\n", compressionLevel);
225231
exit(1);
226232
}
227233

@@ -288,6 +294,9 @@ main(int argc,
288294
printf("\"rgdOffset\": %llu, ", (unsigned long long)sdi->diskHdr.rgdOffset);
289295
printf("\"gdOffset\": %llu, ", (unsigned long long)sdi->diskHdr.gdOffset);
290296
printf("\"overHead\": %llu", (unsigned long long)sdi->diskHdr.overHead);
297+
if (di->vmt->checkGrainOrder) {
298+
printf(", \"grainsOrdered\": %s", di->vmt->checkGrainOrder(di) ? "true" : "false");
299+
}
291300
printf("}");
292301
} else {
293302
printf(", \"error\": \"detailed information only available for sparse VMDK files\"");
@@ -308,7 +317,7 @@ main(int argc,
308317
capacity = di->vmt->getCapacity(di);
309318

310319
if (strcmp(&(filename[strlen(filename) - 5]), ".vmdk") == 0)
311-
tgt = StreamOptimized_Create(filename, capacity, compressionLevel);
320+
tgt = StreamOptimized_Create(filename, capacity, compressionLevel, doReorder);
312321
else
313322
tgt = Flat_Create(filename, capacity);
314323

0 commit comments

Comments
 (0)