/tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_multi_mount.ksh

https://github.com/adilger/zfs · Korn Shell · 109 lines · 58 code · 14 blank · 37 comment · 12 complexity · 6009987dc49a7602062a3de3e112ed45 MD5 · raw file

  1. #!/bin/ksh -p
  2. #
  3. # CDDL HEADER START
  4. #
  5. # This file and its contents are supplied under the terms of the
  6. # Common Development and Distribution License ("CDDL"), version 1.0.
  7. # You may only use this file in accordance with the terms of version
  8. # 1.0 of the CDDL.
  9. #
  10. # A full copy of the text of the CDDL should have accompanied this
  11. # source. A copy is of the CDDL is also available via the Internet
  12. # at http://www.illumos.org/license/CDDL.
  13. #
  14. # CDDL HEADER END
  15. #
  16. #
  17. # Copyright(c) 2018 Datto Inc.
  18. #
  19. . $STF_SUITE/include/libtest.shlib
  20. #
  21. # DESCRIPTION:
  22. # Verify multi mount functionality
  23. #
  24. # STRATEGY:
  25. # 1. Create fs
  26. # 2. Create and hold open file in filesystem
  27. # 3. Lazy unmount
  28. # 4. Verify remounting fs that was lazily unmounted is possible
  29. # 5. Verify multiple mounts of the same dataset are possible
  30. # 6. Verify bind mount doesn't prevent rename
  31. #
  32. verify_runnable "both"
  33. function cleanup
  34. {
  35. ismounted $MNTPFS && log_must umount $MNTPFS
  36. ismounted $MNTPFS2 && log_must umount $MNTPFS2
  37. ismounted $MNTPFS3 && log_must umount $MNTPFS3
  38. ismounted $MNTPFS4 && log_must umount $MNTPFS4
  39. ismounted $RENAMEMNT && log_must umount $RENAMEMNT
  40. datasetexists $TESTDS && log_must destroy_dataset "$TESTDS" "-f"
  41. }
  42. log_onexit cleanup
  43. log_assert "Verify multiple mounts into one namespace are possible"
  44. # 1. Create fs
  45. TESTDS="$TESTPOOL/multi-mount-test"
  46. log_must zfs create $TESTDS
  47. # 2. Create and hold open file in filesystem
  48. MNTPFS="$(get_prop mountpoint $TESTDS)"
  49. FILENAME="$MNTPFS/file"
  50. log_must mkfile 128k $FILENAME
  51. log_must exec 9<> $FILENAME # open file
  52. # 3. Lazy umount
  53. if is_freebsd; then
  54. # FreeBSD does not support lazy unmount
  55. log_must umount $MNTPFS
  56. else
  57. log_must umount -l $MNTPFS
  58. fi
  59. if [ -f $FILENAME ]; then
  60. log_fail "Lazy unmount failed"
  61. fi
  62. # 4. Verify remounting fs that was lazily unmounted is possible
  63. log_must zfs mount $TESTDS
  64. if [ ! -f $FILENAME ]; then
  65. log_fail "Lazy remount failed"
  66. fi
  67. log_must exec 9>&- # close fd
  68. # 5. Verify multiple mounts of the same dataset are possible
  69. MNTPFS2="$MNTPFS-second"
  70. FILENAME="$MNTPFS2/file"
  71. log_must mkdir $MNTPFS2
  72. log_must mount -t zfs -o zfsutil $TESTDS $MNTPFS2
  73. if [ ! -f $FILENAME ]; then
  74. log_fail "First multi mount failed"
  75. fi
  76. MNTPFS3="$MNTPFS-third"
  77. FILENAME="$MNTPFS3/file"
  78. log_must mkdir $MNTPFS3
  79. log_must mount -t zfs -o zfsutil $TESTDS $MNTPFS3
  80. if [ ! -f $FILENAME ]; then
  81. log_fail "Second multi mount failed"
  82. fi
  83. # 6. Verify bind mount doesn't prevent rename
  84. RENAMEFS="$TESTDS-newname"
  85. MNTPFS4="$MNTPFS-fourth"
  86. log_must mkdir $MNTPFS4
  87. log_must mount --bind $MNTPFS $MNTPFS4
  88. log_must zfs rename $TESTDS $RENAMEFS
  89. RENAMEMNT="$(get_prop mountpoint $RENAMEFS)"
  90. FILENAME="$RENAMEMNT/file"
  91. if [ ! -f $FILENAME ]; then
  92. log_fail "Rename failed"
  93. fi
  94. log_must zfs rename $RENAMEFS $TESTDS
  95. log_pass "Multiple mounts are possible"