Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Jul 2010 08:28:21 GMT
From:      Zheng Liu <lz@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 180937 for review
Message-ID:  <201007140828.o6E8SLm3097547@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@180937?ac=10

Change 180937 by lz@gnehzuil-freebsd on 2010/07/14 08:28:12

	       Now ext2fs can read ext4 extents from any sub-directory.

Affected files ...

.. //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_extents.c#5 edit
.. //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_readwrite.c#6 edit
.. //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_subr.c#3 edit

Differences ...

==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_extents.c#5 (text+ko) ====

@@ -132,6 +132,9 @@
         ehp = (struct ext4_extent_header *)((char *)ip->i_db);
         depth = ehp->eh_depth;
 
+        if (ehp->eh_magic != EXT4_EXT_MAGIC)
+                return (NULL);
+
         if (path == NULL) {
                 path = malloc(sizeof(struct ext4_extent_path) * (depth * 2),
                     M_EXT2NODE, M_WAITOK | M_ZERO);

==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_readwrite.c#6 (text+ko) ====

@@ -80,7 +80,6 @@
         mode = ip->i_mode;
         uio = ap->a_uio;
 
-printf("====\n");
 	orig_resid = uio->uio_resid;
 	KASSERT(orig_resid >= 0, ("ext2_read: uio->uio_resid < 0"));
 	if (orig_resid == 0)

==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext2fs/ext2_subr.c#3 (text+ko) ====

@@ -50,6 +50,7 @@
 #include <fs/ext2fs/ext2_extern.h>
 #include <fs/ext2fs/ext2fs.h>
 #include <fs/ext2fs/fs.h>
+#include <fs/ext2fs/ext2_extents.h>
 
 #ifdef KDB
 void	ext2_checkoverlap(struct buf *, struct inode *);
@@ -70,8 +71,13 @@
 	struct inode *ip;
 	struct m_ext2fs *fs;
 	struct buf *bp;
+        struct ext4_extent *ep;
+        struct ext4_extent_header *ehp;
+        struct ext4_extent_path path[20];
 	int32_t lbn;
 	int bsize, error;
+        int depth;
+        daddr_t newblk;
 
 	ip = VTOI(vp);
 	fs = ip->i_e2fs;
@@ -79,13 +85,38 @@
 	bsize = blksize(fs, ip, lbn);
 
 	*bpp = NULL;
-	if ((error = bread(vp, lbn, bsize, NOCRED, &bp)) != 0) {
-		brelse(bp);
-		return (error);
-	}
-	if (res)
-		*res = (char *)bp->b_data + blkoff(fs, offset);
-	*bpp = bp;
+        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)
+                goto normal;
+        ehp = path[depth].ep_header;
+        ep = path[depth].ep_ext;
+        if (ep == NULL)
+                goto normal;
+
+        newblk = lbn - ep->e_blk +
+            (ep->e_start_lo | ((daddr_t)(ep->e_start_hi) << 31) << 1);
+
+        if ((error = bread(ip->i_devvp, fsbtodb(fs, newblk), bsize, NOCRED, &bp)) != 0) {
+                brelse(bp);
+                return (error);
+        }
+        if (res)
+                *res = (char *)bp->b_data + blkoff(fs, offset);
+        *bpp = bp;
+        return (0);
+
+normal:
+        if (*bpp == NULL) {
+                if ((error = bread(vp, lbn, bsize, NOCRED, &bp)) != 0) {
+                        brelse(bp);
+                        return (error);
+                }
+                if (res)
+                        *res = (char *)bp->b_data + blkoff(fs, offset);
+                *bpp = bp;
+        }
 	return (0);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007140828.o6E8SLm3097547>