Module Name:    src
Committed By:   dholland
Date:           Wed Aug 12 18:24:14 UTC 2015

Modified Files:
        src/sys/ufs/lfs: lfs.h lfs_kernel.h lfs_vnops.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.173 -r1.174 src/sys/ufs/lfs/lfs.h
cvs rdiff -u -r1.1 -r1.2 src/sys/ufs/lfs/lfs_kernel.h
cvs rdiff -u -r1.282 -r1.283 src/sys/ufs/lfs/lfs_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/lfs/lfs.h
diff -u src/sys/ufs/lfs/lfs.h:1.173 src/sys/ufs/lfs/lfs.h:1.174
--- src/sys/ufs/lfs/lfs.h:1.173	Wed Aug 12 18:23:16 2015
+++ src/sys/ufs/lfs/lfs.h	Wed Aug 12 18:24:14 2015
@@ -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 @@ struct lfs {
  * 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 @@ typedef struct block_info {
 	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 @@ struct lfs_fcntl_markv {
 
 #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 {

Index: src/sys/ufs/lfs/lfs_kernel.h
diff -u src/sys/ufs/lfs/lfs_kernel.h:1.1 src/sys/ufs/lfs/lfs_kernel.h:1.2
--- src/sys/ufs/lfs/lfs_kernel.h:1.1	Sun Jul 28 01:05:52 2013
+++ src/sys/ufs/lfs/lfs_kernel.h	Wed Aug 12 18:24:14 2015
@@ -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 @@ struct lbnentry {
  */
 #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 @@ struct lbnentry {
 #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_ */

Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.282 src/sys/ufs/lfs/lfs_vnops.c:1.283
--- src/sys/ufs/lfs/lfs_vnops.c:1.282	Wed Aug 12 18:23:47 2015
+++ src/sys/ufs/lfs/lfs_vnops.c	Wed Aug 12 18:24:14 2015
@@ -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 @@ lfs_flush_pchain(struct lfs *fs)
 }
 
 /*
+ * 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 @@ lfs_fcntl(void *v)
 	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 @@ lfs_fcntl(void *v)
 	    case LFCNSEGWAITALL_COMPAT_50:
 	    case LFCNSEGWAITALL_COMPAT:
 		fsidp = NULL;
-		/* FALLSTHROUGH */
+		/* FALLTHROUGH */
 	    case LFCNSEGWAIT_COMPAT_50:
 	    case LFCNSEGWAIT_COMPAT:
 		{
@@ -1787,7 +1816,7 @@ lfs_fcntl(void *v)
 		goto segwait_common;
 	    case LFCNSEGWAITALL:
 		fsidp = NULL;
-		/* FALLSTHROUGH */
+		/* FALLTHROUGH */
 	    case LFCNSEGWAIT:
 		tvp = (struct timeval *)ap->a_data;
 segwait_common:
@@ -1803,6 +1832,50 @@ segwait_common:
 		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;

Reply via email to