summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pitt <martin.pitt@ubuntu.com>2015-03-01 16:35:42 +0100
committerMartin Pitt <martin.pitt@ubuntu.com>2015-03-01 16:35:42 +0100
commit6c27890287f0b86a8bc6aa6b46e7c6a573898164 (patch)
tree34cba9c585079850cf9cef14a0dadf5fd9fea691
parent72838fea395bade4d2a0bd13410478cda27906ef (diff)
Recognize PARTUUID and PARTLABEL in fstab
https://bugs.freedesktop.org/show_bug.cgi?id=88923
-rwxr-xr-xsrc/tests/integration-test29
-rw-r--r--src/udiskslinuxblock.c26
-rw-r--r--src/udiskslinuxfilesystem.c8
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);