#include #include #include 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 \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 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()); } }