Skip to contentSkip to conversation

xfstests: test EROFS vs. EEXIST when creating on an RO filesystem

PATCH In review Eric Sandeen 4 participants 7 messages Nov 27, 2012 – Nov 28, 2012

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xfstests: test EROFS vs. EEXIST when creating on an RO filesystem

TBH, I don't know if this is posix-specified, but I found out the hard way that when trying to re-create existing files on a readonly filesystem, some apps expect/handle EEXIST, but fail on EROFS.

This will test mkdir, mknod, and symlinks for that behavior.

---

Note: Think the command output is fixed enough, or should I be grepping for keywords?

292 new file +73 -0
new file mode 100755
index 0000000..a14bb7f
@@ -0,0 +1,73 @@
+#! /bin/bash
+# FS QA Test No. 292
+#
+# Tests for EEXIST (not EROFS) for inode creations, if
+# we ask to create an already-existing entity on an RO filesystem
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2012 Red Hat, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+# creator
[email protected]
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+    cd /
+    rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+
+THIS_TEST_DIR=$SCRATCH_MNT/$seq.test
+
+_create_files()
+{
+	mknod $THIS_TEST_DIR/testnode c 1 3
+	mkdir $THIS_TEST_DIR/testdir
+	touch $THIS_TEST_DIR/testtarget
+	ln -s $THIS_TEST_DIR/testtarget $THIS_TEST_DIR/testlink
+}
+
+_scratch_mount
+
+rm -rf $THIS_TEST_DIR
+mkdir $THIS_TEST_DIR || _fail "Could not create dir for test"
+
+_create_files 2>&1 | _filter_scratch
+_scratch_mount -o remount,ro || _fail "Could not remount scratch readonly"
+_create_files 2>&1 | _filter_scratch
+
+# success, all done
+status=0
+exit
292.out new file +5 -0
new file mode 100644
index 0000000..485c567
@@ -0,0 +1,5 @@
+QA output created by 292
+mknod: `SCRATCH_MNT/292.test/testnode': File exists
+mkdir: cannot create directory `SCRATCH_MNT/292.test/testdir': File exists
+touch: cannot touch `SCRATCH_MNT/292.test/testtarget': Read-only file system
+ln: creating symbolic link `SCRATCH_MNT/292.test/testlink': File exists
group +1 -0
index dc8db65..030082b 100644
@@ -410,3 +410,4 @@ deprecated
 289 auto quick
 290 auto rw prealloc quick ioctl
 291 repair
+292 auto quick

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#1 lore raw
Quoted 11 lines · Eric Sandeen

TBH, I don't know if this is posix-specified, but I found out the hard way that when trying to re-create existing files on a readonly filesystem, some apps expect/handle EEXIST, but fail on EROFS.

This will test mkdir, mknod, and symlinks for that behavior.

---

Note: Think the command output is fixed enough, or should I be grepping for keywords?

Command output is good enough at this point.

Quoted 49 lines
292 new file +42 -0
new file mode 100755
index 0000000..a14bb7f
@@ -0,0 +1,73 @@
+#! /bin/bash
+# FS QA Test No. 292
+#
+# Tests for EEXIST (not EROFS) for inode creations, if
+# we ask to create an already-existing entity on an RO filesystem
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2012 Red Hat, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+# creator
[email protected]
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+    cd /
+    rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common.rc

292 line 52

Quoted 10 lines
292 new file +10 -0
+. ./common.filter
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+
+THIS_TEST_DIR=$SCRATCH_MNT/$seq.test

Confusing. $TEST_DIR is test filesystem mount point. This points something very similarly names at the scratch filesystem....

292 line 62

Quoted 9 lines
292 new file +9 -0
+_create_files()
+{
+	mknod $THIS_TEST_DIR/testnode c 1 3
+	mkdir $THIS_TEST_DIR/testdir
+	touch $THIS_TEST_DIR/testtarget
+	ln -s $THIS_TEST_DIR/testtarget $THIS_TEST_DIR/testlink
+}
+
+_scratch_mount

You need to mkfs the scratch device before using it. There is no guarantee that it is inmountable shape, or even contains the right filesytsem type when the test starts.

292 line 65

Quoted 3 lines
292 new file +3 -0
+
+rm -rf $THIS_TEST_DIR
+mkdir $THIS_TEST_DIR || _fail "Could not create dir for test"

The error will dump into the output file and fail the golden output match. Using _fail means there's no .out.bad file for analysis of the failure.

292 line 68

Quoted 3 lines
292 new file +3 -0
+
+_create_files 2>&1 | _filter_scratch
+_scratch_mount -o remount,ro || _fail "Could not remount scratch readonly"

Ditto.

Otherwise looks OK.

Cheers,

Dave.

Signature · 7 lines
Dave Chinner
[email protected]

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
#2 lore raw
Quoted 69 lines · Dave Chinner
Quoted 11 lines · Eric Sandeen

TBH, I don't know if this is posix-specified, but I found out the hard way that when trying to re-create existing files on a readonly filesystem, some apps expect/handle EEXIST, but fail on EROFS.

This will test mkdir, mknod, and symlinks for that behavior.

---

Note: Think the command output is fixed enough, or should I be grepping for keywords?

Command output is good enough at this point.

Quoted 54 lines
292 new file +47 -0
new file mode 100755
index 0000000..a14bb7f
@@ -0,0 +1,73 @@
+#! /bin/bash
+# FS QA Test No. 292
+#
+# Tests for EEXIST (not EROFS) for inode creations, if
+# we ask to create an already-existing entity on an RO filesystem
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2012 Red Hat, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+# creator
[email protected]
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+    cd /
+    rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+# real QA test starts here
+
+# Modify as appropriate.
Quoted 8 lines

