Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Jan 2016 14:15:09 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r294323 - stable/9/sys/fs/ext2fs
Message-ID:  <201601191415.u0JEF93P013366@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pfg
Date: Tue Jan 19 14:15:09 2016
New Revision: 294323
URL: https://svnweb.freebsd.org/changeset/base/294323

Log:
  Revert r294273
  MFC	r293680
  ext4: add support for reading sparse files
  
  The change was meant for newer versions and doesn't work out of the box.
  While it seems easy to adapt I prfer not to have the implementations
  diverge at this time.
  
  Reported by:	Arrigo Marchiori
  PR:		205816

Modified:
  stable/9/sys/fs/ext2fs/ext2_bmap.c
  stable/9/sys/fs/ext2fs/ext2_extents.c
  stable/9/sys/fs/ext2fs/ext2_extents.h
  stable/9/sys/fs/ext2fs/ext2_vnops.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/fs/   (props changed)

Modified: stable/9/sys/fs/ext2fs/ext2_bmap.c
==============================================================================
--- stable/9/sys/fs/ext2fs/ext2_bmap.c	Tue Jan 19 13:15:57 2016	(r294322)
+++ stable/9/sys/fs/ext2fs/ext2_bmap.c	Tue Jan 19 14:15:09 2016	(r294323)
@@ -102,6 +102,9 @@ ext4_bmapext(struct vnode *vp, int32_t b
 	fs = ip->i_e2fs;
 	lbn = bn;
 
+	/*
+	 * TODO: need to implement read ahead to improve the performance.
+	 */
 	if (runp != NULL)
 		*runp = 0;
 
@@ -109,25 +112,15 @@ ext4_bmapext(struct vnode *vp, int32_t b
 		*runb = 0;
 
 	ext4_ext_find_extent(fs, ip, lbn, &path);
-	if (path.ep_is_sparse) {
-		*bnp = -1;
-		if (runp != NULL)
-			*runp = path.ep_sparse_ext.e_len -
-			    (lbn - path.ep_sparse_ext.e_blk) - 1;
-	} else {
-		ep = path.ep_ext;
-		if (ep == NULL)
-			ret = EIO;
-		else {
-			*bnp = fsbtodb(fs, lbn - ep->e_blk +
-			    (ep->e_start_lo | (daddr_t)ep->e_start_hi << 32));
+	ep = path.ep_ext;
+	if (ep == NULL)
+		ret = EIO;
+	else {
+		*bnp = fsbtodb(fs, lbn - ep->e_blk +
+		    (ep->e_start_lo | (daddr_t)ep->e_start_hi << 32));
 
-			if (*bnp == 0)
-				*bnp = -1;
-
-			if (runp != NULL)
-				*runp = ep->e_len - (lbn - ep->e_blk) - 1;
-		}
+		if (*bnp == 0)
+			*bnp = -1;
 	}
 
 	if (path.ep_bp != NULL) {

Modified: stable/9/sys/fs/ext2fs/ext2_extents.c
==============================================================================
--- stable/9/sys/fs/ext2fs/ext2_extents.c	Tue Jan 19 13:15:57 2016	(r294322)
+++ stable/9/sys/fs/ext2fs/ext2_extents.c	Tue Jan 19 14:15:09 2016	(r294323)
@@ -66,14 +66,13 @@ static void
 ext4_ext_binsearch(struct inode *ip, struct ext4_extent_path *path, daddr_t lbn)
 {
 	struct ext4_extent_header *ehp = path->ep_header;
-	struct ext4_extent *first, *l, *r, *m;
+	struct ext4_extent *l, *r, *m;
 
 	if (ehp->eh_ecount == 0)
 		return;
 
-	first = (struct ext4_extent *)(char *)(ehp + 1);
-	l = first;
-	r = first + ehp->eh_ecount - 1;
+	l = (struct ext4_extent *)(char *)(ehp + 1);
+	r = (struct ext4_extent *)(char *)(ehp + 1) + ehp->eh_ecount - 1;
 	while (l <= r) {
 		m = l + (r - l) / 2;
 		if (lbn < m->e_blk)
@@ -82,25 +81,7 @@ ext4_ext_binsearch(struct inode *ip, str
 			l = m + 1;
 	}
 
-	if (l == first) {
-		path->ep_sparse_ext.e_blk = lbn;
-		path->ep_sparse_ext.e_len = first->e_blk - lbn;
-		path->ep_sparse_ext.e_start_hi = 0;
-		path->ep_sparse_ext.e_start_lo = 0;
-		path->ep_is_sparse = 1;
-		return;
-	}
 	path->ep_ext = l - 1;
-	if (path->ep_ext->e_blk + path->ep_ext->e_len <= lbn) {
-		path->ep_sparse_ext.e_blk = lbn;
-		if (l <= (first + ehp->eh_ecount - 1))
-			path->ep_sparse_ext.e_len = l->e_blk - lbn;
-		else	// XXX: where does it end?
-			path->ep_sparse_ext.e_len = 1;
-		path->ep_sparse_ext.e_start_hi = 0;
-		path->ep_sparse_ext.e_start_lo = 0;
-		path->ep_is_sparse = 1;
-	}
 }
 
 /*
@@ -188,7 +169,6 @@ ext4_ext_find_extent(struct m_ext2fs *fs
 	path->ep_depth = i;
 	path->ep_ext = NULL;
 	path->ep_index = NULL;
-	path->ep_is_sparse = 0;
 
 	ext4_ext_binsearch(ip, path, lbn);
 	return (path);

Modified: stable/9/sys/fs/ext2fs/ext2_extents.h
==============================================================================
--- stable/9/sys/fs/ext2fs/ext2_extents.h	Tue Jan 19 13:15:57 2016	(r294322)
+++ stable/9/sys/fs/ext2fs/ext2_extents.h	Tue Jan 19 14:15:09 2016	(r294323)
@@ -84,11 +84,7 @@ struct ext4_extent_cache {
 struct ext4_extent_path {
 	uint16_t ep_depth;
 	struct buf *ep_bp;
-	int ep_is_sparse;
-	union {
-		struct ext4_extent ep_sparse_ext;
-		struct ext4_extent *ep_ext;
-	};
+	struct ext4_extent *ep_ext;
 	struct ext4_extent_index *ep_index;
 	struct ext4_extent_header *ep_header;
 };

Modified: stable/9/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- stable/9/sys/fs/ext2fs/ext2_vnops.c	Tue Jan 19 13:15:57 2016	(r294322)
+++ stable/9/sys/fs/ext2fs/ext2_vnops.c	Tue Jan 19 14:15:09 2016	(r294323)
@@ -1789,7 +1789,6 @@ ext2_ioctl(struct vop_ioctl_args *ap)
 static int
 ext4_ext_read(struct vop_read_args *ap)
 {
-	static unsigned char zeroes[EXT2_MAX_BLOCK_SIZE];
 	struct vnode *vp;
 	struct inode *ip;
 	struct uio *uio;
@@ -1834,15 +1833,11 @@ ext4_ext_read(struct vop_read_args *ap)
 		switch (cache_type) {
 		case EXT4_EXT_CACHE_NO:
 			ext4_ext_find_extent(fs, ip, lbn, &path);
-			if (path.ep_is_sparse)
-				ep = &path.ep_sparse_ext;
-			else
-				ep = path.ep_ext;
+			ep = path.ep_ext;
 			if (ep == NULL)
 				return (EIO);
 
-			ext4_ext_put_cache(ip, ep,
-			    path.ep_is_sparse ? EXT4_EXT_CACHE_GAP : EXT4_EXT_CACHE_IN);
+			ext4_ext_put_cache(ip, ep, EXT4_EXT_CACHE_IN);
 
 			newblk = lbn - ep->e_blk + (ep->e_start_lo |
 			    (daddr_t)ep->e_start_hi << 32);
@@ -1855,7 +1850,7 @@ ext4_ext_read(struct vop_read_args *ap)
 
 		case EXT4_EXT_CACHE_GAP:
 			/* block has not been allocated yet */
-			break;
+			return (0);
 
 		case EXT4_EXT_CACHE_IN:
 			newblk = lbn - nex.e_blk + (nex.e_start_lo |
@@ -1866,34 +1861,24 @@ ext4_ext_read(struct vop_read_args *ap)
 			panic("%s: invalid cache type", __func__);
 		}
 
-		if (cache_type == EXT4_EXT_CACHE_GAP ||
-		    (cache_type == EXT4_EXT_CACHE_NO && path.ep_is_sparse)) {
-			if (xfersize > sizeof(zeroes))
-				xfersize = sizeof(zeroes);
-			error = uiomove(zeroes, xfersize, uio);
-			if (error)
-				return (error);
-		} else {
-			error = bread(ip->i_devvp, fsbtodb(fs, newblk), size,
-			    NOCRED, &bp);
-			if (error) {
-				brelse(bp);
-				return (error);
-			}
+		error = bread(ip->i_devvp, fsbtodb(fs, newblk), size, NOCRED, &bp);
+		if (error) {
+			brelse(bp);
+			return (error);
+		}
 
-			size -= bp->b_resid;
-			if (size < xfersize) {
-				if (size == 0) {
-					bqrelse(bp);
-					break;
-				}
-				xfersize = size;
+		size -= bp->b_resid;
+		if (size < xfersize) {
+			if (size == 0) {
+				bqrelse(bp);
+				break;
 			}
-			error = uiomove(bp->b_data + blkoffset, xfersize, uio);
-			bqrelse(bp);
-			if (error)
-				return (error);
+			xfersize = size;
 		}
+		error = uiomove(bp->b_data + blkoffset, (int)xfersize, uio);
+		bqrelse(bp);
+		if (error)
+			return (error);
 	}
 
 	return (0);



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