|
Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com |
64-bit buffer cache, part 1
From: Pedro Martelletto (pedro
ambientworks.net)
Date: Sun Oct 01 2006 - 10:07:30 CDT
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
The following diff introduces daddr64_t and instruments the buffer cache
(as well as code strictly related to it) to use this new type for
physical block numbers, effectively making it possible to have buffers
describing regions of the disk beyond the 1T limit.
Affected areas are: vnd, msdosfs, uvm (when swapping), cd9660 and ffs.
Testing appreciated.
Input from tedu
, thanks.
-p.
Index: dev/vnd.c
===================================================================
RCS file: /cvs/src/sys/dev/vnd.c,v
retrieving revision 1.63
diff -u -r1.63 vnd.c
--- dev/vnd.c 20 Sep 2006 13:51:19 -0000 1.63
+++ dev/vnd.c 25 Sep 2006 18:35:01 -0000

-549,7 +549,7 
flags = bp->b_flags | B_CALL;
for (resid = bp->b_resid; resid; resid -= sz) {
struct vnode *vp;
- daddr_t nbn;
+ daddr64_t nbn;
int off, s, nra;
nra = 0;
Index: isofs/cd9660/cd9660_vnops.c
===================================================================
RCS file: /cvs/src/sys/isofs/cd9660/cd9660_vnops.c,v
retrieving revision 1.34
diff -u -r1.34 cd9660_vnops.c
--- isofs/cd9660/cd9660_vnops.c 25 Jan 2006 21:15:55 -0000 1.34
+++ isofs/cd9660/cd9660_vnops.c 26 Sep 2006 19:43:57 -0000

-400,13 +400,16 
struct ucred *a_cred;
struct proc *a_p;
} */ *ap = v;
- daddr_t *block;
+ daddr32_t *blkp;
+ daddr64_t blk;
+ int error;
switch (ap->a_command) {
case FIBMAP:
- block = (daddr_t *)ap->a_data;
-
- return (VOP_BMAP(ap->a_vp, *block, NULL, block, 0));
+ blkp = (daddr32_t *) ap->a_data;
+ error = VOP_BMAP(ap->a_vp, *blkp, NULL, &blk, 0);
+ *blkp = (daddr32_t) blk;
+ return (error);
default:
return (ENOTTY);
}
Index: kern/vfs_cluster.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_cluster.c,v
retrieving revision 1.34
diff -u -r1.34 vfs_cluster.c
--- kern/vfs_cluster.c 8 Nov 2005 15:43:44 -0000 1.34
+++ kern/vfs_cluster.c 25 Sep 2006 18:35:03 -0000

-43,18 +43,14 
#include <uvm/uvm_extern.h>
-/*
- * Local declarations
- */
-void cluster_callback(struct buf *);
-struct buf *cluster_newbuf(struct vnode *, struct buf *, long, daddr_t,
- daddr_t, long, int);
-struct buf *cluster_rbuild(struct vnode *, u_quad_t, struct buf *,
- daddr_t, daddr_t, long, int, long);
-void cluster_wbuild(struct vnode *, struct buf *, long,
- daddr_t, int, daddr_t);
-struct cluster_save *cluster_collectbufs(struct vnode *,
- struct cluster_info *, struct buf *);
+void cluster_callback(struct buf *);
+struct buf *cluster_newbuf(struct vnode *, struct buf *, long, daddr64_t,
+ daddr_t, long, int);
+struct buf *cluster_rbuild(struct vnode *, u_quad_t, struct buf *, daddr_t,
+ daddr64_t, long, int, long);
+void cluster_wbuild(struct vnode *, struct buf *, long, daddr_t, int, daddr_t);
+struct cluster_save *cluster_collectbufs(struct vnode *, struct cluster_info *,
+ struct buf *);
#ifdef DIAGNOSTIC
/*

-103,7 +99,8 
daddr_t lblkno, long size, struct ucred *cred, struct buf **bpp)
{
struct buf *bp, *rbp;
- daddr_t blkno, ioblkno;
+ daddr64_t blkno;
+ daddr_t ioblkno;
long flags;
int error, num_ra, alreadyincore;

-263,7 +260,7 
*/
struct buf *
cluster_rbuild(struct vnode *vp, u_quad_t filesize, struct buf *bp,
- daddr_t lbn, daddr_t blkno, long size, int run, long flags)
+ daddr_t lbn, daddr64_t blkno, long size, int run, long flags)
{
struct cluster_save *b_save;
struct buf *tbp;

-361,7 +358,7 
* Either get a new buffer or grow the existing one.
*/
struct buf *
-cluster_newbuf(struct vnode *vp, struct buf *bp, long flags, daddr_t blkno,
+cluster_newbuf(struct vnode *vp, struct buf *bp, long flags, daddr64_t blkno,
daddr_t lblkno, long size, int run)
{
if (!bp) {
Index: kern/vnode_if.c
===================================================================
RCS file: /cvs/src/sys/kern/vnode_if.c,v
retrieving revision 1.44
diff -u -r1.44 vnode_if.c
--- kern/vnode_if.c 2 Jan 2006 05:06:50 -0000 1.44
+++ kern/vnode_if.c 25 Sep 2006 18:35:03 -0000

-961,7 +961,7 
NULL,
};
-int VOP_BMAP(struct vnode *vp, daddr_t bn, struct vnode **vpp, daddr_t *bnp,
+int VOP_BMAP(struct vnode *vp, daddr_t bn, struct vnode **vpp, daddr64_t *bnp,
int *runp)
{
struct vop_bmap_args a;
Index: kern/vnode_if.src
===================================================================
RCS file: /cvs/src/sys/kern/vnode_if.src,v
retrieving revision 1.29
diff -u -r1.29 vnode_if.src
--- kern/vnode_if.src 14 Jul 2005 09:04:59 -0000 1.29
+++ kern/vnode_if.src 25 Sep 2006 18:35:03 -0000

-398,7 +398,7 
IN SHOULDBELOCKED struct vnode *vp;
IN daddr_t bn;
OUT struct vnode **vpp;
- IN daddr_t *bnp;
+ IN daddr64_t *bnp;
OUT int *runp;
};
Index: msdosfs/fat.h
===================================================================
RCS file: /cvs/src/sys/msdosfs/fat.h,v
retrieving revision 1.7
diff -u -r1.7 fat.h
--- msdosfs/fat.h 14 May 2004 04:05:05 -0000 1.7
+++ msdosfs/fat.h 25 Sep 2006 18:35:04 -0000

-97,7 +97,7 
*/
#define DE_CLEAR 1 /* Zero out the blocks allocated */
-int pcbmap(struct denode *, uint32_t, daddr_t *, uint32_t *, int *);
+int pcbmap(struct denode *, uint32_t, daddr64_t *, uint32_t *, int *);
int clusterfree(struct msdosfsmount *, uint32_t, uint32_t *);
int clusteralloc(struct msdosfsmount *, uint32_t, uint32_t, uint32_t, uint32_t *, uint32_t *);
int extendfile(struct denode *, uint32_t, struct buf **, uint32_t *, int);
Index: msdosfs/msdosfs_fat.c
===================================================================
RCS file: /cvs/src/sys/msdosfs/msdosfs_fat.c,v
retrieving revision 1.17
diff -u -r1.17 msdosfs_fat.c
--- msdosfs/msdosfs_fat.c 16 May 2004 19:00:51 -0000 1.17
+++ msdosfs/msdosfs_fat.c 25 Sep 2006 18:35:04 -0000

-138,7 +138,7 
pcbmap(dep, findcn, bnp, cnp, sp)
struct denode *dep;
uint32_t findcn; /* file relative cluster to get */
- daddr_t *bnp; /* returned filesys relative blk number */
+ daddr64_t *bnp; /* returned filesys relative blk number */
uint32_t *cnp; /* returned cluster number */
int *sp; /* returned block size */
{
Index: msdosfs/msdosfs_lookup.c
===================================================================
RCS file: /cvs/src/sys/msdosfs/msdosfs_lookup.c,v
retrieving revision 1.15
diff -u -r1.15 msdosfs_lookup.c
--- msdosfs/msdosfs_lookup.c 2 Mar 2005 00:35:04 -0000 1.15
+++ msdosfs/msdosfs_lookup.c 25 Sep 2006 18:35:04 -0000

-90,7 +90,7 
struct vnode **vpp = ap->a_vpp;
struct componentname *cnp = ap->a_cnp;
struct proc *p = cnp->cn_proc;
- daddr_t bn;
+ daddr64_t bn;
int error;
int lockparent;
int wantparent;

-594,7 +594,7 
struct direntry *ndep;
struct msdosfsmount *pmp = ddep->de_pmp;
struct buf *bp;
- daddr_t bn;
+ daddr64_t bn;
int blsize;
#ifdef MSDOSFS_DEBUG

-716,7 +716,7 
int blsize;
int error;
uint32_t cn;
- daddr_t bn;
+ daddr64_t bn;
struct buf *bp;
struct msdosfsmount *pmp = dep->de_pmp;
struct direntry *dentp;

-935,7 +935,7 
int error;
struct direntry *ep;
struct buf *bp;
- daddr_t bn;
+ daddr64_t bn;
int blsize;
struct msdosfsmount *pmp = pdep->de_pmp;
uint32_t offset = pdep->de_fndoffset;

-1005,7 +1005,7 
int gen;
int blsize;
uint32_t cn;
- daddr_t bn;
+ daddr64_t bn;
struct buf *bp;
int error;

-1068,7 +1068,7 
struct direntry *dentp;
int blsize;
uint32_t cn;
- daddr_t bn;
+ daddr64_t bn;
struct buf *bp;
/*
Index: msdosfs/msdosfs_vnops.c
===================================================================
RCS file: /cvs/src/sys/msdosfs/msdosfs_vnops.c,v
retrieving revision 1.56
diff -u -r1.56 msdosfs_vnops.c
--- msdosfs/msdosfs_vnops.c 1 Dec 2005 22:13:33 -0000 1.56
+++ msdosfs/msdosfs_vnops.c 25 Sep 2006 18:35:05 -0000

-469,7 +469,7 
int isadir;
uint32_t n;
long on;
- daddr_t lbn;
+ daddr64_t lbn;
daddr_t rablock;
daddr_t rablkno;
struct buf *bp;

-1472,7 +1472,8 
uint32_t cn;
uint32_t fileno;
long bias = 0;
- daddr_t bn, lbn;
+ daddr_t lbn;
+ daddr64_t bn;
struct buf *bp;
struct denode *dep = VTODE(ap->a_vp);
struct msdosfsmount *pmp = dep->de_pmp;
Index: sys/buf.h
===================================================================
RCS file: /cvs/src/sys/sys/buf.h,v
retrieving revision 1.49
diff -u -r1.49 buf.h
--- sys/buf.h 22 Sep 2006 23:29:45 -0000 1.49
+++ sys/buf.h 25 Sep 2006 18:35:06 -0000

-88,7 +88,7 
} b_un;
void *b_saveaddr; /* Original b_addr for physio. */
daddr_t b_lblkno; /* Logical block number. */
- daddr_t b_blkno; /* Underlying physical block number. */
+ daddr64_t b_blkno; /* Underlying physical block number. */
/* Function to call upon completion.
* Will be called at splbio(). */
void (*b_iodone)(struct buf *);

-203,13 +203,13 
#define B_SYNC 0x02 /* Do all allocations synchronously. */
struct cluster_info {
- daddr_t ci_lastr; /* last read (read-ahead) */
- daddr_t ci_lastw; /* last write (write cluster) */
- daddr_t ci_cstart; /* start block of cluster */
- daddr_t ci_lasta; /* last allocation */
- int ci_clen; /* length of current cluster */
- int ci_ralen; /* Read-ahead length */
- daddr_t ci_maxra; /* last readahead block */
+ daddr64_t ci_lastr; /* last read (read-ahead) */
+ daddr64_t ci_lastw; /* last write (write cluster) */
+ daddr64_t ci_cstart; /* start block of cluster */
+ daddr64_t ci_lasta; /* last allocation */
+ int ci_clen; /* length of current cluster */
+ int ci_ralen; /* Read-ahead length */
+ daddr64_t ci_maxra; /* last readahead block */
};
#ifdef _KERNEL
Index: sys/types.h
===================================================================
RCS file: /cvs/src/sys/sys/types.h,v
retrieving revision 1.29
diff -u -r1.29 types.h
--- sys/types.h 6 Jan 2006 18:53:06 -0000 1.29
+++ sys/types.h 26 Sep 2006 19:47:13 -0000

-128,7 +128,9 
/* Standard system types */
typedef char * caddr_t; /* core address */
-typedef __int32_t daddr_t; /* disk address */
+typedef __int32_t daddr_t; /* 32-bit disk address */
+typedef __int32_t daddr32_t; /* 32-bit disk address */
+typedef __int64_t daddr64_t; /* 64-bit disk address */
typedef __dev_t dev_t; /* device number */
typedef __fixpt_t fixpt_t; /* fixed point number */
typedef __gid_t gid_t; /* group id */
Index: sys/vnode_if.h
===================================================================
RCS file: /cvs/src/sys/sys/vnode_if.h,v
retrieving revision 1.41
diff -u -r1.41 vnode_if.h
--- sys/vnode_if.h 2 Jan 2006 05:06:50 -0000 1.41
+++ sys/vnode_if.h 25 Sep 2006 18:35:06 -0000

-339,11 +339,11 
struct vnode *a_vp;
daddr_t a_bn;
struct vnode **a_vpp;
- daddr_t *a_bnp;
+ daddr64_t *a_bnp;
int *a_runp;
};
extern struct vnodeop_desc vop_bmap_desc;
-int VOP_BMAP(struct vnode *, daddr_t, struct vnode **, daddr_t *, int *);
+int VOP_BMAP(struct vnode *, daddr_t, struct vnode **, daddr64_t *, int *);
struct vop_print_args {
struct vnodeop_desc *a_desc;
Index: ufs/ext2fs/ext2fs_bmap.c
===================================================================
RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_bmap.c,v
retrieving revision 1.11
diff -u -r1.11 ext2fs_bmap.c
--- ufs/ext2fs/ext2fs_bmap.c 3 Jul 2005 20:14:01 -0000 1.11
+++ ufs/ext2fs/ext2fs_bmap.c 25 Sep 2006 18:35:06 -0000

-56,8 +56,8 
#include <ufs/ext2fs/ext2fs.h>
#include <ufs/ext2fs/ext2fs_extern.h>
-static int ext2fs_bmaparray(struct vnode *, ufs1_daddr_t, ufs1_daddr_t *,
- struct indir *, int *, int *);
+static int ext2fs_bmaparray(struct vnode *, ufs1_daddr_t, daddr64_t *,
+ struct indir *, int *, int *);
/*
* Bmap converts a the logical block number of a file to its physical block

-106,7 +106,7 
ext2fs_bmaparray(vp, bn, bnp, ap, nump, runp)
struct vnode *vp;
ufs1_daddr_t bn;
- ufs1_daddr_t *bnp;
+ daddr64_t *bnp;
struct indir *ap;
int *nump;
int *runp;
Index: ufs/ufs/ufs_bmap.c
===================================================================
RCS file: /cvs/src/sys/ufs/ufs/ufs_bmap.c,v
retrieving revision 1.20
diff -u -r1.20 ufs_bmap.c
--- ufs/ufs/ufs_bmap.c 1 Apr 2006 02:43:05 -0000 1.20
+++ ufs/ufs/ufs_bmap.c 25 Sep 2006 18:35:06 -0000

-94,7 +94,7 
* next block and the disk address of the block (if it is assigned).
*/
int
-ufs_bmaparray(struct vnode *vp, daddr_t bn, daddr_t *bnp, struct indir *ap,
+ufs_bmaparray(struct vnode *vp, daddr_t bn, daddr64_t *bnp, struct indir *ap,
int *nump, int *runp)
{
struct inode *ip;
Index: ufs/ufs/ufs_extern.h
===================================================================
RCS file: /cvs/src/sys/ufs/ufs/ufs_extern.h,v
retrieving revision 1.25
diff -u -r1.25 ufs_extern.h
--- ufs/ufs/ufs_extern.h 20 Jul 2005 16:30:35 -0000 1.25
+++ ufs/ufs/ufs_extern.h 25 Sep 2006 18:35:06 -0000

-102,7 +102,7 
#endif
/* ufs_bmap.c */
-int ufs_bmaparray(struct vnode *, daddr_t, daddr_t *, struct indir *,
+int ufs_bmaparray(struct vnode *, daddr_t, daddr64_t *, struct indir *,
int *, int *);
int ufs_getlbns(struct vnode *, daddr_t, struct indir *, int *);
Index: uvm/uvm_swap.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_swap.c,v
retrieving revision 1.65
diff -u -r1.65 uvm_swap.c
--- uvm/uvm_swap.c 31 Jul 2006 11:51:29 -0000 1.65
+++ uvm/uvm_swap.c 25 Sep 2006 18:35:08 -0000

-1288,7 +1288,7 
{
struct vnode *vp;
struct vndxfer *vnx;
- daddr_t nbn;
+ daddr64_t nbn;
caddr_t addr;
off_t byteoff;
int s, off, nra, error, sz, resid;
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]