[RFC,2/8] lib/tst_test: Populate the read-only fs

Message ID 20180405140154.6218-3-chrubis@suse.cz
State Accepted
Headers show
Series
  • [RFC,1/8] lib/tst_test.c: mntpoint implies tmpdir
Related show

Commit Message

Cyril Hrubis April 5, 2018, 2:01 p.m.
Populate the read only filesystem with a file and a directory.

This is needed for a testing syscalls such as unlink() or rmdir() for
EROFS error.

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 lib/tst_test.c | 45 ++++++++++++++++++++++++++++++++++++---------
 1 file changed, 36 insertions(+), 9 deletions(-)

Comments

Cyril Hrubis April 18, 2018, 2:29 p.m. | #1
Hi!
Ping? Anyone to review this patchset?

I would like to have this included in the upcomming release...
Petr Vorel April 23, 2018, 8:45 a.m. | #2
Hi Cyril,

> Populate the read only filesystem with a file and a directory.

> This is needed for a testing syscalls such as unlink() or rmdir() for
> EROFS error.

> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> ---

Whole patchset LGTM.

Tested-by: Petr Vorel <pvorel@suse.cz>


Kind regards,
Petr
Cyril Hrubis April 23, 2018, 1:59 p.m. | #3
Hi!
> Whole patchset LGTM.
> 
> Tested-by: Petr Vorel <pvorel@suse.cz>

Pushed, thanks.

Patch

diff --git a/lib/tst_test.c b/lib/tst_test.c
index 5e10460b0..3b9014487 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -695,6 +695,32 @@  static void assert_test_fn(void)
 		tst_brk(TBROK, "You can define tcnt only for test()");
 }
 
+static int prepare_and_mount_ro_fs(const char *dev,
+                                   const char *mntpoint,
+                                   const char *fs_type)
+{
+	char buf[PATH_MAX];
+
+	if (mount(dev, mntpoint, fs_type, 0, NULL)) {
+		tst_res(TINFO | TERRNO, "Can't mount %s at %s (%s)",
+			dev, mntpoint, fs_type);
+		return 1;
+	}
+
+	mntpoint_mounted = 1;
+
+	snprintf(buf, sizeof(buf), "%s/dir/", mntpoint);
+	SAFE_MKDIR(buf, 0777);
+
+	snprintf(buf, sizeof(buf), "%s/file", mntpoint);
+	SAFE_FILE_PRINTF(buf, "file content");
+	SAFE_CHMOD(buf, 0777);
+
+	SAFE_MOUNT(dev, mntpoint, fs_type, MS_REMOUNT | MS_RDONLY, NULL);
+
+	return 0;
+}
+
 static void prepare_device(void)
 {
 	if (tst_test->format_device) {
@@ -702,6 +728,12 @@  static void prepare_device(void)
 			  tst_test->dev_extra_opt);
 	}
 
+	if (tst_test->needs_rofs) {
+		prepare_and_mount_ro_fs(tdev.dev, tst_test->mntpoint,
+		                        tdev.fs_type);
+		return;
+	}
+
 	if (tst_test->mount_device) {
 		SAFE_MOUNT(tdev.dev, tst_test->mntpoint, tdev.fs_type,
 			   tst_test->mnt_flags, tst_test->mnt_data);
@@ -761,18 +793,13 @@  static void do_setup(int argc, char *argv[])
 
 	if (tst_test->needs_rofs) {
 		/* If we failed to mount read-only tmpfs. Fallback to
-		 * using a device with empty read-only filesystem.
+		 * using a device with read-only filesystem.
 		 */
-		if (mount(NULL, tst_test->mntpoint, "tmpfs", MS_RDONLY, NULL)) {
-			tst_res(TINFO | TERRNO, "Can't mount tmpfs read-only"
-				" at %s, setting up a device instead\n",
-				tst_test->mntpoint);
-			tst_test->mount_device = 1;
+		if (prepare_and_mount_ro_fs(NULL, tst_test->mntpoint, "tmpfs")) {
+			tst_res(TINFO, "Can't mount tmpfs read-only, "
+			        "falling back to block device...");
 			tst_test->needs_device = 1;
 			tst_test->format_device = 1;
-			tst_test->mnt_flags = MS_RDONLY;
-		} else {
-			mntpoint_mounted = 1;
 		}
 	}