Module Name:    src
Committed By:   riastradh
Date:           Sat Mar 28 17:45:47 UTC 2015

Modified Files:
        src/sys/ufs/ext2fs: ext2fs_readwrite.c
        src/sys/ufs/lfs: ulfs_readwrite.c
        src/sys/ufs/ufs: ufs_readwrite.c
        src/tests/fs/vfs: t_io.c

Log Message:
Let I/O errors override inode update errors in UFS.

Fixes tests/fs/vfs/t_io:read_fault for UFS.


To generate a diff of this commit:
cvs rdiff -u -r1.72 -r1.73 src/sys/ufs/ext2fs/ext2fs_readwrite.c
cvs rdiff -u -r1.13 -r1.14 src/sys/ufs/lfs/ulfs_readwrite.c
cvs rdiff -u -r1.113 -r1.114 src/sys/ufs/ufs/ufs_readwrite.c
cvs rdiff -u -r1.14 -r1.15 src/tests/fs/vfs/t_io.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/ufs/ext2fs/ext2fs_readwrite.c
diff -u src/sys/ufs/ext2fs/ext2fs_readwrite.c:1.72 src/sys/ufs/ext2fs/ext2fs_readwrite.c:1.73
--- src/sys/ufs/ext2fs/ext2fs_readwrite.c:1.72	Sat Mar 28 17:23:42 2015
+++ src/sys/ufs/ext2fs/ext2fs_readwrite.c	Sat Mar 28 17:45:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_readwrite.c,v 1.72 2015/03/28 17:23:42 maxv Exp $	*/
+/*	$NetBSD: ext2fs_readwrite.c,v 1.73 2015/03/28 17:45:47 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_readwrite.c,v 1.72 2015/03/28 17:23:42 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_readwrite.c,v 1.73 2015/03/28 17:45:47 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -232,9 +232,10 @@ out:
 }
 
 static int
-ext2fs_post_read_update(struct vnode *vp, int ioflag, int error)
+ext2fs_post_read_update(struct vnode *vp, int ioflag, int oerror)
 {
 	struct inode *ip = VTOI(vp);
+	int error = oerror;
 
 	if (!(vp->v_mount->mnt_flag & MNT_NOATIME)) {
 		ip->i_flag |= IN_ACCESS;
@@ -242,6 +243,9 @@ ext2fs_post_read_update(struct vnode *vp
 			error = ext2fs_update(vp, NULL, NULL, UPDATE_WAIT);
 	}
 
+	/* Read error overrides any inode update error.  */
+	if (oerror)
+		error = oerror;
 	return error;
 }
 
@@ -434,9 +438,10 @@ ext2fs_bufwr(struct vnode *vp, struct ui
 
 static int
 ext2fs_post_write_update(struct vnode *vp, struct uio *uio, int ioflag,
-    kauth_cred_t cred, off_t osize, int resid, int extended, int error)
+    kauth_cred_t cred, off_t osize, int resid, int extended, int oerror)
 {
 	struct inode *ip = VTOI(vp);
+	int error = oerror;
 
 	/* Trigger ctime and mtime updates, and atime if MNT_RELATIME.  */
 	ip->i_flag |= IN_CHANGE | IN_UPDATE;
@@ -480,5 +485,8 @@ ext2fs_post_write_update(struct vnode *v
 	/* Make sure the vnode uvm size matches the inode file size.  */
 	KASSERT(vp->v_size == ext2fs_size(ip));
 
+	/* Write error overrides any inode update error.  */
+	if (oerror)
+		error = oerror;
 	return error;
 }

Index: src/sys/ufs/lfs/ulfs_readwrite.c
diff -u src/sys/ufs/lfs/ulfs_readwrite.c:1.13 src/sys/ufs/lfs/ulfs_readwrite.c:1.14
--- src/sys/ufs/lfs/ulfs_readwrite.c:1.13	Sat Mar 28 17:23:42 2015
+++ src/sys/ufs/lfs/ulfs_readwrite.c	Sat Mar 28 17:45:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_readwrite.c,v 1.13 2015/03/28 17:23:42 maxv Exp $	*/
+/*	$NetBSD: ulfs_readwrite.c,v 1.14 2015/03/28 17:45:47 riastradh Exp $	*/
 /*  from NetBSD: ufs_readwrite.c,v 1.105 2013/01/22 09:39:18 dholland Exp  */
 
 /*-
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: ulfs_readwrite.c,v 1.13 2015/03/28 17:23:42 maxv Exp $");
+__KERNEL_RCSID(1, "$NetBSD: ulfs_readwrite.c,v 1.14 2015/03/28 17:45:47 riastradh Exp $");
 
 #ifdef LFS_READWRITE
 #define	FS			struct lfs
@@ -227,9 +227,10 @@ BUFRD(struct vnode *vp, struct uio *uio,
 }
 
 static int
-ulfs_post_read_update(struct vnode *vp, int ioflag, int error)
+ulfs_post_read_update(struct vnode *vp, int ioflag, int oerror)
 {
 	struct inode *ip = VTOI(vp);
+	int error = oerror;
 
 	if (!(vp->v_mount->mnt_flag & MNT_NOATIME)) {
 		ip->i_flag |= IN_ACCESS;
@@ -238,6 +239,9 @@ ulfs_post_read_update(struct vnode *vp, 
 		}
 	}
 
+	/* Read error overrides any inode update error.  */
+	if (oerror)
+		error = oerror;
 	return error;
 }
 
