SOURCES: mpt-status-sync_info.patch (NEW) - add --sync_info option...
zergin
zergin at pld-linux.org
Sat Mar 22 22:01:28 CET 2008
Author: zergin Date: Sat Mar 22 21:01:28 2008 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- add --sync_info option to mpt-status (patch)
returns more info about array resynchronization process, provides data
about: resync rate (MiB/s), resync data (done/total, left) and ETA
TESTED ONLY ON MY SYSTEM: x86_64 with 3442E-R HBA
- up rel 1 -> 2
---- Files affected:
SOURCES:
mpt-status-sync_info.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/mpt-status-sync_info.patch
diff -u /dev/null SOURCES/mpt-status-sync_info.patch:1.1
--- /dev/null Sat Mar 22 22:01:28 2008
+++ SOURCES/mpt-status-sync_info.patch Sat Mar 22 22:01:23 2008
@@ -0,0 +1,240 @@
+Only in mod/: .mpt-status.c~
+Only in mod/: .mpt-status.h~
+diff -ur orig/mpt-status.c mod/mpt-status.c
+--- orig/mpt-status.c 2006-11-01 09:13:35.000000000 +0000
++++ mod/mpt-status.c 2008-03-22 20:31:56.546110535 +0000
+@@ -38,6 +38,7 @@
+ #include "mpt-status.h"
+
+ #define ARG_M_A 0x0001
++#define ARG_M_S 0x0002
+
+ static int m = 0;
+ static int quiet_mode = 0;
+@@ -52,6 +53,7 @@
+ static int ioc_unit = 0;
+ static int newstyle = 0;
+ static int sync_state[2] = { 0, 0 };
++static int sync_info = 0;
+
+ static int sel;
+ static const struct option long_options[] = {
+@@ -64,6 +66,7 @@
+ { "quiet", no_argument, NULL, 'q' },
+ { "set_id", required_argument, NULL, 'i' },
+ { "status_only", no_argument, NULL, 's' },
++ { "sync_info", no_argument, &sel, ARG_M_S },
+ { "verbose", no_argument, NULL, 'v' },
+ { "version", no_argument, NULL, 'V' },
+ { 0, no_argument, NULL, 0 },
+@@ -85,6 +88,8 @@
+ " -i, --set_id <int> Set id of primary device (check README)\n"
+ " -s, --status_only Only print the status information. This can\n"
+ " be used for easy scripting\n"
++ " --sync_info Show RAID (re)synchronization information\n"
++ " (subject to quite mode setting)\n"
+ " -u, --controller <int> Set the IOC unit (controller)\n"
+ " -v, --verbose Print verbose information, such as warnings\n"
+ " -V, --version Print version information\n"
+@@ -124,6 +129,7 @@
+ static void GetHotSpareInfo(void);
+ static void GetResyncPercentageSilent(RaidVol0PhysDisk_t *, unsigned char *, int);
+ static void GetResyncPercentage(RaidVol0PhysDisk_t *, unsigned char *, int);
++static void GetSyncInfo(void);
+ static void do_init(void);
+ /* internal-functions declaration */
+ static void __check_endianess(void);
+@@ -131,6 +137,7 @@
+ static void __print_volume_classic(RaidVolumePage0_t *);
+ static void __print_physdisk_advanced(RaidPhysDiskPage0_t *, int);
+ static void __print_physdisk_classic(RaidPhysDiskPage0_t *);
++static SyncInfoData __get_resync_data(void);
+
+ static void __check_endianess(void) {
+ int i = 1;
+@@ -770,6 +777,138 @@
+ return;
+ }
+
++/* get resync data for volume 0 only */
++static SyncInfoData __get_resync_data(void) {
++ SyncInfoData data = { -1, -1, -1 };
++ MpiRaidActionRequest_t *pRequest;
++ unsigned int numBytes;
++
++ // get size for structure
++ numBytes = (sizeof(Config_t) - sizeof(SGE_IO_UNION)) + sizeof(SGESimple64_t);
++
++ // get mpi block pointer
++ if ((mpiBlkPtr = allocIoctlBlk(numBytes)) == NULL ) return data;
++
++ // set Sge offset (dunno)
++ mpiBlkPtr->dataSgeOffset = (sizeof (MpiRaidActionRequest_t) - sizeof(SGE_IO_UNION))/4;
++
++ /* Initialize data in/data out sizes: Change below if need to */
++ mpiBlkPtr->dataInSize = mpiBlkPtr->dataOutSize = 0;
++
++ // prepare request call
++ pRequest = (MpiRaidActionRequest_t *) mpiBlkPtr->MF;
++ pRequest->Action = MPI_RAID_ACTION_INDICATOR_STRUCT;
++ pRequest->Function = MPI_FUNCTION_RAID_ACTION;
++ pRequest->MsgContext = -1;
++ pRequest->ActionDataWord = 0; /* action data is 0 */
++
++ // if status is ok - read total and remaining blocks
++ if(read_page2(MPT_FLAGS_KEEP_MEM)==0) {
++ uint *pdata = (uint *) mpiBlkPtr->replyFrameBufPtr;
++
++ // populate data structure - total blocks
++ pdata += 6;
++ data.blocks_total = *pdata;
++
++ // populate data structure - left blocks
++ pdata += 2;
++ data.blocks_left = *pdata;
++
++ // populate data structure - done blocks
++ data.blocks_done = data.blocks_total - data.blocks_left;
++ }
++
++ // free unused memory
++ freeMem();
++
++ // return populated structure
++ return data;
++}
++
++static void GetSyncInfo(void) {
++ // data holder for rate count
++ SyncInfoData data[2];
++
++ // get first data read
++ data[0] = __get_resync_data();
++
++ // if no blocks left to synchronize - we're synchronized, we can finish
++ if( 0 == data[0].blocks_left ) {
++ printf("STATUS: no resync in progress (synchronized or degraded: status unhandled).\n");
++
++ // we're synchronizing now... count rates, times, etc...
++ } else if( 0 < data[0].blocks_left ) {
++ char progress[52] = "[ ]";
++ int percent = 0,
++ diff = 0,
++ i = 0,
++ time[4];
++ double size_total = 0,
++ size_left = 0,
++ size_done = 0,
++ rate = 0;
++
++ // get second data probe after 0.1 sec wait
++ usleep(100000);
++ data[1] = __get_resync_data();
++
++ // get basic stats (percent done and synchronization rate)
++ diff = (data[0].blocks_left - data[1].blocks_left); // blocks done in 0.1sec
++ percent = ((data[1].blocks_done >> 6)*100)/(data[1].blocks_total >> 6); // percent done
++ rate = ((double)diff/1048576)*5120; // MiB/s
++
++ size_total = (((double)data[1].blocks_total/1048576)*512)/1024; // total array size in GiB
++ size_left = (((double)data[1].blocks_left/1048576)*512)/1024; // size left to synchronize in GiB
++ size_done = (((double)data[1].blocks_done/1048576)*512)/1024; // size already synchronized in GiB
++
++ time[3] = data[1].blocks_left/diff/10; // total seconds left
++ time[0] = time[3]/3600; // H
++ time[1] = (time[3]-(3600*time[0]))/60; // i
++ time[2] = time[3]-(3600*time[0])-(60*time[1]); // s
++
++ // set progress bar...
++ for(i = 1; i < percent/2; i++)
++ progress[i] = '=';
++ progress[i-1] = '>';
++
++ // if in quite_mode: only print resync status
++ if(quiet_mode>0) {
++ printf("STATUS: RESYNC_IN_PROGRESS %u%% (%01.0f/%01.0f GiB) @ %01.1f MiB/s, %uh %02um left\n",
++ percent,
++ size_done,
++ size_total,
++ rate,
++ time[0],
++ time[1]
++ );
++
++ // othewise be more verbose
++ } else {
++ printf("STATUS: Volume 0 array is being resynchronized\n");
++
++ printf("STATUS: Data done: %01.3f GiB / %01.3f GiB (%01.3f GiB left)\n",
++ size_done,
++ size_total,
++ size_left
++ );
++
++ printf("STATUS: Aproximatly time left: %02uh %02um %02us.\n",
++ time[0],
++ time[1],
++ time[2]
++ );
++
++ printf("%u%% %s %01.2f MiB/s\n", percent, progress, rate);
++ }
++
++ } else {
++ printf("STATUS: Error obtaining resync info.\n");
++ mpt_exit(MPT_EXIT_UNKNOWN);
++ }
++
++ return;
++}
++
+ static void __print_volume_advanced(RaidVolumePage0_t *page) {
+ if (1 == print_status_only) {
+ mpt_printf("vol_id:%d", page->VolumeID);
+@@ -1164,9 +1303,9 @@
+ mpt_exit(MPT_EXIT_OKAY);
+ break;
+ case 0:
+- if (sel == ARG_M_A) {
+- auto_load++;
+- }
++ if (sel == ARG_M_A) auto_load++;
++ if (sel == ARG_M_S) sync_info = 1;
++
+ break;
+ case -1:
+ // Done with options
+@@ -1192,7 +1331,6 @@
+ mpt_exit(MPT_EXIT_UNKNOWN);
+ }
+ */
+- GetVolumeInfo();
+ } else {
+ /* this is the old style setup */
+ if (probe_id > 0) {
+@@ -1208,7 +1346,10 @@
+ mpt_exit(MPT_EXIT_OKAY);
+ }
+ }
+- GetVolumeInfo();
+ }
++
++ if(sync_info) GetSyncInfo();
++ else GetVolumeInfo();
++
+ return mpt_exit_mask;
+ }
+diff -ur orig/mpt-status.h mod/mpt-status.h
+--- orig/mpt-status.h 2006-10-26 08:06:52.000000000 +0000
++++ mod/mpt-status.h 2008-03-22 20:28:34.563193720 +0000
+@@ -60,4 +60,10 @@
+
+ typedef struct mpt_ioctl_command mpiIoctlBlk_t;
+
++typedef struct _SYNC_INFO {
++ int blocks_total;
++ int blocks_done;
++ int blocks_left;
++} SyncInfoData;
++
+ #endif /* End of mpt-status.h */
================================================================
More information about the pld-cvs-commit
mailing list