return rc == 0 && dg > 0;
}
+
+static int uniq_fs_target_cmp(
+ struct libmnt_table *tb __attribute__((__unused__)),
+ struct libmnt_fs *a,
+ struct libmnt_fs *b)
+{
+ return !mnt_fs_streq_target(a, mnt_fs_get_target(b));
+}
+
/*
* fstrim --all follows "mount -a" return codes:
*
struct sysfs_cxt wholedisk = UL_SYSFSCXT_EMPTY;
int cnt = 0, cnt_err = 0;
+ mnt_init_debug(0);
+
itr = mnt_new_iter(MNT_ITER_BACKWARD);
if (!itr)
err(MOUNT_EX_FAIL, _("failed to initialize libmount iterator"));
if (!tab)
err(MOUNT_EX_FAIL, _("failed to parse %s"), _PATH_PROC_MOUNTINFO);
+ /* de-duplicate the table */
+ mnt_table_uniq_fs(tab, 0, uniq_fs_target_cmp);
+
while (mnt_table_next_fs(tab, itr, &fs) == 0) {
const char *src = mnt_fs_get_srcpath(fs),
*tgt = mnt_fs_get_target(fs);
}
sysfs_deinit(&wholedisk);
- mnt_free_table(tab);
+ mnt_unref_table(tab);
if (cnt && cnt == cnt_err)
return MOUNT_EX_FAIL; /* all failed */