diff --git a/vpnor/obmc-vpnor-util b/vpnor/obmc-vpnor-util
index 54ba590..7c4500e 100644
--- a/vpnor/obmc-vpnor-util
+++ b/vpnor/obmc-vpnor-util
@@ -1,160 +1,160 @@
 #!/bin/bash
 
-clear_volatile() {
-  service=$(mapper get-service /org/open_power/control/volatile)
-  clearVolatileEnabled=$(busctl get-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled)
-  if [[ "$clearVolatileEnabled" != "b true" ]]; then
-    return 0
-  fi
-
-  PNOR_TOC_FILE="pnor.toc"
-  PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro/"
-  PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw/"
-  PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv/"
-
-  # toc partition string format:
-  # partition27=HB_VOLATILE,0x02ba9000,0x02bae000,00,ECC,VOLATILE,READWRITE
-  tocFilePath="${PNOR_RO_ACTIVE_PATH}${PNOR_TOC_FILE}"
-  if [ ! -f "${tocFilePath}" ]; then
-    tocFilePath="${PNOR_RW_ACTIVE_PATH}${PNOR_TOC_FILE}"
-  fi
-  mapfile -t volatiles < <(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)')
-  for (( index=0; index<${#volatiles[@]}; index++ )); do
-    volatileName="$(echo "${volatiles[${index}]}" | awk -F '=' '{print $2}')"
-
-    rwVolatile="${PNOR_RW_ACTIVE_PATH}${volatileName}"
-    if [ -f "${rwVolatile}" ]; then
-      echo "Clear $rwVolatile"
-      rm "${rwVolatile}"
-    fi
-    prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}"
-    if [ -f "${prsvVolatile}" ]; then
-      echo "Clear $prsvVolatile"
-      rm "${prsvVolatile}"
+function clear_volatile() {
+    service=$(mapper get-service /org/open_power/control/volatile)
+    clearVolatileEnabled=$(busctl get-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled)
+    if [[ "$clearVolatileEnabled" != "b true" ]]; then
+        return 0
     fi
 
-    if [ ! -f "${PNOR_RO_ACTIVE_PATH}${volatileName}" ]; then
-      cp -a "${PNOR_RO_ACTIVE_PATH}81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}"
-      ln -s "81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}${volatileName}"
+    PNOR_TOC_FILE="pnor.toc"
+    PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro/"
+    PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw/"
+    PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv/"
+
+    # toc partition string format:
+    # partition27=HB_VOLATILE,0x02ba9000,0x02bae000,00,ECC,VOLATILE,READWRITE
+    tocFilePath="${PNOR_RO_ACTIVE_PATH}${PNOR_TOC_FILE}"
+    if [ ! -f "${tocFilePath}" ]; then
+        tocFilePath="${PNOR_RW_ACTIVE_PATH}${PNOR_TOC_FILE}"
     fi
-  done
-  # Always reset the sensor after clearing
-  busctl set-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false
+    mapfile -t volatiles < <(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)')
+    for (( index=0; index<${#volatiles[@]}; index++ )); do
+        volatileName="$(echo "${volatiles[${index}]}" | awk -F '=' '{print $2}')"
+
+        rwVolatile="${PNOR_RW_ACTIVE_PATH}${volatileName}"
+        if [ -f "${rwVolatile}" ]; then
+            echo "Clear $rwVolatile"
+            rm "${rwVolatile}"
+        fi
+        prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}"
+        if [ -f "${prsvVolatile}" ]; then
+            echo "Clear $prsvVolatile"
+            rm "${prsvVolatile}"
+        fi
+
+        if [ ! -f "${PNOR_RO_ACTIVE_PATH}${volatileName}" ]; then
+            cp -a "${PNOR_RO_ACTIVE_PATH}81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}"
+            ln -s "81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}${volatileName}"
+        fi
+    done
+    # Always reset the sensor after clearing
+    busctl set-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false
 }
 
-update_symlinks() {
-  PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/"
-  HOSTFW_ACTIVE_PATH="/var/lib/phosphor-software-manager/hostfw/"
-  PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro"
-  PNOR_RO_PREFIX="/media/pnor-ro-"
-  PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw"
-  PNOR_RW_PREFIX="/media/pnor-rw-"
-  PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv"
-  PNOR_PRSV="/media/pnor-prsv"
-  PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/"
-  PNOR_PATCH_LOCATION="/usr/local/share/pnor/"
-  MMC_BASE_PATH="/media/hostfw"
-  MMC_RO_PATH="${MMC_BASE_PATH}/running-ro"
-  MMC_RUNNING_PATH="${MMC_BASE_PATH}/running"
-  MMC_ALTERNATE_PATH="${MMC_BASE_PATH}/alternate"
-  MMC_STAGING_PATH="${MMC_BASE_PATH}/staging"
-  MMC_NVRAM_PATH="${MMC_BASE_PATH}/nvram"
-  HOSTFW_RUNNING_PATH="${HOSTFW_ACTIVE_PATH}/running"
-  HOSTFW_ALTERNATE_PATH="${HOSTFW_ACTIVE_PATH}/alternate"
-  HOSTFW_STAGING_PATH="${HOSTFW_ACTIVE_PATH}/staging"
-  HOSTFW_NVRAM_PATH="${HOSTFW_ACTIVE_PATH}/nvram"
+function update_symlinks() {
+    PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/"
+    HOSTFW_ACTIVE_PATH="/var/lib/phosphor-software-manager/hostfw/"
+    PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro"
+    PNOR_RO_PREFIX="/media/pnor-ro-"
+    PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw"
+    PNOR_RW_PREFIX="/media/pnor-rw-"
+    PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv"
+    PNOR_PRSV="/media/pnor-prsv"
+    PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/"
+    PNOR_PATCH_LOCATION="/usr/local/share/pnor/"
+    MMC_BASE_PATH="/media/hostfw"
+    MMC_RO_PATH="${MMC_BASE_PATH}/running-ro"
+    MMC_RUNNING_PATH="${MMC_BASE_PATH}/running"
+    MMC_ALTERNATE_PATH="${MMC_BASE_PATH}/alternate"
+    MMC_STAGING_PATH="${MMC_BASE_PATH}/staging"
+    MMC_NVRAM_PATH="${MMC_BASE_PATH}/nvram"
+    HOSTFW_RUNNING_PATH="${HOSTFW_ACTIVE_PATH}/running"
+    HOSTFW_ALTERNATE_PATH="${HOSTFW_ACTIVE_PATH}/alternate"
+    HOSTFW_STAGING_PATH="${HOSTFW_ACTIVE_PATH}/staging"
+    HOSTFW_NVRAM_PATH="${HOSTFW_ACTIVE_PATH}/nvram"
 
-  # Get a list of all active PNOR versions
-  data="$(ls -d ${PNOR_RO_PREFIX}* 2>/dev/null)"
-  mapfile -t array <<< "${data}"
+    # Get a list of all active PNOR versions
+    data="$(ls -d ${PNOR_RO_PREFIX}* 2>/dev/null)"
+    mapfile -t array <<< "${data}"
 
-  currentVersion=""
-  lowestPriority=255
-  for element in "${array[@]}"; do
-    #Remove the PNOR_RO_PREFIX from the path to get version ID.
-    versionId="${element#"${PNOR_RO_PREFIX}"}"
+    currentVersion=""
+    lowestPriority=255
+    for element in "${array[@]}"; do
+        #Remove the PNOR_RO_PREFIX from the path to get version ID.
+        versionId="${element#"${PNOR_RO_PREFIX}"}"
 
-    # Get the priority of active versions from persistence files.
-    if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then
-      data="$(grep -r "priority" "${PERSISTENCE_PATH}${versionId}")"
-      priority="${data: -1}"
-      if [[ priority -le lowestPriority ]]; then
-        lowestPriority=${priority}
-        currentVersion=${versionId}
-      fi
+        # Get the priority of active versions from persistence files.
+        if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then
+            data="$(grep -r "priority" "${PERSISTENCE_PATH}${versionId}")"
+            priority="${data: -1}"
+            if [[ priority -le lowestPriority ]]; then
+                lowestPriority=${priority}
+                currentVersion=${versionId}
+            fi
+        fi
+    done
+
+    if [ -n "$currentVersion" ]; then
+        # Use active version
+        roTarget="${PNOR_RO_PREFIX}${currentVersion}"
+        rwTarget="${PNOR_RW_PREFIX}${currentVersion}"
+        prsvTarget="${PNOR_PRSV}"
+    elif [ -d "${MMC_BASE_PATH}" ]; then
+        # Use eMMC
+        roTarget="${MMC_RO_PATH}"
+        rwTarget="${MMC_RUNNING_PATH}"
+        prsvTarget="${MMC_RUNNING_PATH}"
+
+        if [ ! -d "${HOSTFW_ACTIVE_PATH}" ]; then
+            mkdir -p "${HOSTFW_ACTIVE_PATH}"
+        fi
+        # Symlinks used by PLDM
+        if [[ $(readlink -f "${HOSTFW_RUNNING_PATH}") != "${MMC_RUNNING_PATH}" ]]; then
+            rm -f ${HOSTFW_RUNNING_PATH}
+            ln -sfv ${MMC_RUNNING_PATH} ${HOSTFW_RUNNING_PATH}
+        fi
+        if [[ $(readlink -f "${HOSTFW_ALTERNATE_PATH}") != "${MMC_ALTERNATE_PATH}" ]]; then
+            rm -f ${HOSTFW_ALTERNATE_PATH}
+            ln -sfv ${MMC_ALTERNATE_PATH} ${HOSTFW_ALTERNATE_PATH}
+        fi
+        if [[ $(readlink -f "${HOSTFW_STAGING_PATH}") != "${MMC_STAGING_PATH}" ]]; then
+            rm -f ${HOSTFW_STAGING_PATH}
+            ln -sfv ${MMC_STAGING_PATH} ${HOSTFW_STAGING_PATH}
+        fi
+        if [[ $(readlink -f "${HOSTFW_NVRAM_PATH}") != "${MMC_NVRAM_PATH}" ]]; then
+            rm -f ${HOSTFW_NVRAM_PATH}
+            ln -sfv ${MMC_NVRAM_PATH} ${HOSTFW_NVRAM_PATH}
+        fi
     fi
-  done
 
-  if [ -n "$currentVersion" ]; then
-      # Use active version
-      roTarget="${PNOR_RO_PREFIX}${currentVersion}"
-      rwTarget="${PNOR_RW_PREFIX}${currentVersion}"
-      prsvTarget="${PNOR_PRSV}"
-  elif [ -d "${MMC_BASE_PATH}" ]; then
-      # Use eMMC
-      roTarget="${MMC_RO_PATH}"
-      rwTarget="${MMC_RUNNING_PATH}"
-      prsvTarget="${MMC_RUNNING_PATH}"
-
-      if [ ! -d "${HOSTFW_ACTIVE_PATH}" ]; then
-          mkdir -p "${HOSTFW_ACTIVE_PATH}"
-      fi
-      # Symlinks used by PLDM
-      if [[ $(readlink -f "${HOSTFW_RUNNING_PATH}") != "${MMC_RUNNING_PATH}" ]]; then
-          rm -f ${HOSTFW_RUNNING_PATH}
-          ln -sfv ${MMC_RUNNING_PATH} ${HOSTFW_RUNNING_PATH}
-      fi
-      if [[ $(readlink -f "${HOSTFW_ALTERNATE_PATH}") != "${MMC_ALTERNATE_PATH}" ]]; then
-          rm -f ${HOSTFW_ALTERNATE_PATH}
-          ln -sfv ${MMC_ALTERNATE_PATH} ${HOSTFW_ALTERNATE_PATH}
-      fi
-      if [[ $(readlink -f "${HOSTFW_STAGING_PATH}") != "${MMC_STAGING_PATH}" ]]; then
-          rm -f ${HOSTFW_STAGING_PATH}
-          ln -sfv ${MMC_STAGING_PATH} ${HOSTFW_STAGING_PATH}
-      fi
-      if [[ $(readlink -f "${HOSTFW_NVRAM_PATH}") != "${MMC_NVRAM_PATH}" ]]; then
-          rm -f ${HOSTFW_NVRAM_PATH}
-          ln -sfv ${MMC_NVRAM_PATH} ${HOSTFW_NVRAM_PATH}
-      fi
-  fi
-
-  if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then
+    if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then
         mkdir -p "${PNOR_ACTIVE_PATH}"
-  fi
+    fi
 
-  # If the RW or RO active links doesn't point to the version with
-  # lowest priority, then remove the symlink and create new ones.
-  if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != "${roTarget}" ]]; then
-    rm -f ${PNOR_RO_ACTIVE_PATH}
-    rm -rf ${PNOR_PATCH_LOCATION}*
-    ln -sfv ${roTarget} ${PNOR_RO_ACTIVE_PATH}
-  fi
+    # If the RW or RO active links doesn't point to the version with
+    # lowest priority, then remove the symlink and create new ones.
+    if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != "${roTarget}" ]]; then
+        rm -f ${PNOR_RO_ACTIVE_PATH}
+        rm -rf ${PNOR_PATCH_LOCATION}*
+        ln -sfv ${roTarget} ${PNOR_RO_ACTIVE_PATH}
+    fi
 
-  if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != "${rwTarget}" ]]; then
-    rm -f ${PNOR_RW_ACTIVE_PATH}
-    ln -sfv ${rwTarget} ${PNOR_RW_ACTIVE_PATH}
-  fi
+    if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != "${rwTarget}" ]]; then
+        rm -f ${PNOR_RW_ACTIVE_PATH}
+        ln -sfv ${rwTarget} ${PNOR_RW_ACTIVE_PATH}
+    fi
 
-  if [[ $(readlink -f "${PNOR_PRSV_ACTIVE_PATH}") != "${prsvTarget}" ]]; then
-    rm -f ${PNOR_PRSV_ACTIVE_PATH}
-    ln -sfv ${prsvTarget} ${PNOR_PRSV_ACTIVE_PATH}
-  fi
+    if [[ $(readlink -f "${PNOR_PRSV_ACTIVE_PATH}") != "${prsvTarget}" ]]; then
+        rm -f ${PNOR_PRSV_ACTIVE_PATH}
+        ln -sfv ${prsvTarget} ${PNOR_PRSV_ACTIVE_PATH}
+    fi
 }
 
 case "$1" in
-  clearvolatile)
-    clear_volatile
-    ;;
-  updatesymlinks)
-    update_symlinks
-    ;;
-  *)
-    echo "Invalid argument"
-    exit 1
-    ;;
+    clearvolatile)
+        clear_volatile
+        ;;
+    updatesymlinks)
+        update_symlinks
+        ;;
+    *)
+        echo "Invalid argument"
+        exit 1
+        ;;
 esac
 rc=$?
 if [ ${rc} -ne 0 ]; then
-  echo "$0: error ${rc}"
-  exit ${rc}
+    echo "$0: error ${rc}"
+    exit ${rc}
 fi
