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));
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to