diff options
author | Martin Pitt <martin.pitt@ubuntu.com> | 2015-03-01 16:35:42 +0100 |
---|---|---|
committer | Martin Pitt <martin.pitt@ubuntu.com> | 2015-03-01 16:35:42 +0100 |
commit | 6c27890287f0b86a8bc6aa6b46e7c6a573898164 (patch) | |
tree | 34cba9c585079850cf9cef14a0dadf5fd9fea691 | |
parent | 72838fea395bade4d2a0bd13410478cda27906ef (diff) |
Recognize PARTUUID and PARTLABEL in fstab
https://bugs.freedesktop.org/show_bug.cgi?id=88923
-rwxr-xr-x | src/tests/integration-test | 29 | ||||
-rw-r--r-- | src/udiskslinuxblock.c | 26 | ||||
-rw-r--r-- | src/udiskslinuxfilesystem.c | 8 |
3 files changed, 62 insertions, 1 deletions
diff --git a/src/tests/integration-test b/src/tests/integration-test index c118e5f..fe4ee9f 100755 --- a/src/tests/integration-test +++ b/src/tests/integration-test @@ -1087,10 +1087,19 @@ class Fstab(UDisksTestCase): subprocess.check_call( ['parted', '-s', kls.device, 'mkpart', 'primary', '0', '64'], stdout=subprocess.PIPE) + kls.p1label = 'udtestp1' subprocess.check_call( - ['parted', '-s', kls.device, 'name', '1', 'udtestp1'], + ['parted', '-s', kls.device, 'name', '1', kls.p1label], stdout=subprocess.PIPE) kls.sync() + blkid = subprocess.check_output( + ['blkid', '-oudev', '-p', kls.devname(1)], universal_newlines=True).splitlines() + for line in blkid: + if line.startswith('ID_PART_ENTRY_UUID='): + kls.p1uuid = line.split('=', 1)[1] + break + else: + raise SystemError('blkid does not contain partition UUID') kls.mkfs('ext2', partition=1, label='udtestfst') kls.mountpoint = tempfile.mkdtemp() @@ -1133,6 +1142,24 @@ class Fstab(UDisksTestCase): os.sync() self.do_test() + def test_partuuid(self): + '''by PARTUUID''' + + with open('/etc/fstab', 'a') as f: + f.write('PARTUUID=%s %s ext4 defaults,nosuid,noexec 0 0\n' % + (self.p1uuid, self.mountpoint)) + os.sync() + self.do_test() + + def test_partlabel(self): + '''by PARTLABEL''' + + with open('/etc/fstab', 'a') as f: + f.write('PARTLABEL=%s %s ext4 defaults,nosuid,noexec 0 0\n' % + (self.p1label, self.mountpoint)) + os.sync() + self.do_test() + def do_test(self): self.assertEqual(self.fs.get_property('mount-points'), []) mount_path = self.fs.call_mount_sync(no_options, None) diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c index 855acf8..c8a86f1 100644 --- a/src/udiskslinuxblock.c +++ b/src/udiskslinuxblock.c @@ -426,6 +426,8 @@ find_fstab_entries_for_device (UDisksLinuxBlock *block, const gchar *device = NULL; const gchar *label = NULL; const gchar *uuid = NULL; + const gchar *partuuid = NULL; + const gchar *partlabel = NULL; guint n; fsname = udisks_fstab_entry_get_fsname (entry); @@ -438,6 +440,14 @@ find_fstab_entries_for_device (UDisksLinuxBlock *block, { label = fsname + 6; } + else if (g_str_has_prefix (fsname, "PARTUUID=")) + { + partuuid = fsname + 9; + } + else if (g_str_has_prefix (fsname, "PARTLABEL=")) + { + partlabel = fsname + 10; + } else if (g_str_has_prefix (fsname, "/dev")) { device = fsname; @@ -477,6 +487,22 @@ find_fstab_entries_for_device (UDisksLinuxBlock *block, { ret = g_list_prepend (ret, g_object_ref (entry)); } + else if (partlabel != NULL || partuuid != NULL) + { + UDisksLinuxBlockObject *object; + GUdevDevice *u_dev = NULL; + + object = udisks_daemon_util_dup_object (block, NULL); + if (object == NULL) + goto continue_loop; + u_dev = udisks_linux_block_object_get_device (object)->udev_device; + g_clear_object (&object); + if (u_dev == NULL) + goto continue_loop; + if ((partuuid != NULL && g_strcmp0 (partuuid, g_udev_device_get_property (u_dev, "ID_PART_ENTRY_UUID")) == 0) || + (partlabel != NULL && g_strcmp0 (partlabel, g_udev_device_get_property (u_dev, "ID_PART_ENTRY_NAME")) == 0)) + ret = g_list_prepend (ret, g_object_ref (entry)); + } continue_loop: ; diff --git a/src/udiskslinuxfilesystem.c b/src/udiskslinuxfilesystem.c index d70384f..4c7acd3 100644 --- a/src/udiskslinuxfilesystem.c +++ b/src/udiskslinuxfilesystem.c @@ -1059,6 +1059,14 @@ is_in_fstab (UDisksBlock *block, { device = g_strdup_printf ("/dev/disk/by-label/%s", m->mnt_fsname + 6); } + else if (g_str_has_prefix (m->mnt_fsname, "PARTUUID=")) + { + device = g_strdup_printf ("/dev/disk/by-partuuid/%s", m->mnt_fsname + 9); + } + else if (g_str_has_prefix (m->mnt_fsname, "PARTLABEL=")) + { + device = g_strdup_printf ("/dev/disk/by-partlabel/%s", m->mnt_fsname + 10); + } else if (g_str_has_prefix (m->mnt_fsname, "/dev")) { device = g_strdup (m->mnt_fsname); |