94 lines
2.8 KiB
C
94 lines
2.8 KiB
C
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <ftapi.h>
|
||
|
|
||
|
void __cdecl
|
||
|
main(
|
||
|
int argc,
|
||
|
char** argv
|
||
|
)
|
||
|
|
||
|
{
|
||
|
FT_LOGICAL_DISK_ID diskId[2], newDiskId;
|
||
|
ULONG weight1, weight2;
|
||
|
FT_REDISTRIBUTION_CONFIGURATION_INFORMATION configInfo;
|
||
|
BOOL b;
|
||
|
LONGLONG volsize1, volsize2, newSize, rowSize, numRows, tmp;
|
||
|
INT d;
|
||
|
CHAR c;
|
||
|
|
||
|
if (argc != 5) {
|
||
|
printf("usage: %s <diskId1> <diskId2> <width1> <width2>\n", argv[0]);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
sscanf(argv[1], "%I64X", &diskId[0]);
|
||
|
sscanf(argv[2], "%I64X", &diskId[1]);
|
||
|
sscanf(argv[3], "%d", &weight1);
|
||
|
sscanf(argv[4], "%d", &weight2);
|
||
|
|
||
|
if (weight1 >= 0x10000 || weight2 >= 0x10000) {
|
||
|
printf("Weight too large.\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
printf("Redistributing data on disk %I64X with disk %I64X\n",
|
||
|
diskId[0], diskId[1]);
|
||
|
printf("Weightings are %d for first disk and %d for second disk.\n",
|
||
|
weight1, weight2);
|
||
|
|
||
|
configInfo.StripeSize = 0x10000;
|
||
|
configInfo.FirstMemberWidth = (USHORT) weight1;
|
||
|
configInfo.SecondMemberWidth = (USHORT) weight2;
|
||
|
|
||
|
b = FtQueryLogicalDiskInformation(diskId[0], NULL, &volsize1,
|
||
|
0, NULL, NULL, 0, NULL, 0, NULL);
|
||
|
if (!b) {
|
||
|
printf("Invalid disk id.\n");
|
||
|
return;
|
||
|
}
|
||
|
b = FtQueryLogicalDiskInformation(diskId[1], NULL, &volsize2,
|
||
|
0, NULL, NULL, 0, NULL, 0, NULL);
|
||
|
if (!b) {
|
||
|
printf("Invalid disk id.\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
printf("Total disk size before redistribution = %I64d\n", volsize1);
|
||
|
|
||
|
rowSize = configInfo.StripeSize*(configInfo.FirstMemberWidth +
|
||
|
configInfo.SecondMemberWidth);
|
||
|
|
||
|
numRows = volsize1/(configInfo.StripeSize*configInfo.FirstMemberWidth);
|
||
|
tmp = volsize2/(configInfo.StripeSize*configInfo.SecondMemberWidth);
|
||
|
if (tmp < numRows) {
|
||
|
numRows = tmp;
|
||
|
}
|
||
|
|
||
|
newSize = numRows*rowSize;
|
||
|
|
||
|
printf("Total disk size after redistribution = %I64d\n", newSize);
|
||
|
printf("Disk space wasted by redistribution = %I64d\n",
|
||
|
volsize1 + volsize2 - newSize);
|
||
|
|
||
|
if (newSize < volsize1) {
|
||
|
printf("New size less than existing size.\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
printf("\nPress <CTRL-C> to cancel operation...");
|
||
|
|
||
|
c = getchar();
|
||
|
|
||
|
printf("\nCreating redistribution...\n");
|
||
|
|
||
|
b = FtCreateLogicalDisk(FtRedistribution, 2, diskId,
|
||
|
sizeof(configInfo), &configInfo, &newDiskId);
|
||
|
|
||
|
if (b) {
|
||
|
printf("Redistribution %I64X created.\n", newDiskId);
|
||
|
} else {
|
||
|
printf("Redistribution create failed with %d\n", GetLastError());
|
||
|
}
|
||
|
}
|