@@ -584,9 +588,10 @@ BUFWR(struct vnode *vp, struct uio *uio,
 
 static int
 ulfs_post_write_update(struct vnode *vp, struct uio *uio, int ioflag,
-    kauth_cred_t cred, off_t osize, int resid, int extended, int error)
+    kauth_cred_t cred, off_t osize, int resid, int extended, int oerror)
 {
 	struct inode *ip = VTOI(vp);
+	int error = oerror;
 
 	/* Trigger ctime and mtime updates, and atime if MNT_RELATIME.  */
 	ip->i_flag |= IN_CHANGE | IN_UPDATE;
@@ -637,5 +642,8 @@ ulfs_post_write_update(struct vnode *vp,
 	/* Make sure the vnode uvm size matches the inode file size.  */
 	KASSERT(vp->v_size == ip->i_size);
 
+	/* Write error overrides any inode update error.  */
+	if (oerror)
+		error = oerror;
 	return error;
 }

Index: src/sys/ufs/ufs/ufs_readwrite.c
diff -u src/sys/ufs/ufs/ufs_readwrite.c:1.113 src/sys/ufs/ufs/ufs_readwrite.c:1.114
--- src/sys/ufs/ufs/ufs_readwrite.c:1.113	Sat Mar 28 17:23:42 2015
+++ src/sys/ufs/ufs/ufs_readwrite.c	Sat Mar 28 17:45:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_readwrite.c,v 1.113 2015/03/28 17:23:42 maxv Exp $	*/
+/*	$NetBSD: ufs_readwrite.c,v 1.114 2015/03/28 17:45:47 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: ufs_readwrite.c,v 1.113 2015/03/28 17:23:42 maxv Exp $");
+__KERNEL_RCSID(1, "$NetBSD: ufs_readwrite.c,v 1.114 2015/03/28 17:45:47 riastradh Exp $");
 
 #ifdef LFS_READWRITE
 #define	FS			struct lfs
@@ -238,21 +238,26 @@ BUFRD(struct vnode *vp, struct uio *uio,
 }
 
 static int
-ufs_post_read_update(struct vnode *vp, int ioflag, int error)
+ufs_post_read_update(struct vnode *vp, int ioflag, int oerror)
 {
 	struct inode *ip = VTOI(vp);
+	int error = oerror;
 
 	if (!(vp->v_mount->mnt_flag & MNT_NOATIME)) {
 		ip->i_flag |= IN_ACCESS;
 		if ((ioflag & IO_SYNC) == IO_SYNC) {
 			error = UFS_WAPBL_BEGIN(vp->v_mount);
 			if (error)
-				return error;
+				goto out;
 			error = UFS_UPDATE(vp, NULL, NULL, UPDATE_WAIT);
 			UFS_WAPBL_END(vp->v_mount);
 		}
 	}
 
+out:
+	/* Read error overrides any inode update error.  */
+	if (oerror)
+		error = oerror;
 	return error;
 }
 
@@ -614,9 +619,10 @@ BUFWR(struct vnode *vp, struct uio *uio,
 
 static int
 ufs_post_write_update(struct vnode *vp, struct uio *uio, int ioflag,
-    kauth_cred_t cred, off_t osize, int resid, int extended, int error)
+    kauth_cred_t cred, off_t osize, int resid, int extended, int oerror)
 {
 	struct inode *ip = VTOI(vp);
+	int error = oerror;
 
 	/* Trigger ctime and mtime updates, and atime if MNT_RELATIME.  */
 	ip->i_flag |= IN_CHANGE | IN_UPDATE;
@@ -666,5 +672,8 @@ ufs_post_write_update(struct vnode *vp, 
 	/* Make sure the vnode uvm size matches the inode file size.  */
 	KASSERT(vp->v_size == ip->i_size);
 
+	/* Write error overrides any inode update error.  */
+	if (oerror)
+		error = oerror;
 	return error;
 }

Index: src/tests/fs/vfs/t_io.c
diff -u src/tests/fs/vfs/t_io.c:1.14 src/tests/fs/vfs/t_io.c:1.15
--- src/tests/fs/vfs/t_io.c:1.14	Sat Mar 28 16:39:31 2015
+++ src/tests/fs/vfs/t_io.c	Sat Mar 28 17:45:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_io.c,v 1.14 2015/03/28 16:39:31 riastradh Exp $	*/
+/*	$NetBSD: t_io.c,v 1.15 2015/03/28 17:45:47 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -233,11 +233,7 @@ read_fault(const atf_tc_t *tc, const cha
 	ATF_REQUIRE_EQ(rump_sys_write(fd, &ch, 1), 1);
 	RL(rump_sys_close(fd));
 	RL(fd = rump_sys_open("file", O_RDONLY | O_SYNC | O_RSYNC));
-	if (FSTYPE_EXT2FS(tc) ||
-	    FSTYPE_FFS(tc) ||
-	    FSTYPE_FFSLOG(tc) ||
-	    FSTYPE_LFS(tc) ||
-	    FSTYPE_MSDOS(tc) ||
+	if (FSTYPE_MSDOS(tc) ||
 	    FSTYPE_SYSVBFS(tc))
 		atf_tc_expect_fail("bad sync atime update code path");
 	ATF_REQUIRE_ERRNO(EFAULT, rump_sys_read(fd, NULL, 1) == -1);

Reply via email to