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;