Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/ufs/ufs simplify and correct.



details:   https://anonhg.NetBSD.org/src/rev/59f1c51bea8a
branches:  trunk
changeset: 803454:59f1c51bea8a
user:      christos <christos%NetBSD.org@localhost>
date:      Wed Oct 29 01:13:28 2014 +0000

description:
simplify and correct.

diffstat:

 sys/ufs/ufs/ufs_extern.h |   4 +-
 sys/ufs/ufs/ufs_inode.c  |  78 +++++++++++++++++++++--------------------------
 sys/ufs/ufs/ufs_vnops.c  |  26 +--------------
 3 files changed, 40 insertions(+), 68 deletions(-)

diffs (208 lines):

diff -r 13e1fc2204ee -r 59f1c51bea8a sys/ufs/ufs/ufs_extern.h
--- a/sys/ufs/ufs/ufs_extern.h  Wed Oct 29 01:08:31 2014 +0000
+++ b/sys/ufs/ufs/ufs_extern.h  Wed Oct 29 01:13:28 2014 +0000
@@ -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 @@
 /* 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 *);
diff -r 13e1fc2204ee -r 59f1c51bea8a sys/ufs/ufs/ufs_inode.c
--- a/sys/ufs/ufs/ufs_inode.c   Wed Oct 29 01:08:31 2014 +0000
+++ b/sys/ufs/ufs/ufs_inode.c   Wed Oct 29 01:13:28 2014 +0000
@@ -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 @@
        struct mount *transmp;
        mode_t mode;
        int error = 0;
-       int logged = 0;
 
        UFS_WAPBL_JUNLOCK_ASSERT(vp->v_mount);
 
@@ -102,26 +101,8 @@
 #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 @@
        }
 
        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);
+               UFS_WAPBL_END(vp->v_mount);
        }
-       if (logged)
-               UFS_WAPBL_END(vp->v_mount);
 out:
        /*
         * If we are done with the inode, reclaim it
@@ -295,25 +272,23 @@
        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;
+       int error = 0;
+       uint64_t base, incr;
 
-       error = UFS_WAPBL_BEGIN(vp->v_mount);
-       if (error)
-               return error;
-
-       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 @@
                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;
diff -r 13e1fc2204ee -r 59f1c51bea8a sys/ufs/ufs/ufs_vnops.c
--- a/sys/ufs/ufs/ufs_vnops.c   Wed Oct 29 01:08:31 2014 +0000
+++ b/sys/ufs/ufs/ufs_vnops.c   Wed Oct 29 01:13:28 2014 +0000
@@ -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 @@
        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 @@
                                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;



Home | Main Index | Thread Index | Old Index