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@
This commit is contained in:
Warner Losh 2015-10-16 03:06:02 +00:00
parent 07d684f712
commit 476dfdc3bf

View File

@ -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));
}