Source-Changes-HG archive

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

[src/trunk]: src/sys/ufs/lfs Widen several of the fields of BLOCK_INFO to 64 ...



details:   https://anonhg.NetBSD.org/src/rev/69dd115e6d66
branches:  trunk
changeset: 339825:69dd115e6d66
user:      dholland <dholland%NetBSD.org@localhost>
date:      Wed Aug 12 18:24:14 2015 +0000

description:
Widen several of the fields of BLOCK_INFO to 64 bits.

Keep the old BLOCK_INFO as BLOCK_INFO_70, and version the fcntls that
use it.

Note that BLOCK_INFO_70 has 64-bit padding issues so that it's
different on 32-bit and 64-bit machines. This has been fixed. However,
BLOCK_INFO also contains a pointer, so compat32 stuff for 32-on-64 is
still needed and doesn't currently exist.

diffstat:

 sys/ufs/lfs/lfs.h        |  19 ++++++++--
 sys/ufs/lfs/lfs_kernel.h |   9 ++++-
 sys/ufs/lfs/lfs_vnops.c  |  83 +++++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 101 insertions(+), 10 deletions(-)

diffs (213 lines):

diff -r 9961560cc1cf -r 69dd115e6d66 sys/ufs/lfs/lfs.h
--- a/sys/ufs/lfs/lfs.h Wed Aug 12 18:23:59 2015 +0000
+++ b/sys/ufs/lfs/lfs.h Wed Aug 12 18:24:14 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lfs.h,v 1.173 2015/08/12 18:23:16 dholland Exp $       */
+/*     $NetBSD: lfs.h,v 1.174 2015/08/12 18:24:14 dholland Exp $       */
 
 /*  from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp  */
 /*  from NetBSD: dir.h,v 1.21 2009/07/22 04:49:19 dholland Exp  */
