[PATCH 2/2] Use _netdev mount option as needed. (#1166509)

David Lehman dlehman at redhat.com
Tue Jan 6 20:15:35 UTC 2015


The intention is to pass the option as needed when mounting filesystems
in addition to putting it in /etc/fstab.
---
 blivet/__init__.py          |  1 -
 blivet/devices/btrfs.py     |  6 ++++--
 blivet/devices/partition.py |  5 -----
 blivet/devices/storage.py   | 20 ++++++++++++++++++++
 tests/devices_test.py       | 30 ++++++++++++++++++++++++++++++
 5 files changed, 54 insertions(+), 8 deletions(-)

diff --git a/blivet/__init__.py b/blivet/__init__.py
index e785053..6742ca5 100644
--- a/blivet/__init__.py
+++ b/blivet/__init__.py
@@ -2803,7 +2803,6 @@ class FSSet(object):
             options = options or "defaults"
             for netdev in netdevs:
                 if device.dependsOn(netdev):
-                    options = options + ",_netdev"
                     if root_on_netdev and mountpoint not in ["/", "/usr"]:
                         options = options + ",x-initrd.mount"
                     break
diff --git a/blivet/devices/btrfs.py b/blivet/devices/btrfs.py
index 13adbb4..9b5c9ca 100644
--- a/blivet/devices/btrfs.py
+++ b/blivet/devices/btrfs.py
@@ -481,11 +481,13 @@ class BTRFSSubVolumeDevice(BTRFSDevice, RaidDevice):
             return
 
         # propagate mount options specified for members via kickstart
+        # start with options (not mountopts) so we don't lose the default mount
+        # options
         opts = "subvol=%s" % self.name
         if self.volume.format.mountopts:
-            opts = "%s,%s" % (self.volume.format.mountopts, opts)
+            opts = "%s,%s" % (self.volume.format.options, opts)
 
-        self.format.mountopts = opts
+        self.format.mountopts = "%s,%s" % (self.format.options, opts)
 
     @property
     def volume(self):
diff --git a/blivet/devices/partition.py b/blivet/devices/partition.py
index 24f85b3..c4bd136 100644
--- a/blivet/devices/partition.py
+++ b/blivet/devices/partition.py
@@ -408,11 +408,6 @@ class PartitionDevice(StorageDevice):
         """ Is this device directly accessible? """
         return self.isleaf and not self.isExtended
 
-    def _setFormat(self, fmt):
-        """ Set the Device's format. """
-        log_method_call(self, self.name)
-        StorageDevice._setFormat(self, fmt)
-
     def _setBootable(self, bootable):
         """ Set the bootable flag for this partition. """
         if self.partedPartition:
diff --git a/blivet/devices/storage.py b/blivet/devices/storage.py
index 7bcdc2f..962f83c 100644
--- a/blivet/devices/storage.py
+++ b/blivet/devices/storage.py
@@ -38,6 +38,7 @@ import logging
 log = logging.getLogger("blivet")
 
 from .device import Device
+from .network import NetworkStorageDevice
 
 class StorageDevice(Device):
     """ A generic storage device.
@@ -511,6 +512,8 @@ class StorageDevice(Device):
             self._partedDevice = None
             self._targetSize = self.currentSize
 
+        self._updateNetDevMountOption()
+
     #
     # destroy
     #
@@ -630,6 +633,23 @@ class StorageDevice(Device):
 
         self._format = fmt
         self._format.device = self.path
+        self._updateNetDevMountOption()
+
+    def _updateNetDevMountOption(self):
+        if not self._format.mountable:
+            return
+
+        is_netdev = any(isinstance(a, NetworkStorageDevice)
+                        for a in self.ancestors)
+        has_netdev_option = "_netdev" in self._format.options.split(",")
+        if not is_netdev and has_netdev_option:
+            mountopts = self._format.mountopts.split(",")
+            mountopts.remove("_netdev")
+            self._format.mountopts = mountopts.join(",")
+        elif is_netdev and not has_netdev_option:
+            # notice we're appending to options -- not mountopts -- so we get
+            # the default options, too
+            self._format.mountopts = self._format.options + ",_netdev"
 
     def _getFormat(self):
         return self._format
diff --git a/tests/devices_test.py b/tests/devices_test.py
index 3d7c28e..c526c74 100644
--- a/tests/devices_test.py
+++ b/tests/devices_test.py
@@ -25,6 +25,7 @@ from blivet.devices import LVMVolumeGroupDevice
 from blivet.devices import MDBiosRaidArrayDevice
 from blivet.devices import MDContainerDevice
 from blivet.devices import MDRaidArrayDevice
+from blivet.devices import NetworkStorageDevice
 from blivet.devices import OpticalDevice
 from blivet.devices import PartitionDevice
 from blivet.devices import StorageDevice
@@ -1016,6 +1017,35 @@ class DeviceNameTestCase(unittest.TestCase):
         for name in bad_names:
             self.assertFalse(LVMLogicalVolumeDevice.isNameValid(name))
 
+class FakeNetDev(StorageDevice, NetworkStorageDevice):
+    _type = "fakenetdev"
+
+class NetDevMountOptionTestCase(unittest.TestCase):
+    def testNetDevSetting(self):
+        """ Verify netdev mount option setting after format assignment. """
+        netdev = FakeNetDev("net1")
+        dev = StorageDevice("dev1", fmt=getFormat("ext4"))
+        self.assertFalse("_netdev" in dev.format.options.split(","))
+
+        dev.parents.append(netdev)
+        dev.format = getFormat("ext4")
+        self.assertTrue("_netdev" in dev.format.options.split(","))
+
+    def testNetDevUpdate(self):
+        """ Verify netdev mount option setting after device creation. """
+        netdev = FakeNetDev("net1")
+        dev = StorageDevice("dev1", fmt=getFormat("ext4"))
+        self.assertFalse("_netdev" in dev.format.options.split(","))
+
+        dev.parents.append(netdev)
+
+        # these create methods shouldn't write anything to disk
+        netdev.create()
+        dev.create()
+
+        self.assertTrue("_netdev" in dev.format.options.split(","))
+
+
 if __name__ == "__main__":
     unittest.main()
 
-- 
1.9.3



More information about the anaconda-patches mailing list