Module Name: src Committed By: chs Date: Sun Jul 26 00:21:24 UTC 2020
Modified Files: src/sys/ufs/ffs: ffs_inode.c src/sys/ufs/ufs: ufs_inode.c Log Message: pull in a bit more FreeBSD code to allow specifying truncation of the regular bmap (IO_NORMAL) independently of the extattr bmap (IO_EXT). fixes fs corruption when removing extattrs in UFS2. To generate a diff of this commit: cvs rdiff -u -r1.129 -r1.130 src/sys/ufs/ffs/ffs_inode.c cvs rdiff -u -r1.110 -r1.111 src/sys/ufs/ufs/ufs_inode.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/ffs/ffs_inode.c diff -u src/sys/ufs/ffs/ffs_inode.c:1.129 src/sys/ufs/ffs/ffs_inode.c:1.130 --- src/sys/ufs/ffs/ffs_inode.c:1.129 Sat May 2 22:11:16 2020 +++ src/sys/ufs/ffs/ffs_inode.c Sun Jul 26 00:21:24 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_inode.c,v 1.129 2020/05/02 22:11:16 christos Exp $ */ +/* $NetBSD: ffs_inode.c,v 1.130 2020/07/26 00:21:24 chs Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.129 2020/05/02 22:11:16 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.130 2020/07/26 00:21:24 chs Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -232,6 +232,14 @@ ffs_truncate(struct vnode *ovp, off_t le if (length < 0) return (EINVAL); + /* + * Historically clients did not have to specify which data + * they were truncating. So, if not specified, we assume + * traditional behavior, e.g., just the normal data. + */ + if ((ioflag & (IO_EXT | IO_NORMAL)) == 0) + ioflag |= IO_NORMAL; + fs = oip->i_fs; #define i_din2 i_din.ffs2_din extblocks = 0; @@ -267,6 +275,8 @@ ffs_truncate(struct vnode *ovp, off_t le extblocks = 0; } } + if ((ioflag & IO_NORMAL) == 0) + return (0); if (ovp->v_type == VLNK && (oip->i_size < ump->um_maxsymlinklen || (ump->um_maxsymlinklen == 0 && datablocks == 0))) { @@ -376,8 +386,7 @@ ffs_truncate(struct vnode *ovp, off_t le } } - if (!(ioflag & IO_EXT)) - genfs_node_wrlock(ovp); + genfs_node_wrlock(ovp); oip->i_size = length; DIP_ASSIGN(oip, size, length); uvm_vnp_setsize(ovp, length); @@ -586,8 +595,7 @@ out: oip->i_size = length; DIP_ASSIGN(oip, size, length); DIP_ADD(oip, blocks, -blocksreleased); - if (!(ioflag & IO_EXT)) - genfs_node_unlock(ovp); + genfs_node_unlock(ovp); oip->i_flag |= IN_CHANGE; UFS_WAPBL_UPDATE(ovp, NULL, NULL, 0); #if defined(QUOTA) || defined(QUOTA2) Index: src/sys/ufs/ufs/ufs_inode.c diff -u src/sys/ufs/ufs/ufs_inode.c:1.110 src/sys/ufs/ufs/ufs_inode.c:1.111 --- src/sys/ufs/ufs/ufs_inode.c:1.110 Sat Apr 18 19:18:34 2020 +++ src/sys/ufs/ufs/ufs_inode.c Sun Jul 26 00:21:24 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_inode.c,v 1.110 2020/04/18 19:18:34 christos Exp $ */ +/* $NetBSD: ufs_inode.c,v 1.111 2020/07/26 00:21:24 chs Exp $ */ /* * Copyright (c) 1991, 1993 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.110 2020/04/18 19:18:34 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.111 2020/07/26 00:21:24 chs Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -327,5 +327,5 @@ ufs_truncate_all(struct vnode *vp) if (isize == 0) return 0; - return ufs_truncate_retry(vp, IO_EXT, 0, NOCRED); + return ufs_truncate_retry(vp, IO_NORMAL | IO_EXT, 0, NOCRED); }