Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Oct 2015 03:06:02 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r289405 - head/sys/ufs/ffs
Message-ID:  <201510160306.t9G3622O049128@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Fri Oct 16 03:06:02 2015
New Revision: 289405
URL: https://svnweb.freebsd.org/changeset/base/289405

Log:
  Do not relocate extents to make them contiguous if the underlying drive can do
  deletions. Ability to do deletions is a strong indication that this
  optimization will not help performance. It will only generate extra write
  traffic. These devices are typically flash based and have a limited number of
  write cycles. In addition, making the file contiguous in LBA space doesn't
  improve the access times from flash devices because they have no seek time.
  
  Reviewed by: mckusick@

Modified:
  head/sys/ufs/ffs/ffs_alloc.c

Modified: head/sys/ufs/ffs/ffs_alloc.c
==============================================================================
--- head/sys/ufs/ffs/ffs_alloc.c	Fri Oct 16 03:03:04 2015	(r289404)
+++ head/sys/ufs/ffs/ffs_alloc.c	Fri Oct 16 03:06:02 2015	(r289405)
@@ -481,9 +481,19 @@ ffs_reallocblks(ap)
 		struct cluster_save *a_buflist;
 	} */ *ap;
 {
+	struct ufsmount *ump;
 
-	if (doreallocblks == 0)
+	/*
+	 * If the underlying device can do deletes, then skip reallocating
+	 * the blocks of this file into contiguous sequences. Devices that
+	 * benefit from BIO_DELETE also benefit from not moving the data.
+	 * These devices are flash and therefore work less well with this
+	 * optimization. Also skip if reallocblks has been disabled globally.
+	 */
+	ump = VTOI(ap->a_vp)->i_ump;
+	if (ump->um_candelete || doreallocblks == 0)
 		return (ENOSPC);
+
 	/*
 	 * We can't wait in softdep prealloc as it may fsync and recurse
 	 * here.  Instead we simply fail to reallocate blocks if this
@@ -492,7 +502,7 @@ ffs_reallocblks(ap)
 	if (DOINGSOFTDEP(ap->a_vp))
 		if (softdep_prealloc(ap->a_vp, MNT_NOWAIT) != 0)
 			return (ENOSPC);
-	if (VTOI(ap->a_vp)->i_ump->um_fstype == UFS1)
+	if (ump->um_fstype == UFS1)
 		return (ffs_reallocblks_ufs1(ap));
 	return (ffs_reallocblks_ufs2(ap));
 }



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