Module Name:    src
Committed By:   christos
Date:           Wed Oct 29 01:13:28 UTC 2014

Modified Files:
        src/sys/ufs/ufs: ufs_extern.h ufs_inode.c ufs_vnops.c

Log Message:
simplify and correct.


To generate a diff of this commit:
cvs rdiff -u -r1.76 -r1.77 src/sys/ufs/ufs/ufs_extern.h
cvs rdiff -u -r1.91 -r1.92 src/sys/ufs/ufs/ufs_inode.c
cvs rdiff -u -r1.223 -r1.224 src/sys/ufs/ufs/ufs_vnops.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/ufs/ufs_extern.h
diff -u src/sys/ufs/ufs/ufs_extern.h:1.76 src/sys/ufs/ufs/ufs_extern.h:1.77
--- src/sys/ufs/ufs/ufs_extern.h:1.76	Tue Oct 21 06:39:26 2014
+++ src/sys/ufs/ufs/ufs_extern.h	Tue Oct 28 21:13:28 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_extern.h,v 1.76 2014/10/21 10:39:26 slp Exp $	*/
+/*	$NetBSD: ufs_extern.h,v 1.77 2014/10/29 01:13:28 christos Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993, 1994
@@ -111,7 +111,7 @@ int	ufs_getlbns(struct vnode *, daddr_t,
 /* ufs_inode.c */
 int	ufs_reclaim(struct vnode *);
 int	ufs_balloc_range(struct vnode *, off_t, off_t, kauth_cred_t, int);
-int	ufs_wapbl_truncate(struct vnode *, uint64_t, uint64_t, uint64_t);
+int	ufs_truncate(struct vnode *, uint64_t, kauth_cred_t);
 
 /* ufs_lookup.c */
 void	ufs_dirbad(struct inode *, doff_t, const char *);

Index: src/sys/ufs/ufs/ufs_inode.c
diff -u src/sys/ufs/ufs/ufs_inode.c:1.91 src/sys/ufs/ufs/ufs_inode.c:1.92
--- src/sys/ufs/ufs/ufs_inode.c:1.91	Tue Oct 21 06:39:26 2014
+++ src/sys/ufs/ufs/ufs_inode.c	Tue Oct 28 21:13:28 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_inode.c,v 1.91 2014/10/21 10:39:26 slp Exp $	*/
+/*	$NetBSD: ufs_inode.c,v 1.92 2014/10/29 01:13:28 christos Exp $	*/
 
 /*
  * Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.91 2014/10/21 10:39:26 slp Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.92 2014/10/29 01:13:28 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -87,7 +87,6 @@ ufs_inactive(void *v)
 	struct mount *transmp;
 	mode_t mode;
 	int error = 0;
-	int logged = 0;
 
 	UFS_WAPBL_JUNLOCK_ASSERT(vp->v_mount);
 
@@ -102,26 +101,8 @@ ufs_inactive(void *v)
 #ifdef UFS_EXTATTR
 		ufs_extattr_vnode_inactive(vp, curlwp);
 #endif
-		if (ip->i_size != 0) {
-			uint64_t incr = MNINDIR(ip->i_ump) <<
-			    vp->v_mount->mnt_fs_bshift; /* Power of 2 */
-			uint64_t base = UFS_NDADDR <<
-			    vp->v_mount->mnt_fs_bshift;
-			/*
-			 * When journaling, only truncate one indirect block
-			 * at a time
-			 */
-			if (vp->v_mount->mnt_wapbl && ip->i_size > base + incr) {
-				error = ufs_wapbl_truncate(vp, incr, base, 0);
-			}
-			if (!error) {
-				error = UFS_WAPBL_BEGIN(vp->v_mount);
-				if (error)
-					goto out;
-				logged = 1;
-				error = UFS_TRUNCATE(vp, (off_t)0, 0, NOCRED);
-			}
-		}
+		if (ip->i_size != 0)
+			error = ufs_truncate(vp, 0, NOCRED);
 #if defined(QUOTA) || defined(QUOTA2)
 		(void)chkiq(ip, -1, NOCRED, 0);
 #endif
@@ -137,16 +118,12 @@ ufs_inactive(void *v)
 	}
 
 	if (ip->i_flag & (IN_CHANGE | IN_UPDATE | IN_MODIFIED)) {
-		if (!logged++) {
-			int err;
-			err = UFS_WAPBL_BEGIN(vp->v_mount);
-			if (err)
-				goto out;
-		}
+		error = UFS_WAPBL_BEGIN(vp->v_mount);
+		if (error)
+			goto out;
 		UFS_UPDATE(vp, NULL, NULL, 0);
-	}
-	if (logged)
 		UFS_WAPBL_END(vp->v_mount);
