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);