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