+	}
 out:
 	/*
 	 * If we are done with the inode, reclaim it
@@ -295,25 +272,23 @@ ufs_balloc_range(struct vnode *vp, off_t
 	return error;
 }
 
-int
-ufs_wapbl_truncate(struct vnode *vp, uint64_t incr, uint64_t base,
-    uint64_t newsize)
+static int
+ufs_wapbl_truncate(struct vnode *vp, uint64_t newsize, kauth_cred_t cred)
 {
 	struct inode *ip = VTOI(vp);
-	int error;
-
-	error = UFS_WAPBL_BEGIN(vp->v_mount);
-	if (error)
-		return error;
+	int error = 0;
+	uint64_t base, incr;
 
-	while (ip->i_size > base + incr) {
+	base = UFS_NDADDR << vp->v_mount->mnt_fs_bshift;
+	incr = MNINDIR(ip->i_ump) << vp->v_mount->mnt_fs_bshift;/* Power of 2 */
+	while (ip->i_size > base + incr &&
+	    (newsize == 0 || ip->i_size > newsize + incr)) {
 		/*
 		 * round down to next full indirect
 		 * block boundary.
 		 */
-		uint64_t nsize =
-		    base + ((ip->i_size - base - 1) & ~(incr - 1));
-		error = UFS_TRUNCATE(vp, nsize, 0, NOCRED);
+		uint64_t nsize = base + ((ip->i_size - base - 1) & ~(incr - 1));
+		error = UFS_TRUNCATE(vp, nsize, 0, cred);
 		if (error)
 			break;
 		UFS_WAPBL_END(vp->v_mount);
@@ -321,6 +296,23 @@ ufs_wapbl_truncate(struct vnode *vp, uin
 		if (error)
 			return error;
 	}
+	return error;
+}
+
+int
+ufs_truncate(struct vnode *vp, uint64_t newsize, kauth_cred_t cred)
+{
+	int error;
+
+	error = UFS_WAPBL_BEGIN(vp->v_mount);
+	if (error)
+		return error;
+
+	if (vp->v_mount->mnt_wapbl)
+		error = ufs_wapbl_truncate(vp, newsize, cred);
+
+	if (error == 0)
+		error = UFS_TRUNCATE(vp, newsize, 0, cred);
 	UFS_WAPBL_END(vp->v_mount);
 
 	return error;

Index: src/sys/ufs/ufs/ufs_vnops.c
diff -u src/sys/ufs/ufs/ufs_vnops.c:1.223 src/sys/ufs/ufs/ufs_vnops.c:1.224
--- src/sys/ufs/ufs/ufs_vnops.c:1.223	Tue Oct 21 06:39:26 2014
+++ src/sys/ufs/ufs/ufs_vnops.c	Tue Oct 28 21:13:28 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_vnops.c,v 1.223 2014/10/21 10:39:26 slp Exp $	*/
+/*	$NetBSD: ufs_vnops.c,v 1.224 2014/10/29 01:13:28 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.223 2014/10/21 10:39:26 slp Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,v 1.224 2014/10/29 01:13:28 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -464,8 +464,6 @@ ufs_setattr(void *v)
 	int		error;
 	kauth_action_t	action;
 	bool		changing_sysflags;
-	uint64_t	incr;
-	uint64_t	base;
 
 	vap = ap->a_vap;
 	vp = ap->a_vp;
@@ -581,25 +579,7 @@ ufs_setattr(void *v)
 				error = EPERM;
 				goto out;
 			}
-			incr = MNINDIR(ip->i_ump) <<
-			    vp->v_mount->mnt_fs_bshift; /* Power of 2 */
-			base = UFS_NDADDR <<
-			    vp->v_mount->mnt_fs_bshift;
-			/*
-			 * When journaling, only truncate one indirect block
-			 * at a time.
-			 */
-			if (vp->v_mount->mnt_wapbl && ip->i_size > base + incr) {
-				error = ufs_wapbl_truncate(vp, incr, base,
-				    vap->va_size);
-			}
-			if (!error) {
-				error = UFS_WAPBL_BEGIN(vp->v_mount);
-				if (error)
-					goto out;
-				error = UFS_TRUNCATE(vp, vap->va_size, 0, cred);
-				UFS_WAPBL_END(vp->v_mount);
-			}
+			error = ufs_truncate(vp, vap->va_size, cred);
 			if (error)
 				goto out;
 			break;

Reply via email to