Source-Changes-HG archive

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

[src/trunk]: src/sys/ufs/lfs Tidy up ulfs_direnter: don't malloc a temporary ...



details:   https://anonhg.NetBSD.org/src/rev/3f5ead1d9fd5
branches:  trunk
changeset: 340587:3f5ead1d9fd5
user:      dholland <dholland%NetBSD.org@localhost>
date:      Tue Sep 15 15:00:49 2015 +0000

description:
Tidy up ulfs_direnter: don't malloc a temporary struct lfs_direct
and double-copy it. Just write to the destination buffer.

diffstat:

 sys/ufs/lfs/ulfs_lookup.c |  84 +++++++++++++++++++++++++---------------------
 1 files changed, 45 insertions(+), 39 deletions(-)

diffs (184 lines):

diff -r 5c76114c2047 -r 3f5ead1d9fd5 sys/ufs/lfs/ulfs_lookup.c
--- a/sys/ufs/lfs/ulfs_lookup.c Tue Sep 15 15:00:32 2015 +0000
+++ b/sys/ufs/lfs/ulfs_lookup.c Tue Sep 15 15:00:49 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ulfs_lookup.c,v 1.28 2015/09/15 15:00:32 dholland Exp $        */
+/*     $NetBSD: ulfs_lookup.c,v 1.29 2015/09/15 15:00:49 dholland Exp $        */
 /*  from NetBSD: ufs_lookup.c,v 1.122 2013/01/22 09:39:18 dholland Exp  */
 
 /*
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.28 2015/09/15 15:00:32 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.29 2015/09/15 15:00:49 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_lfs.h"
@@ -696,26 +696,29 @@
 }
 
 /*
- * Construct a new directory entry after a call to namei, using the
- * name in the componentname argument cnp. The new directory entry
- * will refer to inode INUM which has type (directory-level type)
- * DTYPE. If adding a reference to an already-created or
- * already-extant inode, these values are retrieved with:
- *   ip->i_number
- *   LFS_IFTODT(ip->i_mode)
- * (The latter should be tidier. XXX)
+ * Assign the contents of directory entry DIRP, on volume FS.
+ *
+ * NAME/NAMLEN is the name, which is not necessarily null terminated.
+ * INUM is the inode number, and DTYPE is the type code (LFS_DT_*).
+ *
+ * Note that these values typically come from:
+ *    cnp->cn_nameptr
+ *    cnp->cn_namelen
+ *    ip->i_number
+ *    LFS_IFTODT(ip->i_mode)
  *
  * Does not set d_reclen.
  */
 static void
-ulfs_makedirentry_tmp(struct lfs *fs, struct componentname *cnp,
-    ino_t inum, unsigned dtype, struct lfs_direct *newdirp)
+ulfs_direntry_assign(struct lfs *fs, struct lfs_direct *dirp,
+                    const char *name, size_t namlen,
+                    ino_t inum, unsigned dtype)
 {
-       lfs_dir_setino(fs, newdirp, inum);
-       memcpy(newdirp->d_name, cnp->cn_nameptr, (size_t)cnp->cn_namelen);
-       newdirp->d_name[cnp->cn_namelen] = '\0';
-       lfs_dir_setnamlen(fs, newdirp, cnp->cn_namelen);
-       lfs_dir_settype(fs, newdirp, dtype);
+       lfs_dir_setino(fs, dirp, inum);
+       lfs_dir_setnamlen(fs, dirp, namlen);
+       lfs_dir_settype(fs, dirp, dtype);
+       memcpy(dirp->d_name, name, namlen);
+       dirp->d_name[namlen] = '\0';
 }
 
 /*
@@ -766,16 +769,19 @@
        struct ulfsmount *ump = VFSTOULFS(dvp->v_mount);
        struct lfs *fs = ump->um_lfs;
        int dirblksiz = fs->um_dirblksiz;
-       struct lfs_direct *dirp;
-
-       dirp = pool_cache_get(ulfs_direct_cache, PR_WAITOK);
-       ulfs_makedirentry_tmp(fs, cnp, inum, dtype, dirp);
+       const char *name;
+       unsigned namlen, reclen;
+#ifdef LFS_DIRHASH
+       int dohashadd;
+#endif
 
        error = 0;
+       name = cnp->cn_nameptr; /* note: not null-terminated */
+       namlen = cnp->cn_namelen;
        cr = cnp->cn_cred;
 
        dp = VTOI(dvp);