292 line 52

Quoted 5 lines
292 new file +5 -0
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+
+THIS_TEST_DIR=$SCRATCH_MNT/$seq.test

Confusing. $TEST_DIR is test filesystem mount point. This points something very similarly names at the scratch filesystem....

Meh, ok. $FOZZIE_BEAR_DIR or something; I'll change it.

Quoted 9 lines

292 line 62

Quoted 9 lines
292 new file +9 -0
+_create_files()
+{
+	mknod $THIS_TEST_DIR/testnode c 1 3
+	mkdir $THIS_TEST_DIR/testdir
+	touch $THIS_TEST_DIR/testtarget
+	ln -s $THIS_TEST_DIR/testtarget $THIS_TEST_DIR/testlink
+}
+
+_scratch_mount

Sigh, right. I started w/ the test dev but I'm not sure there's a simple helper to remount it ro, so I was lazy. Then forgot to add this.

Quoted 12 lines

You need to mkfs the scratch device before using it. There is no guarantee that it is inmountable shape, or even contains the right filesytsem type when the test starts.

292 line 65

Quoted 3 lines
292 new file +3 -0
+
+rm -rf $THIS_TEST_DIR
+mkdir $THIS_TEST_DIR || _fail "Could not create dir for test"

The error will dump into the output file and fail the golden output match. Using _fail means there's no .out.bad file for analysis of the failure.

Quoted 5 lines

292 line 68

Quoted 3 lines
292 new file +3 -0
+
+_create_files 2>&1 | _filter_scratch
+_scratch_mount -o remount,ro || _fail "Could not remount scratch readonly"

Ditto.

OK.

Thanks,
-Eric

Quoted 6 lines

Otherwise looks OK.

Cheers,

Dave.

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#3 lore raw
In reply to Eric Sandeen
Quoted 5 lines · Eric Sandeen

TBH, I don't know if this is posix-specified, but I found out the hard way that when trying to re-create existing files on a readonly filesystem, some apps expect/handle EEXIST, but fail on EROFS.

This will test mkdir, mknod, and symlinks for that behavior.

Just curious, which filesystem would fail this currently or did in the past?

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#4 lore raw
Quoted 9 lines · Christoph Hellwig
Quoted 5 lines · Eric Sandeen

TBH, I don't know if this is posix-specified, but I found out the hard way that when trying to re-create existing files on a readonly filesystem, some apps expect/handle EEXIST, but fail on EROFS.

This will test mkdir, mknod, and symlinks for that behavior.

Just curious, which filesystem would fail this currently or did in the past?

No single filesystem, really -

I temporarily broke the VFS in a rhel backport. ;) But it seems like the kind of thing that could be missed in the future, so figured it was worth a quick test.

(basically this was from moving mnt_want_write outside i_mutex for freeze work, and returning an error directly from mnt_want_write() would give us EROFS instead of maybe EEXIST)

-Eric

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#5 lore raw
Quoted 5 lines · Eric Sandeen

No single filesystem, really -

I temporarily broke the VFS in a rhel backport. ;) But it seems like the kind of thing that could be missed in the future, so figured it was worth a quick test.

That's what I wonder about, I was pretty sure we'd normmally do these checks in the VFS, and I haven't seen any reason changes from you in the area.

I'm fine with adding this test, btw.

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#6 lore raw

PATCH v2 1/1 xfstests: test EROFS vs. EEXIST when creating on an RO filesystem

In reply to Eric Sandeen

TBH, I don't know if this is posix-specified, but I found out the hard way that when trying to re-create existing files on a readonly filesystem, some apps expect/handle EEXIST, but fail on EROFS.

This will test mkdir, mknod, and symlinks for that behavior.

---

V2: Change test dir var name, do scratch mkfs, drop _fail

292 new file +74 -0
new file mode 100755
index 0000000..4f0cc87
@@ -0,0 +1,74 @@
+#! /bin/bash
+# FS QA Test No. 292
+#
+# Tests for EEXIST (not EROFS) for inode creations, if
+# we ask to create an already-existing entity on an RO filesystem
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2012 Red Hat, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+# creator
[email protected]
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+    cd /
+    rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+
+MYDIR=$SCRATCH_MNT/$seq.test
+
+_create_files()
+{
+	mknod $MYDIR/testnode c 1 3
+	mkdir $MYDIR/testdir
+	touch $MYDIR/testtarget
+	ln -s $MYDIR/testtarget $MYDIR/testlink
+}
+
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+
+rm -rf $MYDIR
+mkdir $MYDIR
+
+_create_files 2>&1 | _filter_scratch
+_scratch_mount -o remount,ro
+_create_files 2>&1 | _filter_scratch
+
+# success, all done
+status=0
+exit
292.out new file +5 -0
new file mode 100644
index 0000000..485c567
@@ -0,0 +1,5 @@
+QA output created by 292
+mknod: `SCRATCH_MNT/292.test/testnode': File exists
+mkdir: cannot create directory `SCRATCH_MNT/292.test/testdir': File exists
+touch: cannot touch `SCRATCH_MNT/292.test/testtarget': Read-only file system
+ln: creating symbolic link `SCRATCH_MNT/292.test/testlink': File exists
group +1 -0
index dc8db65..030082b 100644
@@ -410,3 +410,4 @@ deprecated
 289 auto quick
 290 auto rw prealloc quick ioctl
 291 repair
+292 auto quick

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs