mount-tool: some modernizations and log message tweaks

This commit is contained in:
Mike Yuan
2025-03-03 10:45:56 +01:00
parent 759fdb3a35
commit 70b1f3e0a2
+61 -70
View File
@@ -433,6 +433,10 @@ static int parse_argv(int argc, char *argv[]) {
"More than two arguments are not allowed.");
if (arg_tmpfs) {
if (arg_discover)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--discover cannot be used in conjunction with --tmpfs.");
if (argc <= optind+1) {
arg_mount_what = strdup("tmpfs");
if (!arg_mount_what)
@@ -447,9 +451,14 @@ static int parse_argv(int argc, char *argv[]) {
return log_oom();
}
if (!strv_contains(arg_property, "Type=tmpfs") &&
strv_extend(&arg_property, "Type=tmpfs") < 0)
return log_oom();
if (!arg_mount_type) {
arg_mount_type = strdup("tmpfs");
if (!arg_mount_type)
return log_oom();
} else if (!streq(arg_mount_type, "tmpfs"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"--tmpfs requested with incompatible --type=, refusing: %s",
arg_mount_type);
} else {
if (arg_mount_type && !fstype_is_blockdev_backed(arg_mount_type)) {
arg_mount_what = strdup(argv[optind]);
@@ -629,16 +638,15 @@ static int transient_automount_set_properties(sd_bus_message *m) {
return 0;
}
static int start_transient_mount(
sd_bus *bus,
char **argv) {
static int start_transient_mount(sd_bus *bus) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
_cleanup_free_ char *mount_unit = NULL;
int r;
assert(bus);
if (!arg_no_block) {
r = bus_wait_for_jobs_new(bus, &w);
if (r < 0)
@@ -671,7 +679,7 @@ static int start_transient_mount(
if (r < 0)
return bus_log_create_error(r);
/* Auxiliary units */
/* No auxiliary units */
r = sd_bus_message_append(m, "a(sa(sv))", 0);
if (r < 0)
return bus_log_create_error(r);
@@ -702,16 +710,15 @@ static int start_transient_mount(
return 0;
}
static int start_transient_automount(
sd_bus *bus,
char **argv) {
static int start_transient_automount(sd_bus *bus) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
_cleanup_free_ char *automount_unit = NULL, *mount_unit = NULL;
int r;
assert(bus);
if (!arg_no_block) {
r = bus_wait_for_jobs_new(bus, &w);
if (r < 0)
@@ -807,7 +814,7 @@ static int start_transient_automount(
return 0;
}
static int find_mount_points(const char *what, char ***list) {
static int find_mount_points_by_source(const char *what, char ***ret) {
_cleanup_(mnt_free_tablep) struct libmnt_table *table = NULL;
_cleanup_(mnt_free_iterp) struct libmnt_iter *iter = NULL;
_cleanup_strv_free_ char **l = NULL;
@@ -815,10 +822,10 @@ static int find_mount_points(const char *what, char ***list) {
int r;
assert(what);
assert(list);
assert(ret);
/* Returns all mount points obtained from /proc/self/mountinfo in *list,
* and the number of mount points as return value. */
/* Obtain all mount points with source being "what" from /proc/self/mountinfo, return value shows
* the total number of them. */
r = libmount_parse_mountinfo(/* source = */ NULL, &table, &iter);
if (r < 0)
@@ -842,20 +849,12 @@ static int find_mount_points(const char *what, char ***list) {
if (!path_equal(source, what))
continue;
/* one extra slot is needed for the terminating NULL */
if (!GREEDY_REALLOC0(l, n + 2))
r = strv_extend_with_size(&l, &n, target);
if (r < 0)
return log_oom();
l[n] = strdup(target);
if (!l[n])
return log_oom();
n++;
}
if (!GREEDY_REALLOC0(l, n + 1))
return log_oom();
*list = TAKE_PTR(l);
*ret = TAKE_PTR(l);
return n;
}
@@ -905,17 +904,17 @@ static int find_loop_device(const char *backing_file, sd_device **ret) {
return -ENXIO;
}
static int stop_mount(
sd_bus *bus,
const char *where,
const char *suffix) {
static int stop_mount(sd_bus *bus, const char *where, const char *suffix) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
_cleanup_free_ char *mount_unit = NULL;
int r;
assert(bus);
assert(where);
assert(suffix);
if (!arg_no_block) {
r = bus_wait_for_jobs_new(bus, &w);
if (r < 0)
@@ -924,7 +923,7 @@ static int stop_mount(
r = unit_name_from_path(where, suffix, &mount_unit);
if (r < 0)
return log_error_errno(r, "Failed to make %s unit name from path %s: %m", suffix + 1, where);
return log_error_errno(r, "Failed to make %s unit name from path '%s': %m", suffix + 1, where);
r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, "StopUnit");
if (r < 0)
@@ -965,15 +964,15 @@ static int stop_mount(
return 0;
}
static int stop_mounts(
sd_bus *bus,
const char *where) {
static int stop_mounts(sd_bus *bus, const char *where) {
int r;
assert(bus);
assert(where);
if (path_equal(where, "/"))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Refusing to operate on root directory: %s", where);
"Refusing to unmount root directory.");
if (!path_is_normalized(where))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
@@ -1005,15 +1004,12 @@ static int umount_by_device(sd_bus *bus, sd_device *dev) {
if (r < 0)
return r;
r = find_mount_points(v, &list);
r = find_mount_points_by_source(v, &list);
if (r < 0)
return r;
STRV_FOREACH(l, list) {
r = stop_mounts(bus, *l);
if (r < 0)
ret = r;
}
STRV_FOREACH(l, list)
RET_GATHER(ret, stop_mounts(bus, *l));
return ret;
}
@@ -1054,11 +1050,7 @@ static int umount_loop(sd_bus *bus, const char *backing_file) {
return umount_by_device(bus, dev);
}
static int action_umount(
sd_bus *bus,
int argc,
char **argv) {
static int action_umount(sd_bus *bus, int argc, char **argv) {
int r, ret = 0;
assert(bus);
@@ -1088,13 +1080,13 @@ static int action_umount(
_cleanup_close_ int fd = -EBADF;
r = chase(u, /* root= */ NULL, 0, &p, &fd);
if (r < 0) {
RET_GATHER(ret, log_error_errno(r, "Failed to make path %s absolute: %m", u));
RET_GATHER(ret, log_error_errno(r, "Failed to chase path '%s': %m", u));
continue;
}
struct stat st;
if (fstat(fd, &st) < 0)
return log_error_errno(errno, "Can't stat %s (from %s): %m", p, argv[i]);
return log_error_errno(errno, "Can't stat '%s' (from %s): %m", p, argv[i]);
r = is_mount_point_at(fd, /* filename= */ NULL, /* flags= */ 0);
fd = safe_close(fd); /* before continuing make sure the dir is not keeping anything busy */
@@ -1107,14 +1099,17 @@ static int action_umount(
if (r < 0)
log_warning_errno(r, "Failed to determine if '%s' is a mount point, ignoring: %m", u);
if (S_ISBLK(st.st_mode))
RET_GATHER(ret, umount_by_device_node(bus, p));
if (S_ISDIR(st.st_mode))
r = stop_mounts(bus, p);
else if (S_ISBLK(st.st_mode))
r = umount_by_device_node(bus, p);
else if (S_ISREG(st.st_mode))
RET_GATHER(ret, umount_loop(bus, p));
else if (S_ISDIR(st.st_mode))
RET_GATHER(ret, stop_mounts(bus, p));
r = umount_loop(bus, p);
else
RET_GATHER(ret, log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid file type: %s (from %s)", p, argv[i]));
r = log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Unknown file type for unmounting: %s (from %s)",
p, argv[i]);
RET_GATHER(ret, r);
}
}
@@ -1231,7 +1226,7 @@ static int acquire_mount_where_for_loop_dev(sd_device *dev) {
if (r < 0)
return r;
r = find_mount_points(node, &list);
r = find_mount_points_by_source(node, &list);
if (r < 0)
return r;
if (r == 0)
@@ -1282,6 +1277,8 @@ static int acquire_description(sd_device *d) {
static int acquire_removable(sd_device *d) {
const char *v;
assert(d);
/* Shortcut this if there's no reason to check it */
if (arg_action != ACTION_DEFAULT && arg_timeout_idle_set && arg_bind_device >= 0)
return 0;
@@ -1325,9 +1322,6 @@ static int discover_loop_backing_file(void) {
int r;
r = find_loop_device(arg_mount_what, &d);
if (r < 0 && r != -ENXIO)
return log_error_errno(errno, "Can't get loop device for %s: %m", arg_mount_what);
if (r == -ENXIO) {
_cleanup_free_ char *escaped = NULL, *bn = NULL;
@@ -1352,7 +1346,9 @@ static int discover_loop_backing_file(void) {
log_debug("Discovered where=%s", arg_mount_where);
return 0;
}
} else if (r < 0)
return log_error_errno(r, "Can't get loop device for %s: %m", arg_mount_what);
r = acquire_mount_type(d);
if (r < 0)
@@ -1387,8 +1383,7 @@ static int discover_device(void) {
if (!S_ISBLK(st.st_mode))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid file type: %s",
arg_mount_what);
"Unsupported mount source type for --discover: %s", arg_mount_what);
r = sd_device_new_from_stat_rdev(&d, &st);
if (r < 0)
@@ -1608,18 +1603,14 @@ static int run(int argc, char* argv[]) {
case ACTION_MOUNT:
case ACTION_DEFAULT:
r = start_transient_mount(bus, argv + optind);
break;
return start_transient_mount(bus);
case ACTION_AUTOMOUNT:
r = start_transient_automount(bus, argv + optind);
break;
return start_transient_automount(bus);
default:
assert_not_reached();
}
return r;
}
DEFINE_MAIN_FUNCTION(run);