Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Jun 2013 09:34:46 +0300
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        fs@freebsd.org
Subject:   Re: missed clustering for small block sizes in cluster_wbuild()
Message-ID:  <20130611063446.GJ3047@kib.kiev.ua>
In-Reply-To: <20130607044845.O24441@besplex.bde.org>
References:  <20130607044845.O24441@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--hCS/BWoPfTdmYtZi
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Fri, Jun 07, 2013 at 05:28:11AM +1000, Bruce Evans wrote:
> I think this is best fixed be fixed by removing the check above and
> checking here.  Then back out of the changes.  I don't know this code
> well enough to write the backing out easily.

Could you test this, please ?

diff --git a/sys/kern/vfs_cluster.c b/sys/kern/vfs_cluster.c
index b280317..9e1528e 100644
--- a/sys/kern/vfs_cluster.c
+++ b/sys/kern/vfs_cluster.c
@@ -766,7 +766,7 @@ cluster_wbuild(struct vnode *vp, long size, daddr_t sta=
rt_lbn, int len,
 {
 	struct buf *bp, *tbp;
 	struct bufobj *bo;
-	int i, j;
+	int i, j, jj;
 	int totalwritten =3D 0;
 	int dbsize =3D btodb(size);
=20
@@ -904,14 +904,10 @@ cluster_wbuild(struct vnode *vp, long size, daddr_t s=
tart_lbn, int len,
=20
 				/*
 				 * Check that the combined cluster
-				 * would make sense with regard to pages
-				 * and would not be too large
+				 * would make sense with regard to pages.
 				 */
-				if ((tbp->b_bcount !=3D size) ||
-				  ((bp->b_blkno + (dbsize * i)) !=3D
-				    tbp->b_blkno) ||
-				  ((tbp->b_npages + bp->b_npages) >
-				    (vp->v_mount->mnt_iosize_max / PAGE_SIZE))) {
+				if (tbp->b_bcount !=3D size ||
+				    bp->b_blkno + dbsize * i !=3D tbp->b_blkno) {
 					BUF_UNLOCK(tbp);
 					break;
 				}
@@ -964,6 +960,22 @@ cluster_wbuild(struct vnode *vp, long size, daddr_t st=
art_lbn, int len,
 						bp->b_pages[bp->b_npages] =3D m;
 						bp->b_npages++;
 					}
+					if (bp->b_npages > vp->v_mount->
+					    mnt_iosize_max / PAGE_SIZE) {
+						KASSERT(i !=3D 0, ("XXX"));
+						j++;
+						for (jj =3D 0; jj < j; jj++) {
+							vm_page_io_finish(tbp->
+							    b_pages[jj]);
+						}
+						vm_object_pip_subtract(
+						    m->object, j);
+						bqrelse(tbp);
+						bp->b_npages -=3D j;
+						VM_OBJECT_WUNLOCK(tbp->
+						    b_bufobj->bo_object);
+						goto finishcluster;
+					}
 				}
 				VM_OBJECT_WUNLOCK(tbp->b_bufobj->bo_object);
 			}

--hCS/BWoPfTdmYtZi
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (FreeBSD)

iQIcBAEBAgAGBQJRtsUGAAoJEJDCuSvBvK1B8FUP/3J+JkxgJ7jdQvkOyp21fibx
b/iiN19fnd3Ih1sDtLvKXFKDguf17vOxoECqnlhhRjrI8mJMsghqMjKJ11CUsZGq
9LrkXWCLiwtecuP7Rupu8hczAj+Msf1HGwZMtNVwDRAuhL9fE9WX/EiWXFV5D+Z+
04SniVO6Fu+v9ZlPVjCaGhJMDsuMrtsphdiDpRjivgqWN85dvrGur2I8hYm6PTD4
1qBwxv3j5IR3dqRBFkZc+jrYjpRjA5UIAtmJc+3iJlZvL4963od1m48x0L+Wdtit
+mfBDEaXN8gCAbtbN3QW1s+9WUKcqFcucYsECcb9wEjNi5aKjb0FLDPqEJWRoBVS
dqHwXc8bI3KM3+fVoTIhTJDgmkTaCZEvTSCkmGgS1e5B7f4H5My+X7jzaonf7pl3
Jeoab2J6dZ6mwu1xh9Kk+nN80NwGiujx5hW9NgBC7MD7xxvQL5JGmwz/HU1LGZfO
RL4Yi1g0dxobOWAfusK+rZDTEhzKts0vvrRgxk0O+LmEibx0WPcg/nkv8t60wE6U
4bBb7pxXudqTmmGuswKkGrNmP0F7HJFjn7kjkkbacnJRLPA9sOHh+MYW7V9dDIw5
T2Uk12Mm4aKX/hjHEWl6x87PIx384LyW9GiCkWcyFHqwH41SqYz7CgVUuNMqlv/P
f6YwIcq9W9OocqF26iZ0
=DAlx
-----END PGP SIGNATURE-----

--hCS/BWoPfTdmYtZi--



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