diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-07-04 15:03:35 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-07-04 15:03:35 +0000 |
| commit | a5cc350dcf6cf83a84b5845e0f61230f1f42e7c7 (patch) | |
| tree | 38d73b2aebcdd3c26d76782690d6bb10fe29ad86 /src/AbstractDiskWriter.cc | |
| parent | 8f10241e25d796655a8aaaf7cf69c7061d05bc43 (diff) | |
2010-07-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
When allocating disk space, for Linux system with fallocate()
system call, first check file system supports fallocate. This
just run fallocate with small chunk and see it succeeds or fails.
If it succeeds, use fallocate() to allocate entire file otherwise
fall back to traditional slower method: writing zeros. This
behavior is enabled in --file-allocation=prealloc, so this is
enabled by default for most modern Linux.
* configure.ac
* src/AbstractDiskWriter.cc
* src/AbstractDiskWriter.h
* src/AbstractSingleDiskAdaptor.cc
* src/AdaptiveFileAllocationIterator.cc
* src/AdaptiveFileAllocationIterator.h
* src/DefaultPieceStorage.cc
* src/DiskAdaptor.cc
* src/DiskAdaptor.h
* src/FallocFileAllocationIterator.cc
* src/Makefile.am
* src/MultiFileAllocationIterator.cc
* src/OptionHandlerFactory.cc
* test/FallocFileAllocationIteratorTest.cc
* test/Makefile.am
Diffstat (limited to 'src/AbstractDiskWriter.cc')
| -rw-r--r-- | src/AbstractDiskWriter.cc | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index e06e4732..1c4fdc1d 100644 --- a/src/AbstractDiskWriter.cc +++ b/src/AbstractDiskWriter.cc @@ -193,19 +193,31 @@ void AbstractDiskWriter::truncate(uint64_t length) #endif } -#ifdef HAVE_POSIX_FALLOCATE void AbstractDiskWriter::allocate(off_t offset, uint64_t length) { +#ifdef HAVE_SOME_FALLOCATE if(fd_ == -1) { throw DL_ABORT_EX("File not yet opened."); } +# ifdef HAVE_FALLOCATE + // For linux, we use fallocate to detect file system supports + // fallocate or not. + int r = fallocate(fd_, 0, offset, length); + if(r == -1) { + throw DL_ABORT_EX(StringFormat("fallocate failed. cause: %s", + strerror(errno)).str()); + } +# elif HAVE_POSIX_FALLOCATE int r = posix_fallocate(fd_, offset, length); if(r != 0) { throw DL_ABORT_EX(StringFormat("posix_fallocate failed. cause: %s", strerror(r)).str()); } +# else +# error "no *_fallocate function available." +# endif +#endif // HAVE_SOME_FALLOCATE } -#endif // HAVE_POSIX_FALLOCATE uint64_t AbstractDiskWriter::size() { |