-       newentrysize = LFS_DIRSIZ(fs, dirp);
+       newentrysize = LFS_DIRECTSIZ(namlen);
 
        if (ulr->ulr_count == 0) {
                /*
@@ -788,7 +794,6 @@
                        panic("ulfs_direnter: newblk");
                if ((error = lfs_balloc(dvp, (off_t)ulr->ulr_offset, dirblksiz,
                    cr, B_CLRBUF | B_SYNC, &bp)) != 0) {
-                       pool_cache_put(ulfs_direct_cache, dirp);
                        return (error);
                }
                dp->i_size = ulr->ulr_offset + dirblksiz;
@@ -796,11 +801,13 @@
                dp->i_flag |= IN_CHANGE | IN_UPDATE;
                uvm_vnp_setsize(dvp, dp->i_size);
                lfs_blkoff = ulr->ulr_offset & (ump->um_mountp->mnt_stat.f_iosize - 1);
-               memcpy((char *)bp->b_data + lfs_blkoff, dirp, newentrysize);
+               ep = (struct lfs_direct *)((char *)bp->b_data + lfs_blkoff);
+               ulfs_direntry_assign(fs, ep, name, namlen, inum, dtype);
+               lfs_dir_setreclen(fs, ep, dirblksiz);
 #ifdef LFS_DIRHASH
                if (dp->i_dirhash != NULL) {
                        ulfsdirhash_newblk(dp, ulr->ulr_offset);
-                       ulfsdirhash_add(dp, dirp, ulr->ulr_offset);
+                       ulfsdirhash_add(dp, ep, ulr->ulr_offset);
                        ulfsdirhash_checkblock(dp, (char *)bp->b_data + lfs_blkoff,
                            ulr->ulr_offset);
                }
@@ -808,7 +815,6 @@
                error = VOP_BWRITE(bp->b_vp, bp);
                vfs_timestamp(&ts);
                ret = lfs_update(dvp, &ts, &ts, UPDATE_DIROP);
-               pool_cache_put(ulfs_direct_cache, dirp);
                if (error == 0)
                        return (ret);
                return (error);
@@ -844,7 +850,6 @@
         */
        error = ulfs_blkatoff(dvp, (off_t)ulr->ulr_offset, &dirbuf, &bp, true);
        if (error) {
-               pool_cache_put(ulfs_direct_cache, dirp);
                return (error);
        }
        /*
@@ -857,8 +862,6 @@
        dsize = (lfs_dir_getino(fs, ep) != 0) ? LFS_DIRSIZ(fs, ep) : 0;
        spacefree = lfs_dir_getreclen(fs, ep) - dsize;
        for (loc = lfs_dir_getreclen(fs, ep); loc < ulr->ulr_count; ) {
-               uint16_t reclen;
-
                nep = (struct lfs_direct *)(dirbuf + loc);
 
                /* Trim the existing slot (NB: dsize may be zero). */
@@ -902,25 +905,29 @@
         */
        if (lfs_dir_getino(fs, ep) == 0 ||
            (lfs_dir_getino(fs, ep) == ULFS_WINO &&
-            memcmp(ep->d_name, dirp->d_name, lfs_dir_getnamlen(fs, dirp)) == 0)) {
+            memcmp(ep->d_name, name, namlen) == 0)) {
                if (spacefree + dsize < newentrysize)
                        panic("ulfs_direnter: compact1");
-               lfs_dir_setreclen(fs, dirp, spacefree + dsize);
+               reclen = spacefree + dsize;
+#ifdef LFS_DIRHASH
+               dohashadd = (lfs_dir_getino(fs, ep) == 0);
+#endif
        } else {
                if (spacefree < newentrysize)
                        panic("ulfs_direnter: compact2");
-               lfs_dir_setreclen(fs, dirp, spacefree);
+               reclen = spacefree;
                lfs_dir_setreclen(fs, ep, dsize);
                ep = LFS_NEXTDIR(fs, ep);
+#ifdef LFS_DIRHASH
+               dohashadd = 1;
+#endif
        }
 
+       ulfs_direntry_assign(fs, ep, name, namlen, inum, dtype);
+       lfs_dir_setreclen(fs, ep, reclen);
 #ifdef LFS_DIRHASH
-       if (dp->i_dirhash != NULL && (lfs_dir_getino(fs, ep) == 0 ||
-           lfs_dir_getreclen(fs, dirp) == spacefree))
-               ulfsdirhash_add(dp, dirp, ulr->ulr_offset + ((char *)ep - dirbuf));
-#endif
-       memcpy((void *)ep, (void *)dirp, (u_int)newentrysize);
-#ifdef LFS_DIRHASH
+       if (dp->i_dirhash != NULL && dohashadd)
+               ulfsdirhash_add(dp, ep, ulr->ulr_offset + ((char *)ep - dirbuf));
        if (dp->i_dirhash != NULL)
                ulfsdirhash_checkblock(dp, dirbuf -
                    (ulr->ulr_offset & (dirblksiz - 1)),
@@ -942,7 +949,6 @@
 #endif
                (void) lfs_truncate(dvp, (off_t)ulr->ulr_endoff, IO_SYNC, cr);
        }
-       pool_cache_put(ulfs_direct_cache, dirp);
        return (error);
 }
 



Home | Main Index | Thread Index | Old Index