@@ -867,6 +867,17 @@
  * about inodes and data blocks.
  */
 typedef struct block_info {
+       u_int64_t bi_inode;             /* inode # */
+       int64_t bi_lbn;                 /* logical block w/in file */
+       int64_t bi_daddr;               /* disk address of block */
+       u_int64_t bi_segcreate;         /* origin segment create time */
+       int     bi_version;             /* file version number */
+       int     bi_size;                /* size of the block (if fragment) */
+       void    *bi_bp;                 /* data buffer */
+} BLOCK_INFO;
+
+/* Compatibility for 7.0 binaries */
+typedef struct block_info_70 {
        u_int32_t bi_inode;             /* inode # */
        int32_t bi_lbn;                 /* logical block w/in file */
        int32_t bi_daddr;               /* disk address of block */
@@ -874,7 +885,7 @@
        int     bi_version;             /* file version number */
        void    *bi_bp;                 /* data buffer */
        int     bi_size;                /* size of the block (if fragment) */
-} BLOCK_INFO;
+} BLOCK_INFO_70;
 
 /* Compatibility for 1.5 binaries */
 typedef struct block_info_15 {
@@ -946,8 +957,8 @@
 
 #define LFCNSEGWAITALL _FCNR_FSPRIV('L', 14, struct timeval)
 #define LFCNSEGWAIT    _FCNR_FSPRIV('L', 15, struct timeval)
-#define LFCNBMAPV      _FCNRW_FSPRIV('L', 2, struct lfs_fcntl_markv)
-#define LFCNMARKV      _FCNRW_FSPRIV('L', 3, struct lfs_fcntl_markv)
+#define LFCNBMAPV      _FCNRW_FSPRIV('L', 16, struct lfs_fcntl_markv)
+#define LFCNMARKV      _FCNRW_FSPRIV('L', 17, struct lfs_fcntl_markv)
 #define LFCNRECLAIM     _FCNO_FSPRIV('L', 4)
 
 struct lfs_fhandle {
diff -r 9961560cc1cf -r 69dd115e6d66 sys/ufs/lfs/lfs_kernel.h
--- a/sys/ufs/lfs/lfs_kernel.h  Wed Aug 12 18:23:59 2015 +0000
+++ b/sys/ufs/lfs/lfs_kernel.h  Wed Aug 12 18:24:14 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lfs_kernel.h,v 1.1 2013/07/28 01:05:52 dholland Exp $  */
+/*     $NetBSD: lfs_kernel.h,v 1.2 2015/08/12 18:24:14 dholland Exp $  */
 
 /*  from NetBSD: lfs.h,v 1.157 2013/06/28 16:14:06 matt Exp  */
 
@@ -100,6 +100,11 @@
  */
 #include <compat/sys/time_types.h>
 
+struct lfs_fcntl_markv_70 {
+       BLOCK_INFO_70 *blkiov;  /* blocks to relocate */
+       int blkcnt;             /* number of blocks (limited to 65536) */
+};
+
 #define LFCNSEGWAITALL_COMPAT   _FCNW_FSPRIV('L', 0, struct timeval50)
 #define LFCNSEGWAIT_COMPAT      _FCNW_FSPRIV('L', 1, struct timeval50)
 #define LFCNIFILEFH_COMPAT      _FCNW_FSPRIV('L', 5, struct lfs_fhandle)
@@ -108,6 +113,8 @@
 #define LFCNWRAPGO_COMPAT       _FCNO_FSPRIV('L', 10)
 #define LFCNSEGWAITALL_COMPAT_50 _FCNR_FSPRIV('L', 0, struct timeval50)
 #define LFCNSEGWAIT_COMPAT_50   _FCNR_FSPRIV('L', 1, struct timeval50)
+#define LFCNBMAPV_COMPAT_70    _FCNRW_FSPRIV('L', 2, struct lfs_fcntl_markv_70)
+#define LFCNMARKV_COMPAT_70    _FCNRW_FSPRIV('L', 3, struct lfs_fcntl_markv_70)
 
 
 #endif /* _UFS_LFS_LFS_KERNEL_H_ */
diff -r 9961560cc1cf -r 69dd115e6d66 sys/ufs/lfs/lfs_vnops.c
--- a/sys/ufs/lfs/lfs_vnops.c   Wed Aug 12 18:23:59 2015 +0000
+++ b/sys/ufs/lfs/lfs_vnops.c   Wed Aug 12 18:24:14 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lfs_vnops.c,v 1.282 2015/08/12 18:23:47 dholland Exp $ */
+/*     $NetBSD: lfs_vnops.c,v 1.283 2015/08/12 18:24:14 dholland Exp $ */
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -125,7 +125,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.282 2015/08/12 18:23:47 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.283 2015/08/12 18:24:14 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1721,6 +1721,33 @@
 }
 
 /*
+ * Conversion for compat.
+ */
+static void
+block_info_from_70(BLOCK_INFO *bi, const BLOCK_INFO_70 *bi70)
+{
+       bi->bi_inode = bi70->bi_inode;
+       bi->bi_lbn = bi70->bi_lbn;
+       bi->bi_daddr = bi70->bi_daddr;
+       bi->bi_segcreate = bi70->bi_segcreate;
+       bi->bi_version = bi70->bi_version;
+       bi->bi_bp = bi70->bi_bp;
+       bi->bi_size = bi70->bi_size;
+}
+
+static void
+block_info_to_70(BLOCK_INFO_70 *bi70, const BLOCK_INFO *bi)
+{
+       bi70->bi_inode = bi->bi_inode;
+       bi70->bi_lbn = bi->bi_lbn;
+       bi70->bi_daddr = bi->bi_daddr;
+       bi70->bi_segcreate = bi->bi_segcreate;
+       bi70->bi_version = bi->bi_version;
+       bi70->bi_bp = bi->bi_bp;
+       bi70->bi_size = bi->bi_size;
+}
+
+/*
  * Provide a fcntl interface to sys_lfs_{segwait,bmapv,markv}.
  */
 int
@@ -1736,11 +1763,13 @@
        struct timeval tv;
        struct timeval *tvp;
        BLOCK_INFO *blkiov;
+       BLOCK_INFO_70 *blkiov70;
        CLEANERINFO *cip;
        SEGUSE *sup;
-       int blkcnt, error;
+       int blkcnt, i, error;
        size_t fh_size;
        struct lfs_fcntl_markv blkvp;
+       struct lfs_fcntl_markv_70 blkvp70;
        struct lwp *l;
        fsid_t *fsidp;
        struct lfs *fs;
@@ -1775,7 +1804,7 @@
            case LFCNSEGWAITALL_COMPAT_50:
            case LFCNSEGWAITALL_COMPAT:
                fsidp = NULL;
-               /* FALLSTHROUGH */
+               /* FALLTHROUGH */
            case LFCNSEGWAIT_COMPAT_50:
            case LFCNSEGWAIT_COMPAT:
                {
@@ -1787,7 +1816,7 @@
                goto segwait_common;
            case LFCNSEGWAITALL:
                fsidp = NULL;
-               /* FALLSTHROUGH */
+               /* FALLTHROUGH */
            case LFCNSEGWAIT:
                tvp = (struct timeval *)ap->a_data;
 segwait_common:
@@ -1803,6 +1832,50 @@
                mutex_exit(&lfs_lock);
                return error;
 
+           case LFCNBMAPV_COMPAT_70:
+           case LFCNMARKV_COMPAT_70:
+               blkvp70 = *(struct lfs_fcntl_markv_70 *)ap->a_data;
+
+               blkcnt = blkvp70.blkcnt;
+               if ((u_int) blkcnt > LFS_MARKV_MAXBLKCNT)
+                       return (EINVAL);
+               blkiov = lfs_malloc(fs, blkcnt * sizeof(BLOCK_INFO), LFS_NB_BLKIOV);
+               blkiov70 = lfs_malloc(fs, sizeof(BLOCK_INFO_70), LFS_NB_BLKIOV);
+               for (i = 0; i < blkcnt; i++) {
+                       error = copyin(&blkvp70.blkiov[i], blkiov70,
+                                      sizeof(*blkiov70));
+                       if (error) {
+                               lfs_free(fs, blkiov70, LFS_NB_BLKIOV);
+                               lfs_free(fs, blkiov, LFS_NB_BLKIOV);
+                               return error;
+                       }
+                       block_info_from_70(&blkiov[i], blkiov70);
+               }
+
+               mutex_enter(&lfs_lock);
+               ++fs->lfs_sleepers;
+               mutex_exit(&lfs_lock);
+               if (ap->a_command == LFCNBMAPV)
+                       error = lfs_bmapv(l, fsidp, blkiov, blkcnt);
+               else /* LFCNMARKV */
+                       error = lfs_markv(l, fsidp, blkiov, blkcnt);
+               if (error == 0) {
+                       for (i = 0; i < blkcnt; i++) {
+                               block_info_to_70(blkiov70, &blkiov[i]);
+                               error = copyout(blkiov70, &blkvp70.blkiov[i],
+                                               sizeof(*blkiov70));
+                               if (error) {
+                                       break;
+                               }
+                       }
+               }
+               mutex_enter(&lfs_lock);
+               if (--fs->lfs_sleepers == 0)
+                       wakeup(&fs->lfs_sleepers);
+               mutex_exit(&lfs_lock);
+               lfs_free(fs, blkiov, LFS_NB_BLKIOV);
+               return error;
+
            case LFCNBMAPV:
            case LFCNMARKV:
                blkvp = *(struct lfs_fcntl_markv *)ap->a_data;



Home | Main Index | Thread Index | Old Index