diff options
author | David Zeuthen <davidz@redhat.com> | 2012-01-26 11:04:47 -0500 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2012-01-26 11:04:47 -0500 |
commit | 830e829cc595a1889dbf7b89536ab5dbecd67273 (patch) | |
tree | 1d22ae14572aabf68fc78292854cb5928ce7eba2 /src/udiskslinuxdrive.c | |
parent | efe3128b588d66f7a3ffa66edb32fc5d211af226 (diff) |
Make sure that Drive:SortKey sorts e.g. sdz before sdaa
Also make sure that we e.g. process sdb before sdad to get
Drive:SortKey set using sdb rather than sdad.
With this change we get the expected output that corresponds to kernel
probing order. Which (on good days) may correspond to slot and
enclosure order.
MODEL REVISION SERIAL DEVICE
--------------------------------------------------------------------------
HP LOGICAL VOLUME 3.00 5001438008F61790 sda
SEAGATE ST3300657SS 0006 3SJ1S7K600009051M0CE sdad sdb
SEAGATE ST3300657SS 0006 3SJ1S4MH00009052RG6Z sdae sdc
SEAGATE ST3300657SS 0006 3SJ1RFP900009051HZ5S sdaf sdd
SEAGATE ST3300657SS 0006 3SJ1S66L00009052QGZA sdag sde
SEAGATE ST3300657SS 0006 3SJ1RPFJ00009052BZ10 sdah sdf
SEAGATE ST3300657SS 0006 3SJ1RWZ100009101T12H sdai sdg
SEAGATE ST3300657SS 0006 3SJ1S7C500009052RKPP sdaj sdh
SEAGATE ST3300657SS 0006 3SJ1S40K00009101T1XU sdak sdi
SEAGATE ST3300657SS 0006 3SJ1RJS700009050VYEA sdal sdj
SEAGATE ST3300657SS 0006 3SJ1RSJC00009052MWTB sdam sdk
SEAGATE ST3300657SS 0006 3SJ1QNMQ00009052NECM sdan sdl
SEAGATE ST3300657SS 0006 3SJ1S3NE00009101TB5Y sdao sdm
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30012560 sdn
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30064749 sdo
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30039741 sdp
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30064055 sdq
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30030732 sdr
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30010853 sds
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30024753 sdt
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30065104 sdu
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30031826 sdv
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30025874 sdw
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30063724 sdx
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30064486 sdy
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30032003 sdz
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30021345 sdaa
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30067287 sdab
WDC WD1002FAEX-00Y9A0 01.01V10 WD-WCAW30014347 sdac
Signed-off-by: David Zeuthen <davidz@redhat.com>
Diffstat (limited to 'src/udiskslinuxdrive.c')
-rw-r--r-- | src/udiskslinuxdrive.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/udiskslinuxdrive.c b/src/udiskslinuxdrive.c index 46e3e4e..eb2ca08 100644 --- a/src/udiskslinuxdrive.c +++ b/src/udiskslinuxdrive.c @@ -402,6 +402,30 @@ set_media_time_detected (UDisksLinuxDrive *drive, udisks_drive_set_time_media_detected (iface, drive->time_media_detected); } +static gchar * +append_fixedup_sd (const gchar *prefix, + const gchar *device_name) +{ + guint num_alphas, n; + GString *str; + + g_return_val_if_fail (g_str_has_prefix (device_name, "sd"), NULL); + + /* make sure sdaa comes after e.g. sdz by inserting up to 5 '_' characters + * between sd and a in sda... + */ + for (num_alphas = 0; g_ascii_isalpha (device_name[num_alphas + 2]); num_alphas++) + ; + str = g_string_new (prefix); + g_string_append (str, "sd"); + for (n = 0; n < 5 - num_alphas; n++) + g_string_append_c (str, '_'); + + g_string_append (str, device_name + 2); + + return g_string_free (str, FALSE); +} + /** * udisks_linux_drive_update: * @drive: A #UDisksLinuxDrive. @@ -606,15 +630,28 @@ udisks_linux_drive_update (UDisksLinuxDrive *drive, { /* make sure fd* BEFORE sr* BEFORE sd* */ if (g_str_has_prefix (device_name, "fd")) - drive->sort_key = g_strdup_printf ("00coldplug/10removable/%s", device_name); + { + drive->sort_key = g_strdup_printf ("00coldplug/10removable/%s", device_name); + } else if (g_str_has_prefix (device_name, "sr")) - drive->sort_key = g_strdup_printf ("00coldplug/11removable/%s", device_name); + { + drive->sort_key = g_strdup_printf ("00coldplug/11removable/%s", device_name); + } + else if (g_str_has_prefix (device_name, "sd")) + { + drive->sort_key = append_fixedup_sd ("00coldplug/12removable/", device_name); + } else - drive->sort_key = g_strdup_printf ("00coldplug/12removable/%s", device_name); + { + drive->sort_key = g_strdup_printf ("00coldplug/12removable/%s", device_name); + } } else { - drive->sort_key = g_strdup_printf ("00coldplug/00fixed/%s", device_name); + if (g_str_has_prefix (device_name, "sd")) + drive->sort_key = append_fixedup_sd ("00coldplug/00fixed/", device_name); + else + drive->sort_key = g_strdup_printf ("00coldplug/00fixed/%s", device_name); } } else |