windows-nt/Source/XPSP1/NT/drivers/ftapi/ftredist/ftredist.c

94 lines
2.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#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());
}
}