Sebastian Messmer
d626349802
Finish MockBlockStore to also collect other performance metrics, and implement the standard block store tests for it.
2016-07-15 10:23:09 +02:00
Sebastian Messmer
f42e08a5f6
Fix DataTree::key() when called while traversing
2016-07-14 17:56:47 +02:00
Sebastian Messmer
6ff0839e90
Add locking to blob
2016-07-14 16:36:30 +02:00
Sebastian Messmer
457ca52eb3
Add assertions to unique_ref
2016-07-14 16:29:02 +02:00
Sebastian Messmer
7ea08fc2b0
Add test cases for removing nodes
2016-07-14 16:12:51 +02:00
Sebastian Messmer
91bf6c3647
Keep resource destructor in ParallelAccessStore under mutex
2016-07-14 15:10:52 +02:00
Sebastian Messmer
3f04a7411c
If tree depth increases, and we already traversed the old tree, don't go into it again to grow its last leaf.
2016-07-14 14:23:15 +02:00
Sebastian Messmer
cbe122cb5f
Add assertions
2016-07-14 13:23:36 +02:00
Sebastian Messmer
0bb6b320d4
Add asserts
2016-07-14 12:58:42 +02:00
Sebastian Messmer
0dbfdf3e2b
When shrinking a tree, LeafTraverser takes care of decreasing tree depth, not DataTree anymore. This way, LeafTraverser is now responsible for increasing and decreasing depth as necessary.
2016-07-14 12:55:54 +02:00
Sebastian Messmer
35a4e42ba5
Small fixes in traversal algorithm
2016-07-14 12:38:25 +02:00
Sebastian Messmer
fce81f47ff
Simplify code a bit and add assertions
2016-07-14 12:03:15 +02:00
Sebastian Messmer
9e9369b9ed
Performance optimization: When removing or shrinking a tree, we don't load/read leaves anymore. Loading inner nodes is enough to get all block IDs and then we can delete the leaves from their IDs without loading them.
2016-07-13 11:27:31 +02:00
Sebastian Messmer
7a68757599
Remove unneeded subtrees when shrinking tree
2016-07-13 07:08:53 +02:00
Sebastian Messmer
cf38eb0eb3
Use tree traversal to remove data tree.
2016-07-13 00:29:36 +02:00
Sebastian Messmer
508766d2f2
Fix traversal and add test cases
2016-07-13 00:22:35 +02:00
Sebastian Messmer
845b0b5239
Use LeafTraversor for resizing blobs
2016-07-12 20:36:12 +02:00
Sebastian Messmer
a19d79361c
If a tree is grown by a traversal, the tree is kept in a balanced state as long as possible during the traversal
2016-07-12 09:57:56 +02:00
Sebastian Messmer
1bf20277e4
Removed unnecessary code
2016-07-12 01:10:27 +02:00
Sebastian Messmer
58f2212043
Don't query size on traversal
2016-07-12 01:09:30 +02:00
Sebastian Messmer
582c9c1a4c
Fix traversal
2016-07-12 01:04:33 +02:00
Sebastian Messmer
98b85ea8b6
Started rewriting traversal
2016-07-10 22:57:39 +02:00
Sebastian Messmer
2bc3b641aa
Allow Data::FillWithZeroes on rvalue
2016-07-10 22:43:07 +02:00
Sebastian Messmer
dde89da556
Improve traverseLeaves
2016-07-10 08:38:02 +02:00
Sebastian Messmer
0d860fa4f0
Speed up block loading/storing by issuing only one read/write syscall to the base file system
2016-07-06 15:35:51 -07:00
Sebastian Messmer
7348f7c64d
Add checks to Data::LoadFromFile() and Data::StoreToFile()
2016-07-06 15:28:14 -07:00
Sebastian Messmer
e85019e95b
Cache value of DataTree.numLeaves(). This should make read()/write() faster.
2016-07-05 23:56:44 -07:00
Sebastian Messmer
a242076ecc
Performance improvement: Allow more parallelity when getting read()/write() syscalls to the same blob
2016-07-05 23:02:59 -07:00
Sebastian Messmer
ff0ba06846
Add mutex to fix race condition
2016-06-29 16:42:43 -07:00
Sebastian Messmer
b7b5dfba2a
Fix generation of new file systems
2016-06-27 22:31:06 -07:00
Sebastian Messmer
3425760daf
Implement migration for old filesystems that don't have parent pointers.
2016-06-27 20:03:44 -07:00
Sebastian Messmer
bfb397f44e
Tell user to not interrupt migration process
2016-06-27 20:01:02 -07:00
Sebastian Messmer
397de9372f
Each blob stores a parent pointer (i.e. the ID of the directory that contains this blob). This stores the directory structure in a conflict-proof way and can be used to resolve such conflicts.
2016-06-27 18:22:13 -07:00
Sebastian Messmer
a7f13ad7c1
When creating a file system, the user can choose whether to choose missing blocks as integrity violations.
2016-06-26 23:24:32 -07:00
Sebastian Messmer
2451a8c46f
Add --missing-block-is-integrity-violation option. The option doesn't have an effect yet though.
2016-06-26 22:16:44 -07:00
Sebastian Messmer
be8dffb24d
MyClientId is generated outside of CryDevice to give the CryConfigCreator access to it.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
7b56706c1a
Be explicit about types stored in config file
2016-06-26 22:15:52 -07:00
Sebastian Messmer
b838046246
Add a 'exclusive client' option to the config file
2016-06-26 22:15:52 -07:00
Sebastian Messmer
514dbcb6c7
ClientId is not loaded/generated inside of KnownBlockVersions, but in CryDevice. This way, CryDevice also has access to the ClientID. This is later needed to recognize whether we're in a single-client or in a multi-client setting.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
1c654305a8
In integrity violations, use individual messages saying which check exactly failed.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
f066b45954
VersionCountingBlockStore::forEachBlock() has an integrity check checking that all expected blocks are still existing.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
491b277cee
In case of an integrity violation, tell the user how they can reset integrity data.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
839a511c4d
When an integrity violation is detected, any further access to the file system is blocked. This ensures that the user notices the integrity violation.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
c84a230afd
VersionCountingBlockStore is initialized with a flag, saying whether missing blocks are integrity errors. This flag is meant to be activated in a single-client scenario to have this additional integrity check.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
e02021ecdc
Throw an IntegrityViolationError exception instead of just logging integrity violations. This makes sure the user notices.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
d306f4872e
Fix merge error
2016-06-26 22:15:52 -07:00
Sebastian Messmer
fd5dd2c6e1
New way of handling block deletions: Set last-update-client-id to zero instead of increasing version number. This has the same effect (i.e. invalidates all known block versions) and it additionally allows for checking in a local list whether a block is deleted or not.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
ee1f0f4d3a
Warn in migration that it might take a while
2016-06-26 22:15:52 -07:00
Sebastian Messmer
86c2144a37
Implement migration from file systems without version numbers
2016-06-26 22:15:52 -07:00
Sebastian Messmer
f9a10eea4d
Fix VersionCountingBlock::resize()
2016-06-26 22:15:52 -07:00
Sebastian Messmer
473e9cc8bb
Fix compiler errors
2016-06-26 22:15:52 -07:00
Sebastian Messmer
1a72d3c226
Deleting a block doesn't set the version number to MAX_UINT64, but just increases it by one. This makes sure, that if (in case of a synchronization conflict) the block is reintroduced by another client, this is accepted.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
5534b56ce3
When increasing the version number, don't only look at the version number in the block, but also at the last version number given to it by the current client. Ensure, the new version number is higher than both.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
577c697856
When a client deletes a block, it will never again accept it as a valid block.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
9c1a12c063
Fix merge
2016-06-26 22:15:52 -07:00
Sebastian Messmer
e7ac9bec57
Implement BlockStore::forEachBlock
2016-06-26 22:15:52 -07:00
Sebastian Messmer
4d1f7a46b9
* Prevent rollback to the "newest" version of a client when this version was superseded by a version from a different client.
...
* Use mutex/locks to secure access to KnownBlockVersions
2016-06-26 22:15:52 -07:00
Sebastian Messmer
263c540cd0
Make sure, ClientIdAndBlockKey.h includes all its dependencies
2016-06-26 22:15:52 -07:00
Sebastian Messmer
ea3de7360c
* Block versions don't have to be globally nondecreasing, but only per client id. This solves potential synchronization conflicts in a multi-client setting.
...
* Use cpputils::Serializer and cpputils::Deserializer instead of std::ifstream for storing/loading the block version list
2016-06-26 22:15:52 -07:00
Sebastian Messmer
de692c1ee4
Store number of entries at beginning of integrity file, so loading can be faster using unordered_map::reserve()
2016-06-26 22:15:52 -07:00
Sebastian Messmer
adb10343d2
Only hash key once if key not found, i.e. use [] instead of find() and then emplace()
2016-06-26 22:15:52 -07:00
Sebastian Messmer
389273a24f
Test cases use a fake home directory for their configuration, so they don't clutter the actual home directory.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
9da30e3c17
Remove redundant nullbyte
2016-06-26 22:15:52 -07:00
Sebastian Messmer
57af168cfd
Store own client id into the block next to the version number. This will be used to fix synchronization conflicts where the version number on one clients progresses slower than on another client, but synchronizes later.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
a5391a854d
Use VersionCountingBlockStore
2016-06-26 22:15:52 -07:00
Sebastian Messmer
13411c4e59
Integrity data from KnownBlockVersions is persisted to a file
2016-06-26 22:15:52 -07:00
Sebastian Messmer
d7f547dd47
Implement a VersionCountingBlockStore that checks that version numbers are nondecreasing. Currently, the block store is not used yet and the state is not stored over different runs of CryFS. This comes with future commits.
2016-06-26 22:15:52 -07:00
Sebastian Messmer
f4a7878e37
Compatibility with GCC 6
2016-06-26 21:26:08 -07:00
Sebastian Messmer
0a61987594
Be explicit about types stored in config file
2016-06-26 15:34:53 -07:00
Sebastian Messmer
f6a80a4651
Remove default config values for mandatory values
2016-06-26 15:26:05 -07:00
Sebastian Messmer
acedbbd0c4
Fix EncryptedBlock::resize() and add test cases for it
2016-06-23 21:20:36 -07:00
Sebastian Messmer
fcbca9ddea
Improve performance of InMemoryBlockStore and FakeBlockStore by using std::unordered_map instead of std::map and the direct representation of a block Key as Key instead of a string representation.
2016-06-23 12:26:47 -07:00
Sebastian Messmer
3db931c54d
Fix mount information reported to operating system
2016-06-22 17:57:00 -07:00
Sebastian Messmer
e4501d51e5
Each file system gets a unique ID. This ID will later be used to store local configuration of a client for that file system.
2016-06-20 16:14:07 -07:00
Sebastian Messmer
b3c5d4b5e3
Refactor TimestampTestUtils
2016-06-09 17:47:29 -07:00
Sebastian Messmer
c5ccd9c2d1
Set cache entry to dirty when timestamps are changed. Otherwise, it wouldn't be written back.
2016-06-09 17:32:35 -07:00
Sebastian Messmer
e8ad454e47
TODOs
2016-06-08 12:35:56 -07:00
Sebastian Messmer
e2ec72edde
Remove unused function
2016-06-08 12:29:28 -07:00
Sebastian Messmer
5aff394a16
Directory timestamps are updated correctly. Also added test cases for this.
2016-06-08 12:21:57 -07:00
Sebastian Messmer
5a5037c992
Symlinks update atime correctly. Also added a test case for this.
2016-06-07 21:47:23 -07:00
Sebastian Messmer
69f4c7976e
File::truncate() updates timestamps correctly. Also added test cases for this.
2016-06-07 21:30:57 -07:00
Sebastian Messmer
6448110975
OpenFile updates timestamps correctly, i.e. on read(), write() and truncate(). Also added test cases for it.
2016-06-07 21:25:02 -07:00
Sebastian Messmer
06a5faf2f8
Generalize timestamp expectations
2016-06-07 20:48:29 -07:00
Sebastian Messmer
9bb2e2e89a
Implement fsync() and fdatasync() syscalls for flushing open files
2016-06-07 18:36:59 -07:00
Sebastian Messmer
be31d78349
Make TimestampTestUtils generic
2016-06-07 13:07:22 -07:00
Sebastian Messmer
93f34a4557
Run FsppDeviceTest_Timestamps on all kinds of nodes, not just files
2016-06-07 12:48:21 -07:00
Sebastian Messmer
8bf8081464
Fix sigsev on startup which was introduced by commit 1bb38f39b4
2016-06-07 12:44:35 -07:00
Sebastian Messmer
2642507344
Allow loading file systems from future cryfs versions if user specifically asks for it
2016-06-06 15:31:09 -07:00
Sebastian Messmer
7708287fdd
Add test case that loading a node doesn't modify time stamps
2016-06-06 15:20:41 -07:00
Sebastian Messmer
1bb38f39b4
* Fix FuseTest
...
* Refactor Fuse: shorter functions, and factor out common functionality of adding a fuse option into own method
2016-06-04 00:45:49 -07:00
Sebastian Messmer
93927e76d6
TODOs
2016-06-02 20:25:14 -07:00
Sebastian Meßmer
3894157589
Merge pull request #61 from mhogomchungu/develop
...
remove compiler warnings
2016-06-02 20:21:54 -07:00
Sebastian Messmer
1402f54fec
Factor out platform inconsistency between Mac and Linux (stat.st_atim vs stat.st_atimespec)
2016-06-02 20:08:51 -07:00
Francis Banyikwa
f2b7aac76a
use boost::optional for an optional argument in Fuse class
2016-06-02 21:58:04 +03:00
Francis Banyikwa
92d8f939ac
move setting of fuse options to Fuse class
2016-06-02 12:51:44 +03:00
Francis Banyikwa
183d6a9d06
dont hard code "cryfs" name in the fspp library
2016-06-02 11:17:55 +03:00
Francis Banyikwa
c5a6f16cd5
use a macro to silence compiler warnings
2016-06-02 09:54:39 +03:00
Francis Banyikwa
002dc6ca17
solve issue number 24
2016-06-01 13:37:44 +03:00
Francis Banyikwa
2cf4a2e087
use project name as the first argument to fuse
2016-06-01 11:55:48 +03:00
Francis Banyikwa
de6462e548
remove compiler warnings
2016-06-01 11:34:19 +03:00
Sebastian Messmer
61e56cfeab
Fix small rename corner case and add test cases for timestamps in many rename corner cases
2016-05-27 21:19:04 -07:00
Sebastian Messmer
54ec08bc9d
TODOs
2016-05-27 17:47:14 -07:00
Sebastian Messmer
514de8794e
Add test cases that fspp::Node operations correctly modify the timestamps
2016-05-27 17:26:53 -07:00
Sebastian Messmer
183b9cf74b
Fix utimens() behavior: It now updates ctime as well.
2016-05-27 17:26:23 -07:00
Sebastian Messmer
3b98fc0390
Offer timespec comparison operators
2016-05-27 16:35:45 -07:00
Sebastian Messmer
f6545bbcc3
Move fsblobstore::now() to cpputils
2016-05-27 15:46:05 -07:00
Sebastian Messmer
40c64a879c
Hide fuse quirks inside the Fuse class.
...
fuse_main needs the program arguments as char ** instead of const char ** or (even better) vector<string>.
With this commit, we hide that inside the Fuse class. Everything outside handles these arguments as vector<string> and passes it as such to the Fuse class.
2016-05-09 16:07:02 -07:00
Sebastian Messmer
652cf90255
Merge branch 'develop' of github.com:cryfs/cryfs into develop
2016-05-03 22:23:38 -07:00
Sebastian Messmer
285dd05072
When counting blocks, ignore cryfs.config. This already worked on Linux, but not on Mac. After this commit, it is also fixed for Mac.
2016-05-03 22:21:28 -07:00
Sebastian Messmer
9a0b0a0c36
Ask before migrating an old CryFS file system to a new version.
2016-05-03 20:34:30 -07:00
Sebastian Messmer
257b028511
Prevent opening file systems that were created with newer versions of CryFS
2016-04-29 12:46:14 -07:00
Sebastian Messmer
2fbed11431
Remove debug output
2016-04-29 12:38:53 -07:00
Sebastian Messmer
5aaba511bd
Fix migration step for new ciphertext layout
2016-04-29 12:35:17 -07:00
Sebastian Messmer
9ed7bd0b41
Ciphertext blocks are split into subdirectories (before, all were on top level) to reduce number of files per directory. Some unix tools don't work well with directories with too many entries.
2016-04-29 12:21:02 -07:00
Sebastian Messmer
4829f4bcec
Extend test cases for rename with overwrite
2016-04-29 11:07:47 -07:00
Sebastian Messmer
33644af64d
Extend test cases for trying to rename a file to an existing directory or the other way round
2016-04-28 23:14:33 -07:00
Sebastian Messmer
bfba538818
Fix rename corner cases: Overwriting an existing directory with a file or the other way round
2016-04-28 22:49:57 -07:00
Sebastian Messmer
66b52b6434
Fix rename corner case: Renaming element to its old name
2016-04-28 22:36:53 -07:00
Sebastian Messmer
a03ab91aba
Fix rename when overwriting an existing file in the same directory
2016-04-28 13:27:54 -07:00
Sebastian Messmer
c403ec6b48
Fix a potential deadlock in the cache
2016-04-26 18:09:42 -07:00
Sebastian Messmer
811c163bfa
Fix rename() when overwriting an existing file: (a) Keep the invariant that the list of directory entries is sorted and (b) delete the blob of the overwritten file
2016-04-25 17:42:17 -07:00
Sebastian Messmer
f0d11bb5a7
Fail build if gitversion cannot be found
2016-04-01 11:39:28 +02:00
Sebastian Messmer
4627666788
Generalize stat() tests in FsppFileTest for all node types
2016-03-31 23:48:43 +08:00
Sebastian Messmer
e7c4f8150e
Factor out FsppNodeTest to allow using its mechanisms for other test cases and not only for rename
2016-03-31 21:45:41 +08:00
Sebastian Messmer
f5305aa95d
Better error messages when parsing version information fails
2016-03-31 21:18:39 +08:00
Sebastian Messmer
4069358b31
Fix VersionCompare for stable versions vs tag versions
2016-03-29 11:07:00 +08:00
Sebastian Messmer
03f59b69da
Since 0.9.3-alpha set the config value cryfs.blocksizeBytes wrongly to 32768 (but didn't use the value), we have to add a workaround.
2016-03-26 23:56:56 +08:00
Sebastian Messmer
b9ac810414
- The version field in the config file is updated when the file system is opened with a newer CryFS version (i.e. it is migrated to the newer version).
...
- We introduced a CreatedWithVersion field instead which gets the semantics the version field had before (i.e. which version of CryFS was the file system originally created with)
- Move VersionCompare to gitversion package
2016-03-27 00:09:07 +08:00
Sebastian Messmer
7b5970a94e
TODOs
2016-03-24 07:57:19 +00:00
Sebastian Messmer
67c5495db7
TODOs
2016-03-24 07:56:41 +00:00
Sebastian Messmer
99aa86720c
TODOs
2016-03-24 07:55:37 +00:00
Sebastian Messmer
18d05d165e
Use --blocksize instead of --blocksize-bytes, so we can (later) allow users to write "--blocksize 2M"
2016-03-24 06:45:41 +00:00
Sebastian Messmer
6e7004d485
Rename operation allows overwriting existing files.
2016-03-24 02:47:50 +00:00
Sebastian Messmer
03ccead85b
Add test cases for rename
2016-03-24 01:45:53 +00:00
Sebastian Messmer
2ac47f480b
- Fix rename bug: When trying to rename a file to a name that already exists, it was deleted instead. This is now fixed.
...
- Additional test cases for rename
2016-03-23 18:03:30 +00:00
Sebastian Messmer
db53b597d4
Handle renaming root directory correctly
2016-03-23 16:07:08 +00:00
Sebastian Messmer
1c0199e147
When the user specifies a block size for the file system, this is taken as the physical block size, not virtual block size.
2016-03-16 19:30:26 +00:00
Sebastian Messmer
037b59634e
Implemented BlockStore::blockSizeFromPhysicalBlockSize. This will be used to let the user configure physical block size instead of virtual block size.
2016-03-16 18:56:06 +00:00
Sebastian Messmer
0cdfb8ba2e
Fix fstat (a bug in the fstat implementation caused problems with some text editors (e.g. nano) falsely thinking a file changed since they opened it).
2016-03-16 17:03:53 +00:00
Sebastian Messmer
e4ff7e17f1
Add test cases to fstest::FileTest
2016-03-16 15:31:59 +00:00
Sebastian Messmer
52d85f4de3
Refactor DirEntries
2016-03-16 15:29:26 +00:00
Sebastian Messmer
5f8bf4cea4
Fix version number mentioned in comment
2016-03-09 00:23:11 +01:00
Sebastian Messmer
1ee3a8df86
Use uint64_t for block size
2016-03-09 00:20:04 +01:00
Sebastian Messmer
08c1d206af
Fix compiler error
2016-03-09 00:13:18 +01:00
Sebastian Messmer
d7f34c0dfb
Make blocksize configurable
2016-03-08 23:57:34 +01:00
Sebastian Messmer
4dbb380263
Decouple DirBlob from CryDevice
2016-03-08 23:47:31 +01:00
Sebastian Messmer
526b749d1d
Add a command line option for blocksize
2016-03-04 23:12:41 +01:00
Sebastian Messmer
61611d03b2
Don't use <regex>, because it causes problems on GCC 4.8
2016-03-03 11:49:23 +01:00
Sebastian Messmer
5736a5ea37
Output warning to stderr, not stdout
2016-03-02 21:22:11 +01:00
Sebastian Messmer
5579270108
Handle fallback version "0+unknown" correctly
2016-03-02 14:39:30 +01:00