diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java
index 9960bfb..fff15fd 100644
--- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java
+++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackPrimaryDataStoreDriverImpl.java
@@ -424,29 +424,7 @@
                 vol.setSize(finalSize);
                 vol.update();
 
-                VolumeVO volumeVO = volumeDao.findById(vol.getId());
-                String datastoreUUID = answer.getContextParam("datastoreUUID");
-                if (datastoreUUID != null) {
-                    StoragePoolVO storagePoolVO = primaryStoreDao.findByUuid(datastoreUUID);
-                    if (storagePoolVO != null) {
-                        volumeVO.setPoolId(storagePoolVO.getId());
-                    } else {
-                        s_logger.warn(String.format("Unable to find datastore %s while updating the new datastore of the volume %d", datastoreUUID, vol.getId()));
-                    }
-                }
-
-                String volumePath = answer.getContextParam("volumePath");
-                if (volumePath != null) {
-                    volumeVO.setPath(volumePath);
-                }
-
-                String chainInfo = answer.getContextParam("chainInfo");
-                if (chainInfo != null) {
-                    volumeVO.setChainInfo(chainInfo);
-                }
-
-                volumeDao.update(volumeVO.getId(), volumeVO);
-
+                updateVolumePathDetails(vol, answer);
             } else if (answer != null) {
                 result.setResult(answer.getDetails());
             } else {
@@ -462,6 +440,31 @@
         callback.complete(result);
     }
 
+    private void updateVolumePathDetails(VolumeObject vol, ResizeVolumeAnswer answer) {
+        VolumeVO volumeVO = volumeDao.findById(vol.getId());
+        String datastoreUUID = answer.getContextParam("datastoreUUID");
+        if (datastoreUUID != null) {
+            StoragePoolVO storagePoolVO = primaryStoreDao.findByUuid(datastoreUUID);
+            if (storagePoolVO != null) {
+                volumeVO.setPoolId(storagePoolVO.getId());
+            } else {
+                s_logger.warn(String.format("Unable to find datastore %s while updating the new datastore of the volume %d", datastoreUUID, vol.getId()));
+            }
+        }
+
+        String volumePath = answer.getContextParam("volumePath");
+        if (volumePath != null) {
+            volumeVO.setPath(volumePath);
+        }
+
+        String chainInfo = answer.getContextParam("chainInfo");
+        if (chainInfo != null) {
+            volumeVO.setChainInfo(chainInfo);
+        }
+
+        volumeDao.update(volumeVO.getId(), volumeVO);
+    }
+
     @Override
     public void handleQualityOfServiceForVolumeMigration(VolumeInfo volumeInfo, QualityOfServiceState qualityOfServiceState) {}
 
