Fix zfs-mount-generator for datasets with spaces

Alternative implementation of @rlaager's original modification
of zfs-mount-generator fix, with @chrisrd's comments. Set
IFS to be only the tab character, matching our `-H` call in
`zfs list`, allowing spaces to appear in dataset names (and
mountpoints).

Also adds comments explaining our rationale.

Reviewed-by: Chris Dunlop <chris@onthe.net.au>
Reviewed-by: Richard Laager <rlaager@wiktel.com>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Signed-off-by: Antonio Russo <antonio.e.russo@gmail.com>
Closes #8708 
Closes #8718
This commit is contained in:
Antonio Russo 2019-05-07 12:32:23 -04:00 committed by Brian Behlendorf
parent bca06413f7
commit 6aff30ad80
1 changed files with 11 additions and 6 deletions

View File

@ -22,7 +22,7 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
set -ef set -e
FSLIST="@sysconfdir@/zfs/zfs-list.cache" FSLIST="@sysconfdir@/zfs/zfs-list.cache"
@ -55,7 +55,12 @@ mkdir -p "${req_dir}"
process_line() { process_line() {
# -o name # zfs list -H -o name,...
# fields are tab separated
IFS="$(printf '\t')"
# protect against special characters in, e.g., mountpoints
set -f
set -- $1
dataset="${1}" dataset="${1}"
p_mountpoint="${2}" p_mountpoint="${2}"
p_canmount="${3}" p_canmount="${3}"
@ -175,7 +180,7 @@ process_line() {
# Automatically generated by zfs-mount-generator # Automatically generated by zfs-mount-generator
[Unit] [Unit]
SourcePath=${FSLIST}/${cachefile} SourcePath=${cachefile}
Documentation=man:zfs-mount-generator(8) Documentation=man:zfs-mount-generator(8)
Before=local-fs.target zfs-mount.service Before=local-fs.target zfs-mount.service
After=zfs-import.target After=zfs-import.target
@ -193,8 +198,8 @@ EOF
} }
# Feed each line into process_line # Feed each line into process_line
for cachefile in $(ls "${FSLIST}") ; do for cachefile in "${FSLIST}/"* ; do
while read -r fs ; do while read -r fs ; do
process_line $fs process_line "${fs}"
done < "${FSLIST}/${cachefile}" done < "${cachefile}"
done done