| 1 | #!/bin/ksh | 
|---|
| 2 | # IBM_PROLOG_BEGIN_TAG | 
|---|
| 3 | # This is an automatically generated prolog. | 
|---|
| 4 | # | 
|---|
| 5 | # | 
|---|
| 6 | # | 
|---|
| 7 | # Licensed Materials - Property of IBM | 
|---|
| 8 | # | 
|---|
| 9 | # (C) COPYRIGHT International Business Machines Corp. 1999,2007 | 
|---|
| 10 | # All Rights Reserved | 
|---|
| 11 | # | 
|---|
| 12 | # US Government Users Restricted Rights - Use, duplication or | 
|---|
| 13 | # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. | 
|---|
| 14 | # | 
|---|
| 15 | # IBM_PROLOG_END_TAG | 
|---|
| 16 | # @(#)83 1.109.1.2 src/avs/fs/mmfs/ts/admin/mmfsfuncs.sh, mmfs, avs_rgpfs24, rgpfs24s012a 3/29/07 13:07:03 | 
|---|
| 17 | ###################################################################### | 
|---|
| 18 |  | 
|---|
| 19 |  | 
|---|
| 20 | ###################################################################### | 
|---|
| 21 | #  Pull in operating system dependent functions and declarations. | 
|---|
| 22 | ###################################################################### | 
|---|
| 23 | [[ -e ${mmcmdDir}/mmfsfuncs.$osName ]] &&  \ | 
|---|
| 24 | . ${mmcmdDir}/mmfsfuncs.$osName | 
|---|
| 25 |  | 
|---|
| 26 |  | 
|---|
| 27 | ################################################################## | 
|---|
| 28 | # | 
|---|
| 29 | # Function:  Given a disk name, find the file system to which | 
|---|
| 30 | #            the disk belongs. | 
|---|
| 31 | # | 
|---|
| 32 | # Input:     $1 - Name of disk | 
|---|
| 33 | #            $2 - Name of mmsdrfs file | 
|---|
| 34 | # | 
|---|
| 35 | # Output:    $1 - File system name | 
|---|
| 36 | # | 
|---|
| 37 | # Returns:   0 - file system found | 
|---|
| 38 | #            1 - file system not found | 
|---|
| 39 | # | 
|---|
| 40 | ################################################################## | 
|---|
| 41 | function findFSforDisk  #  <diskName>  <sdrfs> | 
|---|
| 42 | { | 
|---|
| 43 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 44 | [[ -n $DEBUG || -n $DEBUGfindFSforDisk ]] && set -x | 
|---|
| 45 | $mmTRACE_ENTER "$*" | 
|---|
| 46 | typeset diskName=$1 | 
|---|
| 47 | typeset sdrfs=$2 | 
|---|
| 48 | typeset rc fsName | 
|---|
| 49 |  | 
|---|
| 50 | # The awk script looks at all SG_DISKS lines. | 
|---|
| 51 | # If the disk name field matches the value in $diskName, | 
|---|
| 52 | # we have located the line that we are looking for. | 
|---|
| 53 | # Print the file system device name and stop. | 
|---|
| 54 | fsName=$($awk -F: '                              \ | 
|---|
| 55 | /':$SG_DISKS:'/ {                              \ | 
|---|
| 56 | if ($'$DISK_NAME_Field' == "'$diskName'" &&  \ | 
|---|
| 57 | $'$DEV_NAME_Field' != "'$NO_DEVICE'") {  \ | 
|---|
| 58 | { print $'$DEV_NAME_Field' }               \ | 
|---|
| 59 | { exit 0 }                                 \ | 
|---|
| 60 | }                                            \ | 
|---|
| 61 | }                                              \ | 
|---|
| 62 | ' $sdrfs) | 
|---|
| 63 | checkForErrors awk $? | 
|---|
| 64 |  | 
|---|
| 65 | if [[ -n $fsName ]] | 
|---|
| 66 | then | 
|---|
| 67 | print -- $fsName | 
|---|
| 68 | return 0 | 
|---|
| 69 | else | 
|---|
| 70 | return 1 | 
|---|
| 71 | fi | 
|---|
| 72 |  | 
|---|
| 73 | }  #----- end of function findFSforDisk ------------------ | 
|---|
| 74 |  | 
|---|
| 75 |  | 
|---|
| 76 | ################################################################## | 
|---|
| 77 | # | 
|---|
| 78 | # Function:  Given a disk name, find the corresponding SG_DISKS | 
|---|
| 79 | #            line and return the value of the specified field. | 
|---|
| 80 | # | 
|---|
| 81 | # Input:     $1 - field whose value should be returned | 
|---|
| 82 | #            $2 - name of disk for which info is sought | 
|---|
| 83 | #            $3 - name of mmsdrfs file to search | 
|---|
| 84 | # | 
|---|
| 85 | # Output:    $1 - value of the requested field | 
|---|
| 86 | # | 
|---|
| 87 | # Returns:   0 - disk found and requested value returned | 
|---|
| 88 | #            1 - disk not found | 
|---|
| 89 | # | 
|---|
| 90 | ################################################################## | 
|---|
| 91 | function getDiskInfo  #  <returnField> <diskName> <sdrfs> | 
|---|
| 92 | { | 
|---|
| 93 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 94 | [[ -n $DEBUG || -n $DEBUGgetDiskInfo ]] && set -x | 
|---|
| 95 | $mmTRACE_ENTER "$*" | 
|---|
| 96 | typeset returnField=$1 | 
|---|
| 97 | typeset diskName=$2 | 
|---|
| 98 | typeset sdrfs=$3 | 
|---|
| 99 | typeset rc result | 
|---|
| 100 |  | 
|---|
| 101 | # The awk script looks at SG_DISKS lines. | 
|---|
| 102 | # If the diskname field matches the value in $diskName, | 
|---|
| 103 | # we have located the line that we are looking for. | 
|---|
| 104 | # Print the value of the requested field and stop. | 
|---|
| 105 | result=$($awk -F: '                              \ | 
|---|
| 106 | /':$SG_DISKS:'/ {                              \ | 
|---|
| 107 | if ($'$DISK_NAME_Field' == "'$diskName'") {  \ | 
|---|
| 108 | { print $'$returnField' }                  \ | 
|---|
| 109 | { exit 0 }                                 \ | 
|---|
| 110 | }                                            \ | 
|---|
| 111 | }                                              \ | 
|---|
| 112 | ' $sdrfs) | 
|---|
| 113 | checkForErrors awk $? | 
|---|
| 114 |  | 
|---|
| 115 | if [[ -n $result ]] | 
|---|
| 116 | then | 
|---|
| 117 | print -- $result | 
|---|
| 118 | return 0 | 
|---|
| 119 | else | 
|---|
| 120 | return 1 | 
|---|
| 121 | fi | 
|---|
| 122 |  | 
|---|
| 123 | }  #----- end of function getDiskInfo -------------------- | 
|---|
| 124 |  | 
|---|
| 125 |  | 
|---|
| 126 | ############################################################################ | 
|---|
| 127 | # | 
|---|
| 128 | # Function:  Given an mm disk descriptor and its corresponding free | 
|---|
| 129 | #            SG_DISKS line, this routine validates the parameters, | 
|---|
| 130 | #            converts the descriptor to ts format, and generates | 
|---|
| 131 | #            an updated SG_DISKS line. | 
|---|
| 132 | # | 
|---|
| 133 | # Input:     $1 - disk descriptor in mm format | 
|---|
| 134 | #            $2 - the current (free) SG_DISKS line for the disk | 
|---|
| 135 | #            $3 - file system to which the disk will be assigned | 
|---|
| 136 | #                   or $NO_DEVICE if invoked from mmcrnsd | 
|---|
| 137 | #                   or $CHANGE_NSD if invoked from mmchnsd | 
|---|
| 138 | #            $4 - nodeset to which the file system belongs | 
|---|
| 139 | #                   or $FREE_DISK if invoked from mmcrnsd | 
|---|
| 140 | #            $5 - status string with which to update DISK_STATUS_Field | 
|---|
| 141 | #                   when a match is found; NULL if no value | 
|---|
| 142 | #            $6 - (optional) Default disk usage if usage is not | 
|---|
| 143 | #                   specified in the mm disk descriptor. | 
|---|
| 144 | #                   "oldDiskUsage" is used when replacing a disk. | 
|---|
| 145 | # | 
|---|
| 146 | # Output:    $1 - updated SG_DISKS line for the disk | 
|---|
| 147 | #            $2 - Disk descriptor in TS format | 
|---|
| 148 | #            $3 - Disk usage | 
|---|
| 149 | # | 
|---|
| 150 | # Returns:   0 - valid descriptor | 
|---|
| 151 | #            1 - invalid descriptor | 
|---|
| 152 | # | 
|---|
| 153 | ############################################################################ | 
|---|
| 154 | function validateAndConvertNsdDescriptor  # <mmDiskDesc> <freeDiskLine> | 
|---|
| 155 | # <fs> <nodesetId> <statusString> | 
|---|
| 156 | # [<defaultUsage>] | 
|---|
| 157 | { | 
|---|
| 158 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 159 | [[ -n $DEBUG || -n $DEBUGvalidateAndConvertNsdDescriptor ]] && set -x | 
|---|
| 160 | $mmTRACE_ENTER "$*" | 
|---|
| 161 | typeset mmDiskDesc=$1 | 
|---|
| 162 | typeset freeDiskLine=$2 | 
|---|
| 163 | typeset deviceName=$3 | 
|---|
| 164 | typeset nodesetId=$4 | 
|---|
| 165 | typeset statusString=$5 | 
|---|
| 166 | typeset defaultUsage=$6 | 
|---|
| 167 |  | 
|---|
| 168 | typeset updatedDiskLine diskName diskUsage failureGroup ipa storagePool | 
|---|
| 169 | typeset primaryNsdAdminNode newPrimaryNsdAdminNode | 
|---|
| 170 | typeset primaryNsdDaemonNode newPrimaryNsdDaemonNode | 
|---|
| 171 | typeset backupNsdAdminNode newBackupNsdAdminNode | 
|---|
| 172 | typeset backupNsdDaemonNode newBackupNsdDaemonNode | 
|---|
| 173 | typeset -i primaryNodeNumber defaultFailureGroup | 
|---|
| 174 |  | 
|---|
| 175 | typeset driverType="nsd" | 
|---|
| 176 | typeset sectorSize="" | 
|---|
| 177 | typeset hasMetaData=1 | 
|---|
| 178 | typeset hasData=1 | 
|---|
| 179 | typeset addingDiskToFS="" | 
|---|
| 180 | typeset replacingDisk="" | 
|---|
| 181 |  | 
|---|
| 182 | [[ $statusString = NULL ]] && statusString="" | 
|---|
| 183 | [[ $defaultUsage = oldDiskUsage ]] && replacingDisk=yes | 
|---|
| 184 |  | 
|---|
| 185 | ###################################################################### | 
|---|
| 186 | # Parse the mm descriptor and the current SG_DISKS line for the disk. | 
|---|
| 187 | ###################################################################### | 
|---|
| 188 | IFS=":" | 
|---|
| 189 | set -f ; set -- $mmDiskDesc ; set +f | 
|---|
| 190 | diskName=${1#+(/)dev+(/)}       # name stripped of /dev/ prefix | 
|---|
| 191 | newPrimaryNsdAdminNode=$2 | 
|---|
| 192 | newBackupNsdAdminNode=$3 | 
|---|
| 193 | diskUsage=$4 | 
|---|
| 194 | failureGroup=$5 | 
|---|
| 195 | storagePool=$7 | 
|---|
| 196 |  | 
|---|
| 197 | set -f ; set -A v -- - $freeDiskLine ; set +f | 
|---|
| 198 | IFS="$IFS_sv" | 
|---|
| 199 |  | 
|---|
| 200 | ################################################################# | 
|---|
| 201 | # Determine who the caller is.  The logic depends on whether | 
|---|
| 202 | # we are creating a new disk (mmcrnsd), adding an already | 
|---|
| 203 | # existing disk to a file system (mmcrfs, mmadddisk, mmrpldisk) | 
|---|
| 204 | # or changing some of the disk attributes (mmchnsd). | 
|---|
| 205 | ################################################################# | 
|---|
| 206 | if [[ $deviceName = $NO_DEVICE ]] | 
|---|
| 207 | then | 
|---|
| 208 | # Creating a new disk.  Verify that the disk name is specified. | 
|---|
| 209 | deviceName="" | 
|---|
| 210 | if [[ -z $diskName ]] | 
|---|
| 211 | then | 
|---|
| 212 | # The disk name must be specified in the disk descriptor. | 
|---|
| 213 | printErrorMsg 23 $mmcmd | 
|---|
| 214 | return 1 | 
|---|
| 215 | fi | 
|---|
| 216 | elif [[ $deviceName = $CHANGE_NSD ]] | 
|---|
| 217 | then | 
|---|
| 218 | # The caller is mmchnsd or mmimportfs. | 
|---|
| 219 | # The disk may or may not belong to a file system. | 
|---|
| 220 | deviceName=${v[$DEV_NAME_Field]} | 
|---|
| 221 | [[ $deviceName = $NO_DEVICE ]] && deviceName="" | 
|---|
| 222 | else | 
|---|
| 223 | # The caller is mmcrfs, mmadddisk, or mmrpldisk. | 
|---|
| 224 | # The file system is known. | 
|---|
| 225 | addingDiskToFS=yes | 
|---|
| 226 | fi | 
|---|
| 227 |  | 
|---|
| 228 | ####################################################### | 
|---|
| 229 | # Verify the diskUsage parameter and set the ts flags. | 
|---|
| 230 | ####################################################### | 
|---|
| 231 | [[ -z $defaultUsage ]] && defaultUsage=dataAndMetadata | 
|---|
| 232 |  | 
|---|
| 233 | [[ -z $diskUsage ]] && diskUsage=$defaultUsage | 
|---|
| 234 |  | 
|---|
| 235 | if [[ $diskUsage = dataAndMetadata ]] | 
|---|
| 236 | then | 
|---|
| 237 | :  # There is nothing to do; use default values. | 
|---|
| 238 | elif [[ $diskUsage = metadataOnly ]] | 
|---|
| 239 | then | 
|---|
| 240 | hasData=0 | 
|---|
| 241 | elif [[ $diskUsage = dataOnly ]] | 
|---|
| 242 | then | 
|---|
| 243 | hasMetaData=0 | 
|---|
| 244 | elif [[ $diskUsage = descOnly ]] | 
|---|
| 245 | then | 
|---|
| 246 | hasData=0 | 
|---|
| 247 | hasMetaData=0 | 
|---|
| 248 | elif [[ $diskUsage = oldDiskUsage ]] | 
|---|
| 249 | then | 
|---|
| 250 | hasData="" | 
|---|
| 251 | hasMetaData="" | 
|---|
| 252 | diskUsage=${v[$DISK_USAGE_Field]} | 
|---|
| 253 | else | 
|---|
| 254 | # The disk usage parameter is invalid. | 
|---|
| 255 | printErrorMsg 24 $mmcmd | 
|---|
| 256 | return 1 | 
|---|
| 257 | fi | 
|---|
| 258 |  | 
|---|
| 259 | ####################################################### | 
|---|
| 260 | # Verify the NSD server node values. | 
|---|
| 261 | ####################################################### | 
|---|
| 262 |  | 
|---|
| 263 | # If a server node was specified, make sure that it is valid | 
|---|
| 264 | # and convert it if necessary to an admin node adapter name. | 
|---|
| 265 | if [[ -n $newPrimaryNsdAdminNode ]] | 
|---|
| 266 | then | 
|---|
| 267 | newPrimaryNsdAdminNode=$(checkAndConvertNodeValue  \ | 
|---|
| 268 | $newPrimaryNsdAdminNode $REL_HOSTNAME_Field) | 
|---|
| 269 | [[ $? -ne 0 ]] && return 1 | 
|---|
| 270 | newPrimaryNsdDaemonNode=$(checkAndConvertNodeValue  \ | 
|---|
| 271 | $newPrimaryNsdAdminNode $DAEMON_NODENAME_Field) | 
|---|
| 272 | [[ $? -ne 0 ]] && return 1 | 
|---|
| 273 | fi | 
|---|
| 274 | if [[ -n $newBackupNsdAdminNode ]] | 
|---|
| 275 | then | 
|---|
| 276 | newBackupNsdAdminNode=$(checkAndConvertNodeValue  \ | 
|---|
| 277 | $newBackupNsdAdminNode $REL_HOSTNAME_Field) | 
|---|
| 278 | [[ $? -ne 0 ]] && return 1 | 
|---|
| 279 | newBackupNsdDaemonNode=$(checkAndConvertNodeValue  \ | 
|---|
| 280 | $newBackupNsdAdminNode $DAEMON_NODENAME_Field) | 
|---|
| 281 | [[ $? -ne 0 ]] && return 1 | 
|---|
| 282 | fi | 
|---|
| 283 |  | 
|---|
| 284 | # Are we adding disks to a file system? | 
|---|
| 285 | if [[ -n $addingDiskToFS ]] | 
|---|
| 286 | then | 
|---|
| 287 | # If adding an existing disk to some file system, | 
|---|
| 288 | # the descriptor cannot have NSD server nodes that | 
|---|
| 289 | # are different than the ones already defined. | 
|---|
| 290 | # Note:  Under normal circumstances, the server fields | 
|---|
| 291 | #        in the disk descriptor should be null. | 
|---|
| 292 | primaryNsdAdminNode=${v[$NSD_PRIMARY_NODE_Field]} | 
|---|
| 293 | primaryNsdDaemonNode=${v[$DAEMON_NSD_PRIMARY_Field]} | 
|---|
| 294 | backupNsdAdminNode=${v[$NSD_BACKUP_NODE_Field]} | 
|---|
| 295 | backupNsdDaemonNode=${v[$DAEMON_NSD_BACKUP_Field]} | 
|---|
| 296 |  | 
|---|
| 297 | if [[ -n $newPrimaryNsdAdminNode &&  \ | 
|---|
| 298 | $newPrimaryNsdAdminNode != $primaryNsdAdminNode ]] | 
|---|
| 299 | then | 
|---|
| 300 | # The server node in the disk descriptor is not valid. | 
|---|
| 301 | printErrorMsg 201 $mmcmd $newPrimaryNsdAdminNode | 
|---|
| 302 | return 1 | 
|---|
| 303 | fi | 
|---|
| 304 | if [[ -n $newBackupNsdAdminNode &&  \ | 
|---|
| 305 | $newBackupNsdAdminNode != $backupNsdAdminNode ]] | 
|---|
| 306 | then | 
|---|
| 307 | # The server node in the disk descriptor is not valid. | 
|---|
| 308 | printErrorMsg 201 $mmcmd $newBackupNsdAdminNode | 
|---|
| 309 | return 1 | 
|---|
| 310 | fi | 
|---|
| 311 | else | 
|---|
| 312 | # If creating a new disk or changing an existing one, | 
|---|
| 313 | # accept the server node values from the descriptor. | 
|---|
| 314 | primaryNsdAdminNode=$newPrimaryNsdAdminNode | 
|---|
| 315 | primaryNsdDaemonNode=$newPrimaryNsdDaemonNode | 
|---|
| 316 | backupNsdAdminNode=$newBackupNsdAdminNode | 
|---|
| 317 | backupNsdDaemonNode=$newBackupNsdDaemonNode | 
|---|
| 318 |  | 
|---|
| 319 | if [[ -n $backupNsdAdminNode && -z $primaryNsdAdminNode ]] | 
|---|
| 320 | then | 
|---|
| 321 | # The primary NSD node is not specified. | 
|---|
| 322 | printErrorMsg 491 $mmcmd $diskName | 
|---|
| 323 | return 1 | 
|---|
| 324 | fi | 
|---|
| 325 | fi  # end of if [[ -n $addingDiskToFS ]] | 
|---|
| 326 |  | 
|---|
| 327 | # If a primary NSD node was specified, find its node number | 
|---|
| 328 | # in order to compute the default failure group value. | 
|---|
| 329 | if [[ -n $primaryNsdAdminNode ]] | 
|---|
| 330 | then | 
|---|
| 331 | if [[ $backupNsdAdminNode = $primaryNsdAdminNode ]] | 
|---|
| 332 | then | 
|---|
| 333 | # The primary and backup NSD servers must be different nodes. | 
|---|
| 334 | printErrorMsg 492 $mmcmd | 
|---|
| 335 | return 1 | 
|---|
| 336 | fi | 
|---|
| 337 |  | 
|---|
| 338 | primaryNodeNumber=$(checkAndConvertNodeValue $primaryNsdAdminNode $NODE_NUMBER_Field) | 
|---|
| 339 | [[ $? -ne 0 ]] && return 1 | 
|---|
| 340 |  | 
|---|
| 341 | # The default failure group is the primary server number + 4000. | 
|---|
| 342 | defaultFailureGroup=$primaryNodeNumber+4000 | 
|---|
| 343 | fi  # end of if [[ -n $primaryNsdAdminNode ]] | 
|---|
| 344 |  | 
|---|
| 345 | ############################## | 
|---|
| 346 | # Failure group verification | 
|---|
| 347 | ############################## | 
|---|
| 348 | if [[ -n $replacingDisk ]] | 
|---|
| 349 | then | 
|---|
| 350 | : # Let tsrpldisk handle the failure group. | 
|---|
| 351 |  | 
|---|
| 352 | elif [[ -n $failureGroup ]] | 
|---|
| 353 | then | 
|---|
| 354 | # Validate the user-supplied value. | 
|---|
| 355 | if [[ $failureGroup != ?(-)+([0-9]) ]] | 
|---|
| 356 | then | 
|---|
| 357 | # Invalid integer | 
|---|
| 358 | printErrorMsg 199 $mmcmd $failureGroup | 
|---|
| 359 | return 1 | 
|---|
| 360 | fi | 
|---|
| 361 |  | 
|---|
| 362 | if [[ $failureGroup -ge -1 && $failureGroup -le 4000 || | 
|---|
| 363 | -n $primaryNsdAdminNode && $failureGroup -eq $defaultFailureGroup ]] | 
|---|
| 364 | then | 
|---|
| 365 | : # The user-specified failure group looks reasonable. | 
|---|
| 366 | else | 
|---|
| 367 | # Invalid failure group range. | 
|---|
| 368 | printErrorMsg 30 $mmcmd | 
|---|
| 369 | return 1 | 
|---|
| 370 | fi | 
|---|
| 371 |  | 
|---|
| 372 | elif [[ -n $primaryNsdAdminNode ]] | 
|---|
| 373 | then | 
|---|
| 374 | # Set the failure group to the server node number + 4000. | 
|---|
| 375 | failureGroup=$defaultFailureGroup | 
|---|
| 376 |  | 
|---|
| 377 | else | 
|---|
| 378 | # If all else fails, go with negative one. | 
|---|
| 379 | failureGroup="-1" | 
|---|
| 380 | fi  # end of if [[ -n $replacingDisk ]] | 
|---|
| 381 |  | 
|---|
| 382 | ############################# | 
|---|
| 383 | # Storage pool verification | 
|---|
| 384 | ############################# | 
|---|
| 385 | # Check the storage pool name if one was specified. | 
|---|
| 386 | if [[ -n $storagePool && $storagePool != "system" ]] | 
|---|
| 387 | then | 
|---|
| 388 | # Check whether the disk is to be used for metadata. | 
|---|
| 389 | if [[ $hasMetaData = 1 || $diskUsage = descOnly ]] | 
|---|
| 390 | then | 
|---|
| 391 | # The disk usage is not compatible with the storage pool. | 
|---|
| 392 | printErrorMsg 239 $mmcmd $diskUsage $storagePool | 
|---|
| 393 | return 1 | 
|---|
| 394 | fi | 
|---|
| 395 |  | 
|---|
| 396 | # Check whether the storage pool name conforms to naming rules. | 
|---|
| 397 | # If it does not, issue an error message and exit with a non-zero rc. | 
|---|
| 398 | checkName poolName 255 "$storagePool" | 
|---|
| 399 | [[ $? -ne 0 ]] && return 1 | 
|---|
| 400 | fi | 
|---|
| 401 |  | 
|---|
| 402 | ############################################################## | 
|---|
| 403 | # Everything seems to be OK.  Generate the output and return. | 
|---|
| 404 | ############################################################## | 
|---|
| 405 | # Build the ts version of the descriptor. | 
|---|
| 406 | tsDiskDesc="$diskName:$driverType:$sectorSize:$failureGroup:" | 
|---|
| 407 | tsDiskDesc="${tsDiskDesc}$hasMetaData:$hasData:$storagePool" | 
|---|
| 408 |  | 
|---|
| 409 | # Update fields in the SG_DISKS line as necessary. | 
|---|
| 410 | [[ -z $deviceName ]] && deviceName=$NO_DEVICE | 
|---|
| 411 | v[$NODESETID_Field]=$nodesetId | 
|---|
| 412 | v[$DEV_NAME_Field]=$deviceName | 
|---|
| 413 | v[$FAILURE_GROUP_Field]=$failureGroup | 
|---|
| 414 | v[$DISK_USAGE_Field]=$diskUsage | 
|---|
| 415 | v[$DISK_TYPE_Field]=$driverType | 
|---|
| 416 | v[$DISK_STATUS_Field]=$statusString | 
|---|
| 417 | v[$NSD_PRIMARY_NODE_Field]=$primaryNsdAdminNode | 
|---|
| 418 | v[$NSD_BACKUP_NODE_Field]=$backupNsdAdminNode | 
|---|
| 419 | v[$DAEMON_NSD_PRIMARY_Field]=$primaryNsdDaemonNode | 
|---|
| 420 | v[$DAEMON_NSD_BACKUP_Field]=$backupNsdDaemonNode | 
|---|
| 421 | v[$STORAGE_POOL_Field]=$storagePool | 
|---|
| 422 | updatedDiskLine=$(print_newLine) | 
|---|
| 423 |  | 
|---|
| 424 | # Print the results. | 
|---|
| 425 | print -- "$updatedDiskLine $tsDiskDesc $diskUsage" | 
|---|
| 426 |  | 
|---|
| 427 | return 0 | 
|---|
| 428 |  | 
|---|
| 429 | }  #----- end of function validateAndConvertNsdDescriptor --------- | 
|---|
| 430 |  | 
|---|
| 431 |  | 
|---|
| 432 | ######################################################################## | 
|---|
| 433 | # | 
|---|
| 434 | # Function:  Invoke tspreparedisk to generate an unique identifier | 
|---|
| 435 | #            and record it on the disk.  If invoked by mmimportfs, | 
|---|
| 436 | #            move the sg descriptor to sector 8 if necessary. | 
|---|
| 437 | # | 
|---|
| 438 | # Input:     $1 - name of the underlying disk to use | 
|---|
| 439 | #            $2 - value of verification flag (-v option of mmcrnsd) | 
|---|
| 440 | #            $3 - invoking command | 
|---|
| 441 | #            $4 - nsd subtype | 
|---|
| 442 | #                   (if "NULL" is passed, createNsd will determine it) | 
|---|
| 443 | # | 
|---|
| 444 | # Output:    NSD disk type followed by the output from tspreparedisk | 
|---|
| 445 | # | 
|---|
| 446 | # Returns:   0 - success | 
|---|
| 447 | #            non-zero - unexpected error | 
|---|
| 448 | # | 
|---|
| 449 | ######################################################################## | 
|---|
| 450 | function createNsd  # <diskName> <vflag> <invokingCommand> <nsdSubtype> | 
|---|
| 451 | { | 
|---|
| 452 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 453 | [[ -n $DEBUG || -n $DEBUGcreateNsd ]] && set -x | 
|---|
| 454 | $mmTRACE_ENTER "$*" | 
|---|
| 455 | typeset diskName=$1 | 
|---|
| 456 | typeset vflag=$2 | 
|---|
| 457 | typeset invokingCommand=$3 | 
|---|
| 458 | typeset nsdSubtype=$4 | 
|---|
| 459 |  | 
|---|
| 460 | typeset device tscmdParms tspreparediskOutput | 
|---|
| 461 | typeset unfenceAttempted="" | 
|---|
| 462 | typeset rc=0 | 
|---|
| 463 | typeset ec=0 | 
|---|
| 464 |  | 
|---|
| 465 | if [[ $nsdSubtype = NULL ]] | 
|---|
| 466 | then | 
|---|
| 467 | # Determine the type of the underlying disk. | 
|---|
| 468 | nsdSubtype=$(determineNsdSubtype $diskName) | 
|---|
| 469 | rc=$? | 
|---|
| 470 | if [[ $rc -ne 0 || -z $nsdSubtype ]] | 
|---|
| 471 | then | 
|---|
| 472 | # Print result and return. | 
|---|
| 473 | print error tspreparedisk:0:0:0:0:3901:0:0 | 
|---|
| 474 | [[ $rc -eq 0 ]] && rc=1 | 
|---|
| 475 | return $rc | 
|---|
| 476 | fi | 
|---|
| 477 | fi  # end of if [[ $nsdSubtype = NULL ]] | 
|---|
| 478 |  | 
|---|
| 479 | # Ensure the sg descriptor starts in sector 8. | 
|---|
| 480 | if [[ $invokingCommand = mmimportfs ]] | 
|---|
| 481 | then | 
|---|
| 482 | tspreparediskOutput=$($tspreparedisk -m $diskName 2>$errMsg) | 
|---|
| 483 | rc=$? | 
|---|
| 484 |  | 
|---|
| 485 | # If we fail because this is a fenced-out VSD, | 
|---|
| 486 | # unfence the disk and retry the tspreparedisk. | 
|---|
| 487 | if [[ $rc -eq 50 && $nsdSubtype = vsd ]] | 
|---|
| 488 | then | 
|---|
| 489 | $rm -f $errMsg | 
|---|
| 490 | unfenceVSDdisk $diskName | 
|---|
| 491 | ec=$? | 
|---|
| 492 | unfenceAttempted=yes | 
|---|
| 493 | if [[ $ec -eq 0 ]] | 
|---|
| 494 | then | 
|---|
| 495 | tspreparediskOutput=$($tspreparedisk -m $diskName 2>$errMsg) | 
|---|
| 496 | rc=$? | 
|---|
| 497 | fi | 
|---|
| 498 | fi  # end of if [[ $rc -eq 50 && $nsdSubtype = vsd ]] | 
|---|
| 499 |  | 
|---|
| 500 | # Check the result from the tspreparedisk command. | 
|---|
| 501 | if [[ $rc -ne 0 || -z $tspreparediskOutput ]] | 
|---|
| 502 | then | 
|---|
| 503 | # Print result and return. | 
|---|
| 504 | [[ -s $errMsg ]] && $cat $errMsg 1>&2 | 
|---|
| 505 | $rm -f $errMsg | 
|---|
| 506 | print error tspreparedisk:$rc:0:0:0:3902:0:0 | 
|---|
| 507 | [[ $rc -eq 0 ]] && rc=1 | 
|---|
| 508 | return $rc | 
|---|
| 509 | fi | 
|---|
| 510 | $rm -f $errMsg | 
|---|
| 511 | fi  # end of if [[ $invokingCommand = mmimportfs ]] | 
|---|
| 512 |  | 
|---|
| 513 | # Construct the fully-qualified device name. | 
|---|
| 514 | # Note that this is required for the -n and -N options | 
|---|
| 515 | # of tspreparedisk, but not for the -m option. | 
|---|
| 516 | if [[ $diskName = /* ]] | 
|---|
| 517 | then | 
|---|
| 518 | device=$diskName | 
|---|
| 519 | elif [[ $osName = AIX ]] | 
|---|
| 520 | then | 
|---|
| 521 | device=/dev/r$diskName | 
|---|
| 522 | else | 
|---|
| 523 | device=/dev/$diskName | 
|---|
| 524 | fi | 
|---|
| 525 |  | 
|---|
| 526 | # Determine the parameters to specify on the tspreparedisk command. | 
|---|
| 527 | # If the -v flag on the mmcrnsd command was set to yes, do not | 
|---|
| 528 | # overwrite an existing pvid.  Otherwise, unconditionally generate | 
|---|
| 529 | # a new pvid. | 
|---|
| 530 | if [[ $vflag = yes ]] | 
|---|
| 531 | then | 
|---|
| 532 | tscmdParms="-n $device -t $nsdSubtype" | 
|---|
| 533 | else | 
|---|
| 534 | tscmdParms="-N $device -t $nsdSubtype" | 
|---|
| 535 | fi | 
|---|
| 536 |  | 
|---|
| 537 | # Invoke tspreparedisk to generate and write a unique pvid on the disk. | 
|---|
| 538 | tspreparediskOutput=$($tspreparedisk $tscmdParms) | 
|---|
| 539 | rc=$? | 
|---|
| 540 |  | 
|---|
| 541 | # If there is failure because this is a fenced-out VSD, | 
|---|
| 542 | # unfence the disk and retry the tspreparedisk. | 
|---|
| 543 | if [[ $rc -eq 50 && $nsdSubtype = vsd && -z $unfenceAttempted ]] | 
|---|
| 544 | then | 
|---|
| 545 | unfenceVSDdisk $diskName | 
|---|
| 546 | ec=$? | 
|---|
| 547 | if [[ $ec -eq 0 ]] | 
|---|
| 548 | then | 
|---|
| 549 | tspreparediskOutput=$($tspreparedisk $tscmdParms) | 
|---|
| 550 | rc=$? | 
|---|
| 551 | fi | 
|---|
| 552 | fi  # end of if [[ $rc -eq 50 && $nsdSubtype = vsd && -z $unfenceAttempted ]] | 
|---|
| 553 |  | 
|---|
| 554 | # Output the NSD subtype and the result from tspreparedisk. | 
|---|
| 555 | print $nsdSubtype $tspreparediskOutput | 
|---|
| 556 | return $rc | 
|---|
| 557 |  | 
|---|
| 558 | }  #----- end of function createNsd ---------------------- | 
|---|
| 559 |  | 
|---|
| 560 |  | 
|---|
| 561 | ############################################################################## | 
|---|
| 562 | # | 
|---|
| 563 | # Function:  Invoke tspreparedisk to configure disks for use as quorum disks. | 
|---|
| 564 | # | 
|---|
| 565 | # Input:     $1 - file with the SG_DISK lines for the disks | 
|---|
| 566 | #            $2 - comma-separated list of quorum node numbers | 
|---|
| 567 | #            $3 - comma-separated list of quorum node names | 
|---|
| 568 | #            $4 - invoking command | 
|---|
| 569 | # | 
|---|
| 570 | # Output:    None | 
|---|
| 571 | # | 
|---|
| 572 | # Returns:   0 - success | 
|---|
| 573 | #            non-zero - unexpected error | 
|---|
| 574 | # | 
|---|
| 575 | ############################################################################## | 
|---|
| 576 | function formatPaxosDisks  # <diskLines> <quorumNodeNumbers> | 
|---|
| 577 | # <quorumNodeNames> <invokingCommand> | 
|---|
| 578 | { | 
|---|
| 579 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 580 | [[ -n $DEBUG || -n $DEBUGformatPaxosDisks ]] && set -x | 
|---|
| 581 | $mmTRACE_ENTER "$*" | 
|---|
| 582 | typeset diskLines=$1 | 
|---|
| 583 | typeset quorumNodeNumbers=$2 | 
|---|
| 584 | typeset quorumNodeNames=$3 | 
|---|
| 585 | typeset invokingCommand=$4 | 
|---|
| 586 |  | 
|---|
| 587 | typeset rc=0 | 
|---|
| 588 | typeset formatPaxosDisks_rc=0 | 
|---|
| 589 | typeset wOpt="" | 
|---|
| 590 | typeset sdrfsLine diskName pvid nsdSubtype fOpt rc2 | 
|---|
| 591 | typeset magicWord fsName nodeName invokedNode result | 
|---|
| 592 |  | 
|---|
| 593 | [[ $invokingCommand = mmaddnode ]] && wOpt="-w" | 
|---|
| 594 |  | 
|---|
| 595 | # Read the SG_DISK lines and process the disks one by one. | 
|---|
| 596 | $rm -f $errMsg | 
|---|
| 597 | IFS=":" | 
|---|
| 598 | exec 3<&- | 
|---|
| 599 | exec 3< $diskLines | 
|---|
| 600 | while read -u3 sdrfsLine | 
|---|
| 601 | do | 
|---|
| 602 | # Parse the line. | 
|---|
| 603 | set -f ; set -A v -- - $sdrfsLine ; set +f | 
|---|
| 604 | IFS="$IFS_sv" | 
|---|
| 605 | diskName=${v[$DISK_NAME_Field]} | 
|---|
| 606 | pvid=${v[$PVID_Field]} | 
|---|
| 607 | nsdSubtype=${v[$NSD_SUBTYPE_Field]} | 
|---|
| 608 |  | 
|---|
| 609 | if [[ ${v[$NODESETID_Field]} = $FREE_DISK ]] | 
|---|
| 610 | then | 
|---|
| 611 | fOpt="" | 
|---|
| 612 | else | 
|---|
| 613 | fOpt="-f" | 
|---|
| 614 | fi | 
|---|
| 615 |  | 
|---|
| 616 | # Loop through the list of nodes, invoking the tspreparedisk command | 
|---|
| 617 | # to format the disk.  We continue looping until we succeed on some node. | 
|---|
| 618 | IFS="," | 
|---|
| 619 | for nodeName in $quorumNodeNames | 
|---|
| 620 | do | 
|---|
| 621 | IFS="$IFS_sv" | 
|---|
| 622 | if [[ $nodeName = $ourNodeName ]] | 
|---|
| 623 | then | 
|---|
| 624 | # Execute the command locally. | 
|---|
| 625 | result=$($mmremote adminCmd tspreparedisk  \ | 
|---|
| 626 | -p $pvid -t $nsdSubtype -q $quorumNodeNumbers $fOpt $wOpt) | 
|---|
| 627 | rc=$? | 
|---|
| 628 | invokedNode=$ourNodeName | 
|---|
| 629 | tspreparediskOutput="$result" | 
|---|
| 630 | else | 
|---|
| 631 | # Check whether the node can be reached. | 
|---|
| 632 | isNodeReachable $nodeName | 
|---|
| 633 | if [[ $? -eq 0 ]] | 
|---|
| 634 | then | 
|---|
| 635 | # Invoke mmdsh to execute the command on the node. | 
|---|
| 636 | result=$($mmdsh -vL $nodeName $mmremote adminCmd tspreparedisk  \ | 
|---|
| 637 | -p $pvid -t $nsdSubtype -q $quorumNodeNumbers $fOpt $wOpt) | 
|---|
| 638 | rc=$? | 
|---|
| 639 | invokedNode=${result%%: *} | 
|---|
| 640 | tspreparediskOutput=${result#* } | 
|---|
| 641 | tspreparediskOutput=${tspreparediskOutput## } | 
|---|
| 642 | else | 
|---|
| 643 | rc=$MM_HostDown | 
|---|
| 644 | fi  # end of if [[ $? -eq 0 ]] | 
|---|
| 645 | fi  # end of if [[ $nodeName = $ourNodeName ]] | 
|---|
| 646 |  | 
|---|
| 647 | # Parse the result from tspreparedisk. | 
|---|
| 648 | IFS=":" | 
|---|
| 649 | set -f ; set -- $tspreparediskOutput ; set +f | 
|---|
| 650 | magicWord=$1 | 
|---|
| 651 | rc2=$2 | 
|---|
| 652 | IFS="$IFS_sv" | 
|---|
| 653 |  | 
|---|
| 654 | # Issue an appropriate message if the node was unable | 
|---|
| 655 | # to execute tspreparedisk successfully. | 
|---|
| 656 | if [[ $rc -ne 0 || $magicWord != tspreparedisk || $rc2 -ne 0 ]] | 
|---|
| 657 | then | 
|---|
| 658 | # Something went wrong with this disk. | 
|---|
| 659 | # Try to make sense of the error. | 
|---|
| 660 | if [[ $rc -eq $MM_HostDown ]] | 
|---|
| 661 | then | 
|---|
| 662 | # The node is not reachable. | 
|---|
| 663 | printErrorMsg 340 $mmcmd $nodeName 2>> $errMsg | 
|---|
| 664 | elif [[ $magicWord = tspreparedisk ]] | 
|---|
| 665 | then | 
|---|
| 666 | # tspreparedisk executed but it was not happy about something. | 
|---|
| 667 | if [[ $rc2 = 1 ]]       # E_PERM | 
|---|
| 668 | then | 
|---|
| 669 | # Permission was denied for disk. | 
|---|
| 670 | printErrorMsg 523 "$invokedNode: $mmcmd" "$diskName" 2>> $errMsg | 
|---|
| 671 | elif [[ $rc2 = 2 ]]     # E_NOENT | 
|---|
| 672 | then | 
|---|
| 673 | # The disk was not found. | 
|---|
| 674 | printErrorMsg 524 "$invokedNode: $mmcmd" "$diskName" 2>> $errMsg | 
|---|
| 675 | elif [[ $rc2 = 5 ]]     # E_IO | 
|---|
| 676 | then | 
|---|
| 677 | # I/O error | 
|---|
| 678 | printErrorMsg 525 "$invokedNode: $mmcmd" "$diskName" 2>> $errMsg | 
|---|
| 679 | elif [[ $rc2 = 19 ]]    # E_NODEV | 
|---|
| 680 | then | 
|---|
| 681 | # A return code of ENODEV was returned for the disk. | 
|---|
| 682 | printErrorMsg 187 $mmcmd $invokedNode "$diskName" 2>> $errMsg | 
|---|
| 683 | elif [[ $rc2 = 50 ]]    # E_NOCONNECT | 
|---|
| 684 | then | 
|---|
| 685 | # The disk is fenced out. | 
|---|
| 686 | printErrorMsg 395 $mmcmd $invokedNode "$diskName" 2>> $errMsg | 
|---|
| 687 | elif [[ $rc2 = 214 ]]   # E_VALIDATE | 
|---|
| 688 | then | 
|---|
| 689 | # Disk validation error. | 
|---|
| 690 | printErrorMsg 539 "$invokedNode: $mmcmd" "$diskName" $rc2 2>>$errMsg | 
|---|
| 691 | elif [[ $rc2 = 221 ]]   # E_BALSPACE | 
|---|
| 692 | then | 
|---|
| 693 | # There is no space in the descriptor for the paxos sectors. | 
|---|
| 694 | printErrorMsg 531 "$invokedNode: $mmcmd" "$diskName" 2>> $errMsg | 
|---|
| 695 | elif [[ $rc2 = 236 ]]   # E_FORMAT_INCOMPAT | 
|---|
| 696 | then | 
|---|
| 697 | # The disk belongs to a back level file system or | 
|---|
| 698 | # it is not in ready state. | 
|---|
| 699 | fsName=$(findFSforDisk "$diskName" $mmsdrfsFile) | 
|---|
| 700 | printErrorMsg 528 "$invokedNode: $mmcmd" "$diskName" $fsName 2>> $errMsg | 
|---|
| 701 | else | 
|---|
| 702 | # Show the result from tspreparedisk. | 
|---|
| 703 | print -u2 "$tspreparediskOutput" 2>> $errMsg | 
|---|
| 704 | # There was an unexpected error from tspreparedisk. | 
|---|
| 705 | printErrorMsg 171 "$invokedNode: $mmcmd"  \ | 
|---|
| 706 | "tspreparedisk -p $pvid -t $nsdSubtype -q $quorumNodeNumbers $fOpt $wOpt" $rc2 2>> $errMsg | 
|---|
| 707 | fi  # end of if [[ $rc2 = 1 ]] | 
|---|
| 708 | else | 
|---|
| 709 | # Something is really wrong.  Output error information if any. | 
|---|
| 710 | [[ -n $result ]] && print -u2 "$nodeName: $result" 2>> $errMsg | 
|---|
| 711 | fi  # end of if [[ $magicWord = tspreparedisk ]] | 
|---|
| 712 | fi  # end of if [[ $rc -ne 0 || $magicWord != tspreparedisk || $rc2 -ne 0 ]] | 
|---|
| 713 |  | 
|---|
| 714 | # Exit the loop if tspreparedisk succeeded. | 
|---|
| 715 | [[ $rc -eq 0 && $magicWord = tspreparedisk && $rc2 -eq 0 ]] && break | 
|---|
| 716 |  | 
|---|
| 717 | IFS=","  # Change the field separator back to "," for the next iteration. | 
|---|
| 718 | done  # end of for nodeName in $quorumNodeNames | 
|---|
| 719 | IFS="$IFS_sv" | 
|---|
| 720 |  | 
|---|
| 721 | # If no node was able to run tspreparedisk successfully, | 
|---|
| 722 | # show all of the error messages and set a failure return code. | 
|---|
| 723 | if [[ $rc -ne 0 || $magicWord != tspreparedisk || $rc2 -ne 0 ]] | 
|---|
| 724 | then | 
|---|
| 725 | $cat $errMsg 1>&2 | 
|---|
| 726 | # Failed while processing the disk. | 
|---|
| 727 | printErrorMsg 529 $mmcmd "$diskName" | 
|---|
| 728 | formatPaxosDisks_rc=1 | 
|---|
| 729 | fi  # end of if [[ $rc -ne 0 || $magicWord != tspreparedisk || $rc2 -ne 0 ]] | 
|---|
| 730 |  | 
|---|
| 731 | # Reset things needed for the next iteration. | 
|---|
| 732 | $rm -f $errMsg | 
|---|
| 733 | IFS=":" | 
|---|
| 734 |  | 
|---|
| 735 | done  # end of while read -u3 sdrfsLine | 
|---|
| 736 | IFS="$IFS_sv" | 
|---|
| 737 |  | 
|---|
| 738 | return $formatPaxosDisks_rc | 
|---|
| 739 |  | 
|---|
| 740 | }  #----- end of function formatPaxosDisks -------------------- | 
|---|
| 741 |  | 
|---|
| 742 |  | 
|---|
| 743 | ############################################################################ | 
|---|
| 744 | # | 
|---|
| 745 | # Function:  Send nsd data obtained from the tspreparedisk -s command | 
|---|
| 746 | #            (and other sources) for all nsds on this node to stdout. | 
|---|
| 747 | # | 
|---|
| 748 | # Input:     X flag (optional; if set, it specifies that eXtra information | 
|---|
| 749 | #              should be returned in the remarks field) | 
|---|
| 750 | # | 
|---|
| 751 | # Output:    colon-separated nsd information from the "tspreparedisk -s" | 
|---|
| 752 | #              command (and other sources if the X flag was specified) | 
|---|
| 753 | # | 
|---|
| 754 | # Returns:   0 - success | 
|---|
| 755 | # | 
|---|
| 756 | ############################################################################ | 
|---|
| 757 | function getLocalNsdData   # [<Xflag>] | 
|---|
| 758 | { | 
|---|
| 759 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 760 | [[ -n $DEBUG || -n $DEBUGgetLocalNsdData ]] && set -x | 
|---|
| 761 | $mmTRACE_ENTER "$*" | 
|---|
| 762 | typeset Xflag=$1 | 
|---|
| 763 | typeset tspreparediskLine nsid deviceName localDevice deviceType vgname | 
|---|
| 764 | typeset vsdDataNeeded=yes | 
|---|
| 765 |  | 
|---|
| 766 | # Obtain the output of the tspreparedisk -s command. | 
|---|
| 767 | $tspreparedisk -s > $tsOutputFile 2> $errMsg | 
|---|
| 768 |  | 
|---|
| 769 | # Read and process the output. | 
|---|
| 770 | exec 4<&- | 
|---|
| 771 | exec 4< $tsOutputFile | 
|---|
| 772 | while read -u4 tspreparediskLine | 
|---|
| 773 | do | 
|---|
| 774 | # Parse the tspreparedisk output line. | 
|---|
| 775 | set -f ; set -- $tspreparediskLine ; set +f | 
|---|
| 776 | nsid=$1 | 
|---|
| 777 | localDevice=$2 | 
|---|
| 778 | deviceType=$3 | 
|---|
| 779 |  | 
|---|
| 780 | # If this is an AIX environment, replace the /dev/r prefix with /dev/. | 
|---|
| 781 | if [[ $osName = AIX && $localDevice = +(/)dev+(/)r* ]] | 
|---|
| 782 | then | 
|---|
| 783 | deviceName=${localDevice##+(/)dev+(/)r} | 
|---|
| 784 | localDevice=/dev/$deviceName | 
|---|
| 785 | fi | 
|---|
| 786 |  | 
|---|
| 787 | if [[ -z $Xflag ]] | 
|---|
| 788 | then | 
|---|
| 789 | # Here if -m or -M was specified. | 
|---|
| 790 | # If this is not an error line, print the data. | 
|---|
| 791 | [[ $nsid != tspreparedisk* ]] &&  \ | 
|---|
| 792 | print "getLocalNsdData:$nsid:$localDevice:$deviceType::" >> $nsdDataFile | 
|---|
| 793 | else | 
|---|
| 794 | # Here if -X was specified. | 
|---|
| 795 | # Obtain information for the remarks field for certain types of disks. | 
|---|
| 796 | remarks="" | 
|---|
| 797 | if [[ $osName = AIX ]] | 
|---|
| 798 | then | 
|---|
| 799 | if [[ $deviceType = vsd ]] | 
|---|
| 800 | then | 
|---|
| 801 | # Obtain VSD information for the remarks field. | 
|---|
| 802 | if [[ $vsdDataNeeded = yes ]] | 
|---|
| 803 | then | 
|---|
| 804 | getVsdRpdNodeData $tmpNodes | 
|---|
| 805 | LC_ALL=C $lsvsd -l > $vsdNamesFile 2>/dev/null | 
|---|
| 806 | LC_ALL=C $vsdatalst -v > $diskfile  2>/dev/null | 
|---|
| 807 | LC_ALL=C $vsdatalst -g > $volGroupFile 2>/dev/null | 
|---|
| 808 | $touch $tmpNodes $vsdNamesFile $diskfile $volGroupFile | 
|---|
| 809 | vsdDataNeeded=no | 
|---|
| 810 | fi | 
|---|
| 811 | remarks=$(obtainVsdInfo $deviceName $tmpNodes $vsdNamesFile $diskfile $volGroupFile) | 
|---|
| 812 | elif [[ $deviceType = lv ]] | 
|---|
| 813 | then | 
|---|
| 814 | # Obtain logical volume information for the remarks field. | 
|---|
| 815 | vgname=$(LC_ALL=C $lslv -L $deviceName 2>/dev/null | $awk '/VOLUME GROUP:/ {print $6}') | 
|---|
| 816 | [[ -z vgname ]] && vgname=unknown | 
|---|
| 817 | remarks="lv=$deviceName,vg=$vgname" | 
|---|
| 818 | fi  # end of if [[ $deviceType = vsd ]] | 
|---|
| 819 | fi  # end of if [[ $osName = AIX ]] | 
|---|
| 820 |  | 
|---|
| 821 | # If this is not an error line, print the data. | 
|---|
| 822 | [[ $nsid != tspreparedisk* ]] &&  \ | 
|---|
| 823 | print "getLocalNsdData:$nsid:$localDevice:$deviceType:$remarks:" >> $nsdDataFile | 
|---|
| 824 | fi    # end of if [[ -z $Xflag ]] | 
|---|
| 825 | done  # end of while read -u4 tspreparediskLine | 
|---|
| 826 |  | 
|---|
| 827 | # Send the colon-separated output and any error messages to stdout. | 
|---|
| 828 | $touch $nsdDataFile    # Make sure the file exists even if empty. | 
|---|
| 829 | cat $nsdDataFile $errMsg | 
|---|
| 830 | return 0 | 
|---|
| 831 |  | 
|---|
| 832 | }  #----- end of function getLocalNsdData --------------------- | 
|---|
| 833 |  | 
|---|
| 834 |  | 
|---|
| 835 | #################################################################### | 
|---|
| 836 | # | 
|---|
| 837 | # Function:  Find out the local device name for the disk with | 
|---|
| 838 | #            the specified pvid. | 
|---|
| 839 | # | 
|---|
| 840 | # Input:     $1 - pvid of the disk being looked up | 
|---|
| 841 | #            $2 - nsd subtype of the disk being looked up | 
|---|
| 842 | # | 
|---|
| 843 | # Output:    A line with the following ':' separated fields: | 
|---|
| 844 | #            - magic word 'getLocalDiskName' | 
|---|
| 845 | #            - local disk name | 
|---|
| 846 | #            - return code from tspreparedisk -p | 
|---|
| 847 | #            - always 0 (used to be return code from tsnsdreset -q) | 
|---|
| 848 | # | 
|---|
| 849 | # Returns:   0 - success | 
|---|
| 850 | #            1 - unexpected error | 
|---|
| 851 | # | 
|---|
| 852 | #################################################################### | 
|---|
| 853 | function getLocalDiskName  # <pvid> <nsdSubtype> | 
|---|
| 854 | { | 
|---|
| 855 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 856 | [[ -n $DEBUG || -n $DEBUGgetLocalDiskName ]] && set -x | 
|---|
| 857 | $mmTRACE_ENTER "$*" | 
|---|
| 858 | typeset pvid=$1 | 
|---|
| 859 | typeset nsdSubtype=$2 | 
|---|
| 860 |  | 
|---|
| 861 | typeset tspreparediskOutput magicWord pvid | 
|---|
| 862 | typeset localDiskName="" | 
|---|
| 863 | typeset rc=0 | 
|---|
| 864 | typeset rc1=0 | 
|---|
| 865 | typeset rc2=0 | 
|---|
| 866 |  | 
|---|
| 867 | # Use the nsd commands to determine the local device name. | 
|---|
| 868 |  | 
|---|
| 869 | # Find out the local device name. | 
|---|
| 870 | tspreparediskOutput=$($tspreparedisk -p $pvid -t $nsdSubtype 2>$errMsg2) | 
|---|
| 871 | rc=$? | 
|---|
| 872 |  | 
|---|
| 873 | # Parse the output from the tspreparedisk command. | 
|---|
| 874 | IFS=":" | 
|---|
| 875 | set -f ; set -- $tspreparediskOutput ; set +f | 
|---|
| 876 | magicWord=$1 | 
|---|
| 877 | rc1=$2 | 
|---|
| 878 | pvid=$3 | 
|---|
| 879 | localDiskName=$4 | 
|---|
| 880 | IFS="$IFS_sv" | 
|---|
| 881 |  | 
|---|
| 882 | if [[ $magicWord != tspreparedisk ]] | 
|---|
| 883 | then | 
|---|
| 884 | # Unexpected error.  Print error messages and give up. | 
|---|
| 885 | [[ -s $errMsg2 ]] && $cat $errMsg2 1>&2 | 
|---|
| 886 | $rm -f $errMsg2 | 
|---|
| 887 | [[ $rc -eq 0 ]] && rc=1 | 
|---|
| 888 | printErrorMsg 171  \ | 
|---|
| 889 | "getLocalDiskName" "tspreparedisk -p $pvid -t $nsdSubtype" $rc | 
|---|
| 890 | return 1 | 
|---|
| 891 | fi | 
|---|
| 892 | $rm -f $errMsg2 | 
|---|
| 893 |  | 
|---|
| 894 | # If this is an AIX environment, replace the /dev/r prefix with /dev/. | 
|---|
| 895 | if [[ $osName = AIX && $localDiskName = +(/)dev+(/)r* ]] | 
|---|
| 896 | then | 
|---|
| 897 | localDiskName=${localDiskName##+(/)dev+(/)r} | 
|---|
| 898 | localDiskName=/dev/$localDiskName | 
|---|
| 899 | fi | 
|---|
| 900 |  | 
|---|
| 901 | if [[ $rc -eq 0 && -n $localDiskName ]] | 
|---|
| 902 | then | 
|---|
| 903 | # tspreparedisk worked and we have a good answer. | 
|---|
| 904 | print -- "getLocalDiskName:$localDiskName:$rc1:$rc2" | 
|---|
| 905 | return 0 | 
|---|
| 906 | fi | 
|---|
| 907 |  | 
|---|
| 908 | if [[ $MMMODE = single ]] | 
|---|
| 909 | then | 
|---|
| 910 | # If in single mode, there is nothing more to try; give up. | 
|---|
| 911 | print -- "getLocalDiskName:$UNRESOLVED:$rc1:$rc2" | 
|---|
| 912 | return 0 | 
|---|
| 913 | fi | 
|---|
| 914 |  | 
|---|
| 915 | # If we are here, tspreparedisk failed to find out the local disk name. | 
|---|
| 916 | # There may be many reasons for this, one of which is that the disk is | 
|---|
| 917 | # being reserved by some other node and we cannot verify the pvid. | 
|---|
| 918 | # Assuming this is the case, we will look at the nsd map file and will | 
|---|
| 919 | # attempt to determine the mapping from there keeping in mind that the | 
|---|
| 920 | # answer is not 100% guaranteed to be correct anymore. | 
|---|
| 921 |  | 
|---|
| 922 | # Search the nsd map file for an entry with our pvid. | 
|---|
| 923 | if [[ -s $nsdmap ]] | 
|---|
| 924 | then | 
|---|
| 925 | localDiskName=$($awk ' {   \ | 
|---|
| 926 | if ($1 == "'$pvid'") {   \ | 
|---|
| 927 | { print $2 }           \ | 
|---|
| 928 | { exit 0 }             \ | 
|---|
| 929 | }                        \ | 
|---|
| 930 | } ' $nsdmap) | 
|---|
| 931 | checkForErrors "awk $nsdmap" $? | 
|---|
| 932 | fi  # end of if [[ -s $nsdmap ]] | 
|---|
| 933 |  | 
|---|
| 934 | # If no matching pvid found in the hints file, give up. | 
|---|
| 935 | if [[ -z $localDiskName ]] | 
|---|
| 936 | then | 
|---|
| 937 | print -- "getLocalDiskName:$UNRESOLVED:$rc1:$rc2" | 
|---|
| 938 | return 0 | 
|---|
| 939 | fi | 
|---|
| 940 |  | 
|---|
| 941 | # tspreparedisk should have been able to verify the pvid; | 
|---|
| 942 | # most likely this is a different disk. | 
|---|
| 943 | print -- "getLocalDiskName:$UNRESOLVED:$rc1:$rc2" | 
|---|
| 944 |  | 
|---|
| 945 | return 0 | 
|---|
| 946 |  | 
|---|
| 947 | }  #----- end of function getLocalDiskName --------------- | 
|---|
| 948 |  | 
|---|
| 949 |  | 
|---|
| 950 | ############################################################# | 
|---|
| 951 | # | 
|---|
| 952 | # Function:  Select an unused device minor number. | 
|---|
| 953 | # | 
|---|
| 954 | # Input:     $1 - list of currently-assigned minor numbers. | 
|---|
| 955 | # | 
|---|
| 956 | # Output:    A minor number for the /dev entry. | 
|---|
| 957 | # | 
|---|
| 958 | # Returns:   Zero if successful, non-zero otherwise. | 
|---|
| 959 | # | 
|---|
| 960 | ############################################################# | 
|---|
| 961 | function assignDevMinor  # <existingMinorNumbers> | 
|---|
| 962 | { | 
|---|
| 963 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 964 | [[ -n $DEBUG || -n $DEBUGassignDevMinor ]] && set -x | 
|---|
| 965 | $mmTRACE_ENTER "$*" | 
|---|
| 966 | typeset existingMinorNumbers="$1" | 
|---|
| 967 |  | 
|---|
| 968 | typeset x devMinor | 
|---|
| 969 | typeset rc=0 | 
|---|
| 970 |  | 
|---|
| 971 | # Set the initial devMinor number.  The first 50 numbers | 
|---|
| 972 | # are reserved for existing file systems that do not play | 
|---|
| 973 | # by the new rules yet. | 
|---|
| 974 | devMinor=$((minMinorNumber + 50)) | 
|---|
| 975 |  | 
|---|
| 976 | # Keep looping until we either find an unused minor number, | 
|---|
| 977 | # or we run out of numbers. | 
|---|
| 978 | while ((devMinor <= maxMinorNumber)) | 
|---|
| 979 | do | 
|---|
| 980 | # Scan the currently-assigned minor numbers. | 
|---|
| 981 | for x in $existingMinorNumbers | 
|---|
| 982 | do | 
|---|
| 983 | # If the number that we want is already in use, | 
|---|
| 984 | # get out of the for loop. | 
|---|
| 985 | [[ $x = $devMinor ]] && break | 
|---|
| 986 | done | 
|---|
| 987 |  | 
|---|
| 988 | # If the number that we want is free, we are done. | 
|---|
| 989 | [[ $x != $devMinor ]] && break | 
|---|
| 990 |  | 
|---|
| 991 | # No luck so far, try the next number. | 
|---|
| 992 | devMinor=$((devMinor + 1)) | 
|---|
| 993 |  | 
|---|
| 994 | done # end of while ((devMinor <= maxMinorNumber)) | 
|---|
| 995 |  | 
|---|
| 996 | # If the number is out of range, return null and let | 
|---|
| 997 | # mmfsmknod worry about it.  This should never happen | 
|---|
| 998 | # since we do not support more than 32 file systems. | 
|---|
| 999 | if [[ $devMinor -gt $maxMinorNumber ]] | 
|---|
| 1000 | then | 
|---|
| 1001 | rc=1 | 
|---|
| 1002 | devMinor="" | 
|---|
| 1003 | fi | 
|---|
| 1004 |  | 
|---|
| 1005 | # Return the result. | 
|---|
| 1006 | print -- $devMinor | 
|---|
| 1007 | return $rc | 
|---|
| 1008 |  | 
|---|
| 1009 | }  #----- end of function assignDevMinor ----------------- | 
|---|
| 1010 |  | 
|---|
| 1011 |  | 
|---|
| 1012 | ############################################################# | 
|---|
| 1013 | # | 
|---|
| 1014 | # Function:  Find the disk info (pvid, vgname, lvname) that | 
|---|
| 1015 | #            corresponds to the raw disk name. | 
|---|
| 1016 | # | 
|---|
| 1017 | # Input:     $1 - raw disk name (eg: hdisk7, sda2). | 
|---|
| 1018 | # | 
|---|
| 1019 | # Output:    The disk information:  pvid, vgname, lvname. | 
|---|
| 1020 | # | 
|---|
| 1021 | # Returns:   Zero if successful, non-zero otherwise. | 
|---|
| 1022 | # | 
|---|
| 1023 | ############################################################# | 
|---|
| 1024 | function getRawDiskInfo  # <rawDiskName> | 
|---|
| 1025 | { | 
|---|
| 1026 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 1027 | [[ -n $DEBUG || -n $DEBUGgetRawDiskInfo ]] && set -x | 
|---|
| 1028 | $mmTRACE_ENTER "$*" | 
|---|
| 1029 | typeset rawDiskName=$1 | 
|---|
| 1030 |  | 
|---|
| 1031 | typeset pvid vgname lvname lspvOutput | 
|---|
| 1032 | integer rc=0 | 
|---|
| 1033 |  | 
|---|
| 1034 | # Find out the disks pvid and local volume group. | 
|---|
| 1035 | lspvOutput=$($lspv | $grep -w $rawDiskName) | 
|---|
| 1036 | rc=$? | 
|---|
| 1037 | set -f ; set -- $lspvOutput ; set +f | 
|---|
| 1038 | pvid=$2 | 
|---|
| 1039 | vgname=$3 | 
|---|
| 1040 | if [[ $rc -ne 0 || -z $pvid || -z $vgname ]] | 
|---|
| 1041 | then | 
|---|
| 1042 | printErrorMsg 232 $mmcmd $rawDiskName lspv | 
|---|
| 1043 | return $rc | 
|---|
| 1044 | fi | 
|---|
| 1045 |  | 
|---|
| 1046 | if [[ $vgname != None && $vgname != gpfs ]] | 
|---|
| 1047 | then | 
|---|
| 1048 | # Determine the name of the logical volume that corresponds to this | 
|---|
| 1049 | # volume group.  If there is more than one lv ...? | 
|---|
| 1050 | lvname=$(LC_ALL=C $lsvg -l $vgname 2>/dev/null | $grep mmfs | $awk '{ print $1 }') | 
|---|
| 1051 | rc=$? | 
|---|
| 1052 | if [[ $rc -ne 0 || -z $lvname ]] | 
|---|
| 1053 | then | 
|---|
| 1054 | printErrorMsg 104 "$mmcmd" "lsvg -l $vgname" | 
|---|
| 1055 | return 1 | 
|---|
| 1056 | fi | 
|---|
| 1057 | else | 
|---|
| 1058 | # We come here if vgname = None or vgname = gpfs (the latter being | 
|---|
| 1059 | # indicative of an old, no-longer-used nsd for which mmdelnsd was not run). | 
|---|
| 1060 | # Tell the user no disks were found. | 
|---|
| 1061 | printErrorMsg 418 $mmcmd | 
|---|
| 1062 | return 1 | 
|---|
| 1063 | fi | 
|---|
| 1064 |  | 
|---|
| 1065 | print -- $pvid $vgname $lvname | 
|---|
| 1066 | return 0 | 
|---|
| 1067 |  | 
|---|
| 1068 | }  #----- end of function getRawDiskInfo ----------------- | 
|---|
| 1069 |  | 
|---|
| 1070 |  | 
|---|
| 1071 | ############################################################# | 
|---|
| 1072 | # | 
|---|
| 1073 | # Function:  Find the VSD name corresponding to the vgname. | 
|---|
| 1074 | # | 
|---|
| 1075 | # Input:     $1 - vg name | 
|---|
| 1076 | # | 
|---|
| 1077 | # Output:    The VSD name. | 
|---|
| 1078 | # | 
|---|
| 1079 | # Returns:   Zero if successful, non-zero otherwise. | 
|---|
| 1080 | # | 
|---|
| 1081 | ############################################################# | 
|---|
| 1082 | function getVSDName  # <vgname> | 
|---|
| 1083 | { | 
|---|
| 1084 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 1085 | [[ -n $DEBUG || -n $DEBUGgetVSDName ]] && set -x | 
|---|
| 1086 | $mmTRACE_ENTER "$*" | 
|---|
| 1087 | typeset vgname=$1 | 
|---|
| 1088 |  | 
|---|
| 1089 | typeset vsdname gvg | 
|---|
| 1090 | integer rc=0 | 
|---|
| 1091 |  | 
|---|
| 1092 | gvg=$($vsdatalst -g | $awk '{ if ($2 == "'"$vgname"'") print $1 }') | 
|---|
| 1093 | if [[ -z $gvg ]] | 
|---|
| 1094 | then | 
|---|
| 1095 | printErrorMsg 232 $mmcmd $vgname "vsdatalst -g" | 
|---|
| 1096 | print -- "" | 
|---|
| 1097 | return 1 | 
|---|
| 1098 | else | 
|---|
| 1099 | vsdname=$($vsdatalst -v |  \ | 
|---|
| 1100 | $awk '{if ($3 == "'"$gvg"'") print $1}') | 
|---|
| 1101 | rc=$? | 
|---|
| 1102 | if [[ $rc -ne 0 || -z $vsdname ]] | 
|---|
| 1103 | then | 
|---|
| 1104 | printErrorMsg 232 $mmcmd $vgname "vsdatalst -v" | 
|---|
| 1105 | print -- "" | 
|---|
| 1106 | return 1 | 
|---|
| 1107 | fi | 
|---|
| 1108 | fi | 
|---|
| 1109 |  | 
|---|
| 1110 | print -- $vsdname | 
|---|
| 1111 | return 0 | 
|---|
| 1112 |  | 
|---|
| 1113 | }  #----- end of function getVSDName --------------------- | 
|---|
| 1114 |  | 
|---|
| 1115 |  | 
|---|
| 1116 | ############################################################# | 
|---|
| 1117 | # | 
|---|
| 1118 | # Function:  Find the NSD disk name. | 
|---|
| 1119 | # | 
|---|
| 1120 | # Input:     $1 - rawdisk, lv, or vsdname | 
|---|
| 1121 | # | 
|---|
| 1122 | # Output:    the NSD disk name | 
|---|
| 1123 | # | 
|---|
| 1124 | # Returns:   zero if successful, non-zero otherwise | 
|---|
| 1125 | # | 
|---|
| 1126 | ############################################################# | 
|---|
| 1127 | function getNSDName  # <rawName> | 
|---|
| 1128 | { | 
|---|
| 1129 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 1130 | [[ -n $DEBUG || -n $DEBUGgetNSDName ]] && set -x | 
|---|
| 1131 | $mmTRACE_ENTER "$*" | 
|---|
| 1132 | rawName=$1 | 
|---|
| 1133 | typeset rc=0 | 
|---|
| 1134 |  | 
|---|
| 1135 | typeset gpfsDiskName tspreparediskOutput pvid | 
|---|
| 1136 |  | 
|---|
| 1137 | if [[ $osName = AIX ]] | 
|---|
| 1138 | then | 
|---|
| 1139 | rawName="r$rawName" | 
|---|
| 1140 | fi | 
|---|
| 1141 |  | 
|---|
| 1142 | tspreparediskOutput=$($tspreparedisk -s | $grep -w "/dev/$rawName") | 
|---|
| 1143 | rc=$? | 
|---|
| 1144 |  | 
|---|
| 1145 | # Parse the output from the tspreparedisk command. | 
|---|
| 1146 | IF=":" | 
|---|
| 1147 | set -f ; set -- $tspreparediskOutput ; set +f | 
|---|
| 1148 | pvid=$1 | 
|---|
| 1149 | [[ $rc -ne 0 || -z $pvid ]] && return 1 | 
|---|
| 1150 |  | 
|---|
| 1151 | # Search for the nsd disk name in the mmsdrfs file. | 
|---|
| 1152 | gpfsDiskName=$($awk -F: '                \ | 
|---|
| 1153 | /':$SG_DISKS:'/ {                      \ | 
|---|
| 1154 | if ($'$PVID_Field' == "'$pvid'") {   \ | 
|---|
| 1155 | { print $'$DISK_NAME_Field' }      \ | 
|---|
| 1156 | { exit 0 }                         \ | 
|---|
| 1157 | }                                    \ | 
|---|
| 1158 | } | 
|---|
| 1159 | ' $mmsdrfsFile) | 
|---|
| 1160 |  | 
|---|
| 1161 | checkForErrors awk $? | 
|---|
| 1162 | if [[ -n $gpfsDiskName ]] | 
|---|
| 1163 | then | 
|---|
| 1164 | print -- $gpfsDiskName | 
|---|
| 1165 | return 0 | 
|---|
| 1166 | else | 
|---|
| 1167 | return 1 | 
|---|
| 1168 | fi | 
|---|
| 1169 |  | 
|---|
| 1170 | }  #----- end of function getNSDName --------------------- | 
|---|
| 1171 |  | 
|---|
| 1172 |  | 
|---|
| 1173 | ############################################################### | 
|---|
| 1174 | # | 
|---|
| 1175 | # Function:  Find the GPFS disk name given the raw disk name. | 
|---|
| 1176 | # | 
|---|
| 1177 | # Input:     $1 - raw disk name (eg: hdisk, sda) | 
|---|
| 1178 | # | 
|---|
| 1179 | # Output:    the GPFS disk name | 
|---|
| 1180 | # | 
|---|
| 1181 | # Returns:   zero if successful, non-zero otherwise | 
|---|
| 1182 | # | 
|---|
| 1183 | ############################################################### | 
|---|
| 1184 | function getGpfsDiskName   #  <rawDiskName> | 
|---|
| 1185 | { | 
|---|
| 1186 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 1187 | [[ -n $DEBUG || -n $DEBUGgetGpfsDiskName ]] && set -x | 
|---|
| 1188 | $mmTRACE_ENTER "$*" | 
|---|
| 1189 | typeset rawDiskName=$1 | 
|---|
| 1190 |  | 
|---|
| 1191 | typeset rawDiskInfo pvid vgname lvname vsdname gpfsDiskName | 
|---|
| 1192 |  | 
|---|
| 1193 | # Check the GPFS cluster type. | 
|---|
| 1194 | [[ -z $MMMODE ]] && determineMode | 
|---|
| 1195 |  | 
|---|
| 1196 | # Call routine to obtain the name of the NSD. | 
|---|
| 1197 | gpfsDiskName=$(getNSDName $rawDiskName) | 
|---|
| 1198 |  | 
|---|
| 1199 | # If the NSD was not found and this is a Linux node, | 
|---|
| 1200 | # return with a failure rc; there is nothing more we can do. | 
|---|
| 1201 | [[ -z $gpfsDiskName && $osName = Linux ]] && return 1 | 
|---|
| 1202 |  | 
|---|
| 1203 | # Did we get the name of the NSD? | 
|---|
| 1204 | if [[ -z $gpfsDiskName ]] | 
|---|
| 1205 | then | 
|---|
| 1206 | # We did not get the name of the NSD. | 
|---|
| 1207 | # Check whether this is an AIX logical volume. | 
|---|
| 1208 | rawDiskInfo=$(getRawDiskInfo $rawDiskName) | 
|---|
| 1209 | set -f ; set -- $rawDiskInfo ; set +f | 
|---|
| 1210 | pvid=$1 | 
|---|
| 1211 | vgname=$2 | 
|---|
| 1212 | lvname=$3 | 
|---|
| 1213 |  | 
|---|
| 1214 | # If we did not find an lv, return with a failing rc; | 
|---|
| 1215 | # the disk is not known. | 
|---|
| 1216 | [[ -z $lvname ]] && return 1 | 
|---|
| 1217 |  | 
|---|
| 1218 | # Check for an NSD name corresponding to the lv. | 
|---|
| 1219 | gpfsDiskName=$(getNSDName $lvname) | 
|---|
| 1220 | if [[ -z $gpfsDiskName ]] | 
|---|
| 1221 | then | 
|---|
| 1222 | # If still no NSD was found, check whether this is a VSD. | 
|---|
| 1223 | vsdname=$(getVSDName $vgname) | 
|---|
| 1224 | if [[ -n $vsdname ]] | 
|---|
| 1225 | then | 
|---|
| 1226 | # Check for an NSD name corresponding to the vsd. | 
|---|
| 1227 | gpfsDiskName=$(getNSDName $vsdname) | 
|---|
| 1228 | [[ -z $gpfsDiskName ]] && return 1 | 
|---|
| 1229 | else | 
|---|
| 1230 | # We did not find the NSD.  Return with a failing rc. | 
|---|
| 1231 | return 1 | 
|---|
| 1232 | fi | 
|---|
| 1233 | fi | 
|---|
| 1234 | fi  # end of if [[ -z $gpfsDiskName ]] | 
|---|
| 1235 |  | 
|---|
| 1236 | # Output the GPFS disk name and return. | 
|---|
| 1237 | print -- $gpfsDiskName | 
|---|
| 1238 | return 0 | 
|---|
| 1239 |  | 
|---|
| 1240 | }  #----- end of function getGpfsDiskName ----------------------- | 
|---|
| 1241 |  | 
|---|
| 1242 |  | 
|---|
| 1243 | ########################################################################### | 
|---|
| 1244 | # | 
|---|
| 1245 | # Function:  Reset (i.e., set to the null string) the status field | 
|---|
| 1246 | #            of SG_DISKS lines for the specified filesystem if their | 
|---|
| 1247 | #            disk status value matches the passed status string, | 
|---|
| 1248 | #            thus causing the disk to be reported to the GPFS daemon | 
|---|
| 1249 | #            by future invocations of the getEFOptions routine. | 
|---|
| 1250 | # | 
|---|
| 1251 | #            This routine is called after a ts disk command has completed | 
|---|
| 1252 | #            successfully. | 
|---|
| 1253 | # | 
|---|
| 1254 | # Input:     $1 - file system name | 
|---|
| 1255 | #            $2 - passed sdrfs file | 
|---|
| 1256 | #            $3 - 1st status string used to identify SG_DISK lines | 
|---|
| 1257 | #                   whose disk status fields need to be reset; | 
|---|
| 1258 | #                   the only acceptable values are "mmadd" and "mmdel" | 
|---|
| 1259 | #            $4 - optional 2nd status string used to identify SG_DISK | 
|---|
| 1260 | #                   lines whose disk status fields need to be reset; | 
|---|
| 1261 | #                   if specified, the only acceptable value is "mmdel"; | 
|---|
| 1262 | #                   this option is used by mmrpldisk which does both | 
|---|
| 1263 | #                   an add and a delete | 
|---|
| 1264 | # | 
|---|
| 1265 | # Output:    The sdrfs file has been updated (the DISK_STATUS field | 
|---|
| 1266 | #              of any SG_DISKS line for the specified filesystem is | 
|---|
| 1267 | #              reset if the disk status matches the passed values) | 
|---|
| 1268 | # | 
|---|
| 1269 | # Returns:   0 - the passed sdrfs file was successfully updated | 
|---|
| 1270 | # | 
|---|
| 1271 | ########################################################################### | 
|---|
| 1272 | function resetDiskStatus  # <fsname> <sdrfsFile> <status1> [<status2>] | 
|---|
| 1273 | { | 
|---|
| 1274 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 1275 | [[ -n $DEBUG || -n $DEBUGresetDiskStatus ]] && set -x | 
|---|
| 1276 | $mmTRACE_ENTER "$*" | 
|---|
| 1277 |  | 
|---|
| 1278 | typeset fsname=$1 | 
|---|
| 1279 | typeset sdrfsFile=$2 | 
|---|
| 1280 | typeset status1=$3 | 
|---|
| 1281 | typeset status2=$4 | 
|---|
| 1282 |  | 
|---|
| 1283 | typeset oddState | 
|---|
| 1284 | typeset outfile=${sdrfs}tmp | 
|---|
| 1285 |  | 
|---|
| 1286 | $rm -f $outfile | 
|---|
| 1287 |  | 
|---|
| 1288 | oddState=$($awk -F:  '                                                          \ | 
|---|
| 1289 | BEGIN {                                                                       \ | 
|---|
| 1290 | { oddstate = "no" }                                                         \ | 
|---|
| 1291 | { c = ":" }                                                                 \ | 
|---|
| 1292 | }                                                                             \ | 
|---|
| 1293 | # If this is the global header line, increment the gen number.                \ | 
|---|
| 1294 | /^'$GLOBAL_ID:$VERSION_LINE:'/ {                                              \ | 
|---|
| 1295 | { $'$SDRFS_GENNUM_Field' = $'$SDRFS_GENNUM_Field' + 1 }                     \ | 
|---|
| 1296 | { print  $1":" $2":" $3":" $4":" $5":" $6":" $7":" $8":" $9":"$10":"        \ | 
|---|
| 1297 | $11":"$12":"$13":"$14":"$15":"$16":"$17":"$18":"$19":"$20":"        \ | 
|---|
| 1298 | $21":"$22":"$23":"$24":"$25":"$26":"$27":" >> "'$outfile'" }        \ | 
|---|
| 1299 | { next }                                                                    \ | 
|---|
| 1300 | }                                                                             \ | 
|---|
| 1301 | # Save the SG_HEADR line for the specified filesystem as two                  \ | 
|---|
| 1302 | # strings - the parts before and after ODD_STATE_Field ($6).                  \ | 
|---|
| 1303 | /':$SG_HEADR:$fsname:'/ {                                                     \ | 
|---|
| 1304 | { sgh1 =  $1 c $2 c  $3 c  $4 c  $5 }                                       \ | 
|---|
| 1305 | { sgh2 =  $7 c $8 c  $9 c $10 c $11 c $12 c $13 c $14 c $15 c $16 c $17 c } \ | 
|---|
| 1306 | { sgh2 = sgh2 $18 c $19 c $20 c $21 c $22 c $23 c $24 c $25 c $26 c $27 c } \ | 
|---|
| 1307 | { next }                                                                    \ | 
|---|
| 1308 | }                                                                             \ | 
|---|
| 1309 | # Check for SG_DISKS lines for the specified filesystem.                      \ | 
|---|
| 1310 | /':$SG_DISKS:$fsname:'/ {                                                     \ | 
|---|
| 1311 | # Does the disk status value match the first passed value?                  \ | 
|---|
| 1312 | if ( $'$DISK_STATUS_Field' == "'$status1'" ) {                              \ | 
|---|
| 1313 | # The disk status value matches.  Process the line.                       \ | 
|---|
| 1314 | if ( "'$status1'" == "mmadd" ) {                                          \ | 
|---|
| 1315 | # For mmadd, we simply reset the disk status field.                     \ | 
|---|
| 1316 | { $'$DISK_STATUS_Field' = "" }                                          \ | 
|---|
| 1317 | { print  $1":" $2":" $3":" $4":" $5":" $6":" $7":" $8":" $9":"$10":"    \ | 
|---|
| 1318 | $11":"$12":"$13":"$14":"$15":"$16":"$17":"$18":"$19":"$20":"    \ | 
|---|
| 1319 | $21":"$22":"$23":"$24":"$25":"$26":"$27":" >> "'$outfile'" }    \ | 
|---|
| 1320 | } else {                                                                  \ | 
|---|
| 1321 | if ( "'$status1'" == "mmdel" ) {                                        \ | 
|---|
| 1322 | # For mmdel, we change the disk into a free disk                      \ | 
|---|
| 1323 | # and reset the disk status field.                                    \ | 
|---|
| 1324 | { $'$NODESETID_Field' = "'$FREE_DISK'" }                              \ | 
|---|
| 1325 | { $'$DEV_NAME_Field' = "'$NO_DEVICE'" }                               \ | 
|---|
| 1326 | { $'$LINE_NUMBER_Field' = "0" }                                       \ | 
|---|
| 1327 | { $'$DISK_STATUS_Field' = "" }                                        \ | 
|---|
| 1328 | { print  $1":" $2":" $3":" $4":" $5":" $6":" $7":" $8":" $9":"$10":"  \ | 
|---|
| 1329 | $11":"$12":"$13":"$14":"$15":"$16":"$17":"$18":"$19":"$20":"  \ | 
|---|
| 1330 | $21":"$22":"$23":"$24":"$25":"$26":"$27":" >> "'$outfile'" }  \ | 
|---|
| 1331 | }                                                                       \ | 
|---|
| 1332 | }                                                                         \ | 
|---|
| 1333 | { next }                                                                  \ | 
|---|
| 1334 | } else {                                                                    \ | 
|---|
| 1335 | # Does the disk status value match a second passed value of mmdel?        \ | 
|---|
| 1336 | if ( "'$status2'" == "mmdel" && $'$DISK_STATUS_Field' == "'$status2'" ) { \ | 
|---|
| 1337 | # The disk status value matches and is mmdel.                           \ | 
|---|
| 1338 | # We change the disk into a free disk and reset the status field.       \ | 
|---|
| 1339 | { $'$NODESETID_Field' = "'$FREE_DISK'" }                                \ | 
|---|
| 1340 | { $'$DEV_NAME_Field' = "'$NO_DEVICE'" }                                 \ | 
|---|
| 1341 | { $'$LINE_NUMBER_Field' = "0" }                                         \ | 
|---|
| 1342 | { $'$DISK_STATUS_Field' = "" }                                          \ | 
|---|
| 1343 | { print  $1":" $2":" $3":" $4":" $5":" $6":" $7":" $8":" $9":"$10":"    \ | 
|---|
| 1344 | $11":"$12":"$13":"$14":"$15":"$16":"$17":"$18":"$19":"$20":"    \ | 
|---|
| 1345 | $21":"$22":"$23":"$24":"$25":"$26":"$27":" >> "'$outfile'" }    \ | 
|---|
| 1346 | { next }                                                                \ | 
|---|
| 1347 | } else {                                                                  \ | 
|---|
| 1348 | # The disk status value does not match anything.                        \ | 
|---|
| 1349 | # Echo the line as is and check whether the disk is in an odd state.    \ | 
|---|
| 1350 | { print $0 >> "'$outfile'" }                                            \ | 
|---|
| 1351 | if ( $'$DISK_STATUS_Field' != "" &&                                     \ | 
|---|
| 1352 | $'$DISK_STATUS_Field' != "ready" ) {                               \ | 
|---|
| 1353 | { oddstate = "yes" }                                                  \ | 
|---|
| 1354 | }                                                                       \ | 
|---|
| 1355 | { next }                                                                \ | 
|---|
| 1356 | }                                                                         \ | 
|---|
| 1357 | }                                                                           \ | 
|---|
| 1358 | }                                                                             \ | 
|---|
| 1359 | # All other lines are echoed without change.                                  \ | 
|---|
| 1360 | { print $0 >> "'$outfile'" }                                                  \ | 
|---|
| 1361 | END {                                                                         \ | 
|---|
| 1362 | { print sgh1 ":" oddstate ":" sgh2 >> "'$outfile'" }                        \ | 
|---|
| 1363 | }                                                                             \ | 
|---|
| 1364 | ' $sdrfsFile) | 
|---|
| 1365 | checkForErrors awk $? | 
|---|
| 1366 |  | 
|---|
| 1367 | # Print a message for the user if any disks are in an odd state. | 
|---|
| 1368 | [[ $oddState = yes ]] && printErrorMsg 103 $mmcmd $fsname $fsname | 
|---|
| 1369 |  | 
|---|
| 1370 | # Sort the updated version of the sdrfs file. | 
|---|
| 1371 | LC_ALL=C $SORT_MMSDRFS $outfile -o $outfile | 
|---|
| 1372 | checkForErrors "sorting $outfile" $? | 
|---|
| 1373 |  | 
|---|
| 1374 | # The file was updated successfully.  Copy it to the input file. | 
|---|
| 1375 | $mv $outfile $sdrfsFile | 
|---|
| 1376 | checkForErrors "resetDiskStatus:  mv $outfile $sdrfsFile " $? | 
|---|
| 1377 |  | 
|---|
| 1378 | return 0 | 
|---|
| 1379 |  | 
|---|
| 1380 | }  #----- end of function resetDiskStatus ----------------------- | 
|---|
| 1381 |  | 
|---|
| 1382 |  | 
|---|
| 1383 | ########################################################################## | 
|---|
| 1384 | # | 
|---|
| 1385 | # Function:  Compare the daemon's list of disks for the file system | 
|---|
| 1386 | #            with that contained in the passed sdrfs file. | 
|---|
| 1387 | #            If they disagree, change the sdrfs file to agree | 
|---|
| 1388 | #            with the information returned by the daemon. | 
|---|
| 1389 | #            If any of the disks of the file system are in an | 
|---|
| 1390 | #            "odd state", the "odd state" flag is set to "yes" | 
|---|
| 1391 | #            in the SG_HEADR line for the file system (otherwise | 
|---|
| 1392 | #            it is set to "no"). | 
|---|
| 1393 | # | 
|---|
| 1394 | # Input:     $1 - file system name | 
|---|
| 1395 | #            $2 - passed sdrfs file | 
|---|
| 1396 | # | 
|---|
| 1397 | # Output:    The SG_DISKS lines in the sdrfs file for the specified | 
|---|
| 1398 | #              file system now agree with the daemon's view of the disks. | 
|---|
| 1399 | # | 
|---|
| 1400 | # Returns:   0 - the passed sdrfs file now agrees with the daemon | 
|---|
| 1401 | #                  for the disks in the specified file system | 
|---|
| 1402 | #            Any other return code indicates an unexpected error. | 
|---|
| 1403 | # | 
|---|
| 1404 | ########################################################################## | 
|---|
| 1405 | function reconcileSdrfsWithDaemon  # <fsname> <sdrfsFile> | 
|---|
| 1406 | { | 
|---|
| 1407 | typeset sourceFile="mmfsfuncs.sh" | 
|---|
| 1408 | [[ -n $DEBUG || -n $DEBUGreconcileSdrfsWithDaemon ]] && set -x | 
|---|
| 1409 | $mmTRACE_ENTER "$*" | 
|---|
| 1410 |  | 
|---|
| 1411 | typeset fsname=$1 | 
|---|
| 1412 | typeset sdrfsFile=$2 | 
|---|
| 1413 |  | 
|---|
| 1414 | typeset mmlsdiskLine sdrfsLine nodesetId diskName sgh1 sgh2 | 
|---|
| 1415 | typeset failureGroup holdsMetadata holdsData diskStatus | 
|---|
| 1416 | typeset oddState="no" | 
|---|
| 1417 | typeset rc=0 | 
|---|
| 1418 | integer nodeCount=0 | 
|---|
| 1419 | integer seqNo=0 | 
|---|
| 1420 |  | 
|---|
| 1421 | # Print message:  "Verifying file system configuration information ..." | 
|---|
| 1422 | printInfoMsg 473 | 
|---|
| 1423 |  | 
|---|
| 1424 | # Determine the nodeset to which this filesystem belongs. | 
|---|
| 1425 | nodesetId=$($awk -F: '                           \ | 
|---|
| 1426 | /':$SG_HEADR:'/ {                              \ | 
|---|
| 1427 | if ( $'$DEV_NAME_Field' == "'$fsname'" ) {   \ | 
|---|
| 1428 | {print $'$NODESETID_Field'}                \ | 
|---|
| 1429 | { exit 0 }                                 \ | 
|---|
| 1430 | }                                            \ | 
|---|
| 1431 | }                                              \ | 
|---|
| 1432 | ' $sdrfsFile) | 
|---|
| 1433 | checkForErrors awk $? | 
|---|
| 1434 |  | 
|---|
| 1435 | # Obtain the daemon's list of disks for the filesystem. | 
|---|
| 1436 | # If the nodeset to which this node belongs is the same as the nodeset | 
|---|
| 1437 | # in which the file system resides, invoke the command directly. | 
|---|
| 1438 | if [[ $nsId = $nodesetId ]] | 
|---|
| 1439 | then | 
|---|
| 1440 | ${mmcmdDir}/${links}/mmlsdisk $fsname >$tmpfile2 2>$errMsg | 
|---|
| 1441 | rc=$(remapRC $?) | 
|---|
| 1442 |  | 
|---|
| 1443 | # If the command failed in a way that a remote invocation will not | 
|---|
| 1444 | # make a difference, display any error messages and get out. | 
|---|
| 1445 | if [[ $rc -ne $MM_DaemonDown && | 
|---|
| 1446 | $rc -ne $MM_QuorumWait && | 
|---|
| 1447 | $rc -ne 0              ]] | 
|---|
| 1448 | then | 
|---|
| 1449 | [[ -s $errMsg ]] && $cat $errMsg 1>&2 | 
|---|
| 1450 | $rm -f $errMsg | 
|---|
| 1451 | if [[ $rc -eq $MM_ConnectionReset ]] | 
|---|
| 1452 | then | 
|---|
| 1453 | # An internode connection was reset. | 
|---|
| 1454 | printErrorMsg 257 $mmcmd | 
|---|
| 1455 | fi | 
|---|
| 1456 | return $rc | 
|---|
| 1457 | fi | 
|---|
| 1458 | else | 
|---|
| 1459 | # Set rc to a non-zero value so we will try the mmlsdisk cmd remotely. | 
|---|
| 1460 | rc=$MM_DaemonDown | 
|---|
| 1461 | fi | 
|---|
| 1462 | $rm -f $errMsg | 
|---|
| 1463 |  | 
|---|
| 1464 | # If the mmlsdisk call has not succeeded yet, | 
|---|
| 1465 | # issue the mmlsdisk command on a remote node. | 
|---|
| 1466 | if [[ $rc -ne 0 ]] | 
|---|
| 1467 | then | 
|---|
| 1468 | # Create a file with the reliable names that form | 
|---|
| 1469 | # the nodeset to which the file system belongs. | 
|---|
| 1470 | nodeCount=$(getNodeFile $REL_HOSTNAME_Field $nodesetId $sdrfsFile $nodefile) | 
|---|
| 1471 | if [[ $nodeCount -eq 0 ]] | 
|---|
| 1472 | then | 
|---|
| 1473 | # The nodeset is empty; there is nobody to run the command. | 
|---|
| 1474 | printErrorMsg 171 $mmcmd "getNodeFile (nodeCount=0)" 1 | 
|---|
| 1475 | return 1 | 
|---|
| 1476 | fi | 
|---|
| 1477 |  | 
|---|
| 1478 | # Try the nodes one by one until a node is able to execute the command. | 
|---|
| 1479 | preferredNode=0   # We have no idea where to go first; let mmcommon decide. | 
|---|
| 1480 | $mmcommon linkCommand $preferredNode $nodefile  \ | 
|---|
| 1481 | mmlsdisk $fsname >$tmpfile2 2>$errMsg | 
|---|
| 1482 | rc=$? | 
|---|
| 1483 | if [[ $rc -ne 0 ]] | 
|---|
| 1484 | then | 
|---|
| 1485 | [[ -s $errMsg ]] && $cat $errMsg 1>&2 | 
|---|
| 1486 | $rm -f $errMsg | 
|---|
| 1487 | if [[ $rc -eq $MM_ConnectionReset ]] | 
|---|
| 1488 | then | 
|---|
| 1489 | # An internode connection was reset. | 
|---|
| 1490 | printErrorMsg 257 $mmcmd | 
|---|
| 1491 | fi | 
|---|
| 1492 | return $rc | 
|---|
| 1493 | fi | 
|---|
| 1494 | fi | 
|---|
| 1495 | $rm -f $errMsg | 
|---|
| 1496 |  | 
|---|
| 1497 | # Remove the header lines from the mmlsdisk output. | 
|---|
| 1498 | $tail -n +4 $tmpfile2 > $tmpfile | 
|---|
| 1499 | checkForErrors "tail -n +4 $tmpfile2 $tmpfile" $? | 
|---|
| 1500 |  | 
|---|
| 1501 | # One more sanity check before we proceed. | 
|---|
| 1502 | if [[ ! -s $tmpfile ]] | 
|---|
| 1503 | then | 
|---|
| 1504 | printErrorMsg 171 reconcileSdrfsWithDaemon "tslsdisk - missing disk information" 1 | 
|---|
| 1505 | return 1 | 
|---|
| 1506 | fi | 
|---|
| 1507 |  | 
|---|
| 1508 |  | 
|---|
| 1509 | ########################################################################## | 
|---|
| 1510 | # Go through the passed sdrfs file.  Increment the generation number. | 
|---|
| 1511 | # Make any needed changes to SG_DISKS lines for the specified filesystem. | 
|---|
| 1512 | ########################################################################## | 
|---|
| 1513 | # Delete the temporary file that will be created. | 
|---|
| 1514 | $rm -f $sdrfs | 
|---|
| 1515 |  | 
|---|
| 1516 | IFS=":"           # Change the field separator to ':'. | 
|---|
| 1517 | exec 3<&- | 
|---|
| 1518 | exec 3< $sdrfsFile | 
|---|
| 1519 | while read -u3 sdrfsLine | 
|---|
| 1520 | do | 
|---|
| 1521 | # Parse the line. | 
|---|
| 1522 | set -f ; set -A v -- - $sdrfsLine ; set +f | 
|---|
| 1523 |  | 
|---|
| 1524 | IFS="$IFS_sv" | 
|---|
| 1525 | printLine=true | 
|---|
| 1526 |  | 
|---|
| 1527 | # Selectively alter some of the fields in the line. | 
|---|
| 1528 | case ${v[$LINE_TYPE_Field]} in | 
|---|
| 1529 |  | 
|---|
| 1530 | $VERSION_LINE )  # This is the global header line. | 
|---|
| 1531 | # Increment the generation number | 
|---|
| 1532 | newGenNumber=${v[$SDRFS_GENNUM_Field]}+1 | 
|---|
| 1533 | v[$SDRFS_GENNUM_Field]=$newGenNumber | 
|---|
| 1534 | ;; | 
|---|
| 1535 |  | 
|---|
| 1536 | $SG_HEADR )  # This is the header line for some file system. | 
|---|
| 1537 | # If this is the header for the specified file system, | 
|---|
| 1538 | # save the line's contents into two strings that will be used | 
|---|
| 1539 | # later in creating the SG_HEADR line.  We can't create the | 
|---|
| 1540 | # line now because we don't know how to set the "odd state" | 
|---|
| 1541 | # field for the file system yet. | 
|---|
| 1542 | if [[ ${v[$DEV_NAME_Field]} = $fsname ]] | 
|---|
| 1543 | then | 
|---|
| 1544 | printLine=false | 
|---|
| 1545 | sgh1=${v[1]}:${v[2]}:${v[3]}:${v[4]}:${v[5]} | 
|---|
| 1546 | sgh2=${v[7]}:${v[8]}:${v[9]}:${v[10]}:${v[11]}:${v[12]}:${v[13]} | 
|---|
| 1547 | sgh2=$sgh2:${v[14]}:${v[15]}:${v[16]}:${v[17]}:${v[18]}:${v[19]} | 
|---|
| 1548 | sgh2=$sgh2:${v[20]}:${v[21]}:${v[22]}:${v[23]}:${v[24]} | 
|---|
| 1549 | fi | 
|---|
| 1550 | ;; | 
|---|
| 1551 |  | 
|---|
| 1552 | $SG_DISKS )  # This line describes a disk. | 
|---|
| 1553 | # If this disk belongs to the file system or is a free disk, | 
|---|
| 1554 | # make the SG_DISKS line agree with the daemon's data about the disk. | 
|---|
| 1555 | if [[ ${v[$DEV_NAME_Field]} = $fsname  || | 
|---|
| 1556 | ${v[$NODESETID_Field]} = $FREE_DISK ]] | 
|---|
| 1557 | then | 
|---|
| 1558 | # Locate the line for this disk in the mmlsdisk output file. | 
|---|
| 1559 | $rm -f $tmpfile2 | 
|---|
| 1560 | mmlsdiskLine=$($awk '                                           \ | 
|---|
| 1561 | # If the line is for our disk, output it to $mmlsdiskLine     \ | 
|---|
| 1562 | # but do not append it to tmpfile2.                           \ | 
|---|
| 1563 | $1 == "'${v[$DISK_NAME_Field]}'" {                            \ | 
|---|
| 1564 | { print $0 }                                                \ | 
|---|
| 1565 | { next }                                                    \ | 
|---|
| 1566 | }                                                             \ | 
|---|
| 1567 | # If the line is for some other disk, append it to tmpfile2.  \ | 
|---|
| 1568 | { print $0 >> "'$tmpfile2'" }                                 \ | 
|---|
| 1569 | ' $tmpfile) | 
|---|
| 1570 | checkForErrors awk $? | 
|---|
| 1571 |  | 
|---|
| 1572 | # Prepare the mmlsdisk output file for the next iteration. | 
|---|
| 1573 | # It will contain all of its prior lines except the line | 
|---|
| 1574 | # for the disk that is currently being processed. | 
|---|
| 1575 | $touch $tmpfile2   # Make sure the file exists even if empty. | 
|---|
| 1576 | $mv $tmpfile2 $tmpfile | 
|---|
| 1577 | checkForErrors "mv $tmpfile2 $tmpfile" $? | 
|---|
| 1578 |  | 
|---|
| 1579 | if [[ -z $mmlsdiskLine ]] | 
|---|
| 1580 | then | 
|---|
| 1581 | # The daemon doesn't know about this disk. | 
|---|
| 1582 | # If the SG_DISKS line indicates the disk belongs to the | 
|---|
| 1583 | # filesystem, change the SG_DISKS line into a free disk line. | 
|---|
| 1584 | if [[ ${v[$DEV_NAME_Field]} = $fsname ]] | 
|---|
| 1585 | then | 
|---|
| 1586 | v[$NODESETID_Field]=$FREE_DISK | 
|---|
| 1587 | v[$DEV_NAME_Field]=$NO_DEVICE | 
|---|
| 1588 | v[$LINE_NUMBER_Field]=0 | 
|---|
| 1589 | v[$EXCLUDE_Field]=$includedDisk | 
|---|
| 1590 | v[$DISK_STATUS_Field]="" | 
|---|
| 1591 | fi | 
|---|
| 1592 | else | 
|---|
| 1593 | # The daemon says this disk is part of the filesystem. | 
|---|
| 1594 | # Update the SG_DISKS line fields with the data from | 
|---|
| 1595 | # mmlsdisk so that it is current. | 
|---|
| 1596 | set -f ; set -- $mmlsdiskLine ; set +f | 
|---|
| 1597 | failureGroup=$4 | 
|---|
| 1598 | holdsMetadata=$5 | 
|---|
| 1599 | holdsData=$6 | 
|---|
| 1600 | diskStatus=$7 | 
|---|
| 1601 | v[$FAILURE_GROUP_Field]=$failureGroup | 
|---|
| 1602 | if [[ $holdsData = yes ]] | 
|---|
| 1603 | then | 
|---|
| 1604 | if [[ $holdsMetadata = yes ]] | 
|---|
| 1605 | then | 
|---|
| 1606 | v[$DISK_USAGE_Field]=dataAndMetadata | 
|---|
| 1607 | else | 
|---|
| 1608 | v[$DISK_USAGE_Field]=dataOnly | 
|---|
| 1609 | fi | 
|---|
| 1610 | else | 
|---|
| 1611 | if [[ $holdsMetadata = yes ]] | 
|---|
| 1612 | then | 
|---|
| 1613 | v[$DISK_USAGE_Field]=metadataOnly | 
|---|
| 1614 | else | 
|---|
| 1615 | v[$DISK_USAGE_Field]=descOnly | 
|---|
| 1616 | fi | 
|---|
| 1617 | fi | 
|---|
| 1618 | [[ $diskStatus = allocmap* || | 
|---|
| 1619 | $diskStatus = being*    || | 
|---|
| 1620 | $diskStatus = removing* ]] && diskStatus=$diskStatus$8 | 
|---|
| 1621 | v[$DISK_STATUS_Field]=$diskStatus | 
|---|
| 1622 | [[ $diskStatus != ready && $diskStatus != "" ]] && oddState="yes" | 
|---|
| 1623 |  | 
|---|
| 1624 | # If the disk is listed as a free disk, change the SG_DISKS | 
|---|
| 1625 | # line to indicate that the disk is part of the filesystem. | 
|---|
| 1626 | if [[ ${v[$NODESETID_Field]} = $FREE_DISK ]] | 
|---|
| 1627 | then | 
|---|
| 1628 | v[$NODESETID_Field]=$nodesetId | 
|---|
| 1629 | v[$DEV_NAME_Field]=$fsname | 
|---|
| 1630 | fi | 
|---|
| 1631 |  | 
|---|
| 1632 | # Update the sequence number. | 
|---|
| 1633 | seqNo=seqNo+1 | 
|---|
| 1634 | v[$LINE_NUMBER_Field]=$seqNo | 
|---|
| 1635 | fi  # end of if [[ -z $mmlsdiskLine ]] | 
|---|
| 1636 | fi  # end of if [[ disk belongs to filesystem or disk is a free disk ]] | 
|---|
| 1637 | ;; | 
|---|
| 1638 |  | 
|---|
| 1639 | * )  # Pass all lines for other nodesets without a change. | 
|---|
| 1640 | ;; | 
|---|
| 1641 |  | 
|---|
| 1642 | esac  # end Change some of the fields | 
|---|
| 1643 |  | 
|---|
| 1644 | # Build and write the line to the new sdrfs file. | 
|---|
| 1645 | if [[ $printLine = true ]] | 
|---|
| 1646 | then | 
|---|
| 1647 | print_newLine >> $sdrfs | 
|---|
| 1648 | checkForErrors "writing to file $sdrfs" $? | 
|---|
| 1649 | fi | 
|---|
| 1650 |  | 
|---|
| 1651 | IFS=":"  # Change the separator back to ":" for the next iteration. | 
|---|
| 1652 |  | 
|---|
| 1653 | done  # end while read -u3 sdrfsLine | 
|---|
| 1654 |  | 
|---|
| 1655 | IFS="$IFS_sv"  # Restore the default IFS settings. | 
|---|
| 1656 |  | 
|---|
| 1657 | # Issue informational error messages for any active disks | 
|---|
| 1658 | # reported by the daemon but not found in the sdrfs file. | 
|---|
| 1659 | if [[ -s $tmpfile ]] | 
|---|
| 1660 | then | 
|---|
| 1661 | $rm -f $tmpfile2 | 
|---|
| 1662 | exec 3<&- | 
|---|
| 1663 | exec 3< $tmpfile | 
|---|
| 1664 | while read -u3 mmlsdiskLine | 
|---|
| 1665 | do | 
|---|
| 1666 | # Parse the line. | 
|---|
| 1667 | set -f ; set -- $mmlsdiskLine ; set +f | 
|---|
| 1668 | diskStatus=$7 | 
|---|
| 1669 | if [[ $diskStatus = "ready" ]] | 
|---|
| 1670 | then | 
|---|
| 1671 | print -- $mmlsdiskLine >> $tmpfile2 | 
|---|
| 1672 | else | 
|---|
| 1673 | oddState=yes  # Set flag to let caller know he has odd-state disks. | 
|---|
| 1674 | fi | 
|---|
| 1675 | done  # end of while read -u3 mmlsdiskLine | 
|---|
| 1676 | if [[ -s $tmpfile2 ]] | 
|---|
| 1677 | then | 
|---|
| 1678 | # Active disks are missing from the GPFS configuration data. | 
|---|
| 1679 | printErrorMsg 102 $mmcmd | 
|---|
| 1680 | $cat $tmpfile2 1>&2 | 
|---|
| 1681 | return 1 | 
|---|
| 1682 | fi | 
|---|
| 1683 | fi  # end of if [[ -s $tmpfile ]] | 
|---|
| 1684 |  | 
|---|
| 1685 | # Create/store the SG_HEADER line for the file system in the sdrfs file, | 
|---|
| 1686 | # using the odd state flag that was set if any of the disks in the | 
|---|
| 1687 | # file system were in an odd state. | 
|---|
| 1688 | print -- "$sgh1:$oddState:$sgh2" >> $sdrfs | 
|---|
| 1689 | checkForErrors "writing to file $sdrfs" $? | 
|---|
| 1690 |  | 
|---|
| 1691 | # Print a message for the user if any disks are in an odd state. | 
|---|
| 1692 | [[ $oddState = yes ]] && printErrorMsg 266 $mmcmd $fsname | 
|---|
| 1693 |  | 
|---|
| 1694 | # Sort the reconciled version of the mmsdrfs file. | 
|---|
| 1695 | LC_ALL=C $SORT_MMSDRFS $sdrfs -o $sdrfs | 
|---|
| 1696 | checkForErrors "sorting $sdrfs" $? | 
|---|
| 1697 |  | 
|---|
| 1698 | # Everything seems to have gone ok so far. | 
|---|
| 1699 | # Rename the file so that the caller can find it. | 
|---|
| 1700 | $mv $sdrfs $sdrfsFile | 
|---|
| 1701 | checkForErrors "mv $sdrfs $sdrfsFile" $? | 
|---|
| 1702 |  | 
|---|
| 1703 | # Return to the caller. | 
|---|
| 1704 | return 0 | 
|---|
| 1705 |  | 
|---|
| 1706 | }  #----- end of function reconcileSdrfsWithDaemon -------------- | 
|---|
| 1707 |  | 
|---|