PERFORCE change 181260 for review
Zheng Liu
lz at FreeBSD.org
Wed Jul 21 13:38:19 UTC 2010
http://p4web.freebsd.org/@@181260?ac=10
Change 181260 by lz at gnehzuil-freebsd on 2010/07/21 13:38:12
Make ext2fs can support mmap(2) with ext4 extents.
* Modify ext2_bmap() function to support ext4 extents.
* New ext2fs support the ext4's features as follow:
+ has_journal
+ filetype
+ sparse_super
+ huge_file
+ extents
* Now ext2fs can read ext4 extents completely in read-only mode.
Affected files ...
.. //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_bmap.c#3 edit
.. //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_extern.h#3 edit
.. //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_subr.c#4 edit
.. //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_vnops.c#3 edit
Differences ...
==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_bmap.c#3 (text+ko) ====
@@ -46,10 +46,60 @@
#include <sys/stat.h>
#include <fs/ext2fs/inode.h>
+#include <fs/ext2fs/fs.h>
#include <fs/ext2fs/ext2fs.h>
#include <fs/ext2fs/ext2_mount.h>
#include <fs/ext2fs/ext2_extern.h>
+#include <fs/ext2fs/ext2_dinode.h>
+
+static int ext4_bmapext(struct vnode *, int32_t, int64_t *, int *, int *);
+
+/*
+ * This function converts the logical block number of a file to
+ * its physical block number on the disk within ext4 extents.
+ */
+static int
+ext4_bmapext(struct vnode *vp, int32_t bn, int64_t *bnp, int *runp, int *runb)
+{
+ struct inode *ip;
+ struct m_ext2fs *fs;
+ struct ext4_extent *ep;
+ struct ext4_extent_header *ehp;
+ struct ext4_extent_path path;
+ daddr_t lbn;
+ int bsize;
+ int depth;
+
+ ip = VTOI(vp);
+ fs = ip->i_e2fs;
+ lbn = bn;
+ bsize = blksize(fs, ip, lbn);
+
+ if (runp != NULL)
+ *runp = 0;
+
+ if (runb != NULL)
+ *runb = 0;
+ ext4_ext_find_extent(fs, ip, lbn, &path);
+ depth = ((struct ext4_extent_header *)(ip->i_db))->eh_depth;
+ if (path.ep_ext == NULL && depth != 0)
+ return (EIO);
+
+ ehp = path.ep_header;
+ ep = path.ep_ext;
+ if (ep == NULL)
+ return (EIO);
+
+ *bnp = fsbtodb(fs, (lbn - ep->e_blk +
+ (ep->e_start_lo | ((daddr_t)(ep->e_start_hi) << 31) << 1)));
+
+ if (*bnp == 0)
+ *bnp = -1;
+
+ return (0);
+}
+
/*
* Bmap converts the logical block number of a file to its physical block
* number on the disk. The conversion is done by using the logical block
@@ -66,7 +116,7 @@
int *a_runb;
} */ *ap;
{
- int32_t blkno;
+ int64_t blkno;
int error;
/*
@@ -78,8 +128,12 @@
if (ap->a_bnp == NULL)
return (0);
- error = ext2_bmaparray(ap->a_vp, ap->a_bn, &blkno,
- ap->a_runp, ap->a_runb);
+ if (VTOI(ap->a_vp)->i_flags & EXT4_EXTENTS)
+ error = ext4_bmapext(ap->a_vp, ap->a_bn, &blkno,
+ ap->a_runp, ap->a_runb);
+ else
+ error = ext2_bmaparray(ap->a_vp, ap->a_bn, &blkno,
+ ap->a_runp, ap->a_runb);
*ap->a_bnp = blkno;
return (error);
}
@@ -102,7 +156,7 @@
ext2_bmaparray(vp, bn, bnp, runp, runb)
struct vnode *vp;
int32_t bn;
- int32_t *bnp;
+ int64_t *bnp;
int *runp;
int *runb;
{
==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_extern.h#3 (text+ko) ====
@@ -54,7 +54,7 @@
void ext2_blkfree(struct inode *, int32_t, long);
int32_t ext2_blkpref(struct inode *, int32_t, int, int32_t *, int32_t);
int ext2_bmap(struct vop_bmap_args *);
-int ext2_bmaparray(struct vnode *, int32_t, int32_t *, int *, int *);
+int ext2_bmaparray(struct vnode *, int32_t, int64_t *, int *, int *);
void ext2_dirbad(struct inode *ip, doff_t offset, char *how);
void ext2_ei2i(struct ext2fs_dinode *, struct inode *);
int ext2_getlbns(struct vnode *, int32_t, struct indir *, int *);
==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_subr.c#4 (text+ko) ====
@@ -73,7 +73,7 @@
struct buf *bp;
struct ext4_extent *ep;
struct ext4_extent_header *ehp;
- struct ext4_extent_path path[20];
+ struct ext4_extent_path path;
int32_t lbn;
int bsize, error;
int depth;
@@ -85,13 +85,13 @@
bsize = blksize(fs, ip, lbn);
*bpp = NULL;
- if (ext4_ext_find_extent(fs, ip, lbn, path) == NULL)
+ if (ext4_ext_find_extent(fs, ip, lbn, &path) == NULL)
goto normal;
depth = ((struct ext4_extent_header *)(ip->i_db))->eh_depth;
- if (path[depth].ep_ext == NULL && depth != 0)
+ if (path.ep_ext == NULL && depth != 0)
goto normal;
- ehp = path[depth].ep_header;
- ep = path[depth].ep_ext;
+ ehp = path.ep_header;
+ ep = path.ep_ext;
if (ep == NULL)
goto normal;
==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_vnops.c#3 (text+ko) ====
@@ -1419,7 +1419,7 @@
struct vnode *vp = ap->a_vp;
struct inode *ip;
struct bufobj *bo;
- int32_t blkno;
+ int64_t blkno;
int error;
ip = VTOI(vp);
More information about the p4-projects
mailing list