From bf3a7442eb3ac07760a3a8729af01c47dbbe899b Mon Sep 17 00:00:00 2001 From: Yura Pakhuchiy Date: Sat, 15 Sep 2007 23:03:10 +0300 Subject: [PATCH] ntfs_attr_pwrite: Write 4096 bytes blocks when possible. (David Fox, Szaka, Anton, Yura) --- libntfs/attrib.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/libntfs/attrib.c b/libntfs/attrib.c index 21d5a513..aae2e123 100644 --- a/libntfs/attrib.c +++ b/libntfs/attrib.c @@ -1323,11 +1323,37 @@ retry: ntfs_log_trace("Writing 0x%llx bytes to vcn 0x%llx, lcn 0x%llx," " ofs 0x%llx.\n", to_write, rl->vcn, rl->lcn, ofs); - if (!NVolReadOnly(vol)) - written = ntfs_pwrite(vol->dev, (rl->lcn << - vol->cluster_size_bits) + ofs, - to_write, b); - else + if (!NVolReadOnly(vol)) { + s64 pos = (rl->lcn << vol->cluster_size_bits) + ofs; + int bsize = 4096; /* FIXME: Test whether we need + PAGE_SIZE here. Eg., on IA64. */ + /* + * Write 4096 size blocks if it's possible. This will + * cause the kernel not to seek and read disk blocks for + * filling the end of the buffer which increases write + * speed. + */ + if (vol->cluster_size >= bsize && !(ofs % bsize) && + (to_write % bsize) && ofs + to_write == + na->initialized_size) { + char *cb; + s64 rounded = (to_write + bsize - 1) & + ~(bsize - 1); + + cb = ntfs_malloc(rounded); + if (!cb) + goto err_out; + memcpy(cb, b, to_write); + memset(cb + to_write, 0, rounded - to_write); + written = ntfs_pwrite(vol->dev, pos, rounded, + cb); + if (written > to_write) + written = to_write; + free(cb); + } else + written = ntfs_pwrite(vol->dev, pos, to_write, + b); + } else written = to_write; /* If everything ok, update progress counters and continue. */ if (written > 0) {