diff --git a/man/homectl.xml b/man/homectl.xml index 4c792ca8cb..dd16e47beb 100644 --- a/man/homectl.xml +++ b/man/homectl.xml @@ -566,10 +566,13 @@ Takes a file system path. Configures where to place the user's home directory. When LUKS2 storage is used refers to the path to the loopback file, otherwise to the path to the home - directory. When unspecified defaults to /home/$USER.home when LUKS storage is - used and /home/$USER.homedir for the other storage mechanisms. Not defined for - the cifs storage mechanism. To use LUKS2 storage on a regular block device (for - example a USB stick) pass the path to the block device here. + directory (which may be in /home/ or any other accessible filesystem). When + unspecified defaults to /home/$USER.home when LUKS storage is used and + /home/$USER.homedir for the other storage mechanisms. Not defined for the + cifs storage mechanism. To use LUKS2 storage on a regular block device (for + example a USB stick) pass the path to the block device here. Specifying the path to a directory here + when using LUKS2 storage is not allowed. Similar, specifying the path to a regular file or device + node is not allowed if any of the other storage backends are used. diff --git a/src/home/homed-home.c b/src/home/homed-home.c index 5504173545..e4757c724a 100644 --- a/src/home/homed-home.c +++ b/src/home/homed-home.c @@ -1280,15 +1280,22 @@ int home_create(Home *h, UserRecord *secret, sd_bus_error *error) { assert(h); switch (home_get_state(h)) { - case HOME_INACTIVE: + case HOME_INACTIVE: { + int t; + if (h->record->storage < 0) break; /* if no storage is defined we don't know what precisely to look for, hence * HOME_INACTIVE is OK in that case too. */ - if (IN_SET(user_record_test_image_path(h->record), USER_TEST_MAYBE, USER_TEST_UNDEFINED)) + t = user_record_test_image_path(h->record); + if (IN_SET(t, USER_TEST_MAYBE, USER_TEST_UNDEFINED)) break; /* And if the image path test isn't conclusive, let's also go on */ - _fallthrough_; + if (IN_SET(t, -EBADFD, -ENOTDIR)) + return sd_bus_error_setf(error, BUS_ERROR_HOME_EXISTS, "Selected home image of user %s already exists or has wrong inode type.", h->user_name); + + return sd_bus_error_setf(error, BUS_ERROR_HOME_EXISTS, "Selected home image of user %s already exists.", h->user_name); + } case HOME_UNFIXATED: case HOME_DIRTY: return sd_bus_error_setf(error, BUS_ERROR_HOME_EXISTS, "Home of user %s already exists.", h->user_name);