diff --git a/pyanaconda/storage/__init__.py b/pyanaconda/storage/__init__.py
index ad6d4ce..684f329 100644
--- a/pyanaconda/storage/__init__.py
+++ b/pyanaconda/storage/__init__.py
@@ -409,7 +409,7 @@ class Storage(object):
         except Exception as e:
             log.error("failure tearing down device tree: %s" % e)
 
-    def reset(self, cleanupOnly=False):
+    def reset(self, cleanupOnly=False, disksOnly=False):
         """ Reset storage configuration to reflect actual system state.
 
             This should rescan from scratch but not clobber user-obtained
@@ -438,7 +438,7 @@ class Storage(object):
                               luksDict=self.__luksDevs,
                               iscsi=self.iscsi,
                               dasd=self.dasd)
-        self.devicetree.populate(cleanupOnly=cleanupOnly)
+        self.devicetree.populate(cleanupOnly=cleanupOnly, disksOnly=disksOnly)
         self.config.clearPartType = clearPartType # set it back
         self.fsset = FSSet(self.devicetree)
         self.eddDict = get_edd_dict(self.partitioned)
diff --git a/pyanaconda/storage/devicetree.py b/pyanaconda/storage/devicetree.py
index c7d1118..1962361 100644
--- a/pyanaconda/storage/devicetree.py
+++ b/pyanaconda/storage/devicetree.py
@@ -209,6 +209,7 @@ class DeviceTree(object):
         devicelibs.lvm.lvm_cc_resetFilter()
 
         self._cleanup = False
+        self._disksOnly = False
 
     def setDiskImages(self, images):
         """ Set the disk images and reflect them in exclusiveDisks. """
@@ -576,18 +577,7 @@ class DeviceTree(object):
             # ignore loop devices unless they're backed by a file
             return (not devicelibs.loop.get_backing_file(name))
 
-        # We want exclusiveDisks to operate on anything that could be
-        # considered a directly usable disk, ie: fwraid array, mpath, or disk.
-        #
-        # Unfortunately, since so many things are represented as disks by
-        # udev/sysfs, we have to define what is a disk in terms of what is
-        # not a disk.
-        if udev_device_is_disk(info) and \
-           not udev_device_is_dm_partition(info) and \
-           not udev_device_is_dm_lvm(info) and \
-           not udev_device_is_dm_crypt(info) and \
-           not (udev_device_is_md(info) and
-                not udev_device_get_md_container(info)):
+        if self.udevDeviceIsDisk(info):
             if self.exclusiveDisks and name not in self.exclusiveDisks:
                 log.debug("device '%s' not in exclusiveDisks" % name)
                 self.addIgnoredDisk(name)
@@ -595,6 +585,22 @@ class DeviceTree(object):
 
         # FIXME: check for virtual devices whose slaves are on the ignore list
 
+    def udevDeviceIsDisk(self, info):
+        # We want exclusiveDisks to operate on anything that could be
+        # considered a directly usable disk, ie: fwraid array, mpath, or disk.
+        #
+        # Unfortunately, since so many things are represented as disks by
+        # udev/sysfs, we have to define what is a disk in terms of what is
+        # not a disk.
+        return (udev_device_is_disk(info) and
+                not (udev_device_is_cdrom(info) or
+                     udev_device_is_partition(info) or
+                     udev_device_is_dm_partition(info) or
+                     udev_device_is_dm_lvm(info) or
+                     udev_device_is_dm_crypt(info) or
+                     (udev_device_is_md(info) and
+                      not udev_device_get_md_container(info))))
+
     def addUdevLVDevice(self, info):
         name = udev_device_get_name(info)
         log_method_call(self, name=name)
@@ -948,6 +954,13 @@ class DeviceTree(object):
         uuid = udev_device_get_uuid(info)
         sysfs_path = udev_device_get_sysfs_path(info)
 
+        # We don't use the isIgnored mechanism for this since it will cause the
+        # non-disks to all be added to the ignoredDisks list, where they will
+        # remain for the life of this DeviceTree instance.
+        if self._disksOnly and not self.udevDeviceIsDisk(info):
+            log.info("disks only; skipping non-disk device %s" % name)
+            return
+
         if self.isIgnored(info):
             log.info("ignoring %s (%s)" % (name, sysfs_path))
             if name not in self._ignoredDisks:
@@ -1758,18 +1771,23 @@ class DeviceTree(object):
     def restoreConfigs(self):
         self.backupConfigs(restore=True)
 
-    def populate(self, cleanupOnly=False):
+    def populate(self, cleanupOnly=False, disksOnly=False):
         """ Locate all storage devices. """
         self.backupConfigs()
         if cleanupOnly:
             self._cleanup = True
 
+        if disksOnly:
+            self._disksOnly = True
+
         try:
             self._populate()
         except Exception:
             raise
         finally:
             self.restoreConfigs()
+            self._cleanup = False
+            self._disksOnly = False
 
     def _populate(self):
         log.info("DeviceTree.populate: ignoredDisks is %s ; exclusiveDisks is %s"
