OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/drive/file_cache.h" | 5 #include "components/drive/file_cache.h" |
6 | 6 |
7 #include <unistd.h> | |
8 | |
9 #include <queue> | 7 #include <queue> |
10 #include <vector> | 8 #include <vector> |
11 | 9 |
12 #include "base/bind.h" | 10 #include "base/bind.h" |
13 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
14 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
15 #include "base/files/file_enumerator.h" | 13 #include "base/files/file_enumerator.h" |
16 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
17 #include "base/location.h" | 15 #include "base/location.h" |
18 #include "base/logging.h" | 16 #include "base/logging.h" |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 const std::string& id = GetIdFromPath(new_path); | 674 const std::string& id = GetIdFromPath(new_path); |
677 new_path = GetCacheFilePath(util::CanonicalizeResourceId(id)); | 675 new_path = GetCacheFilePath(util::CanonicalizeResourceId(id)); |
678 if (new_path != current && !base::Move(current, new_path)) | 676 if (new_path != current && !base::Move(current, new_path)) |
679 return false; | 677 return false; |
680 } | 678 } |
681 return true; | 679 return true; |
682 } | 680 } |
683 | 681 |
684 // static | 682 // static |
685 bool FileCache::MigrateCacheFiles(const base::FilePath& from, | 683 bool FileCache::MigrateCacheFiles(const base::FilePath& from, |
686 const base::FilePath& to_files, | 684 const base::FilePath& to, |
687 const base::FilePath& to_links, | |
688 ResourceMetadataStorage* metadata_storage) { | 685 ResourceMetadataStorage* metadata_storage) { |
689 scoped_ptr<ResourceMetadataStorage::Iterator> it = | 686 scoped_ptr<ResourceMetadataStorage::Iterator> it = |
690 metadata_storage->GetIterator(); | 687 metadata_storage->GetIterator(); |
691 for (; !it->IsAtEnd(); it->Advance()) { | 688 for (; !it->IsAtEnd(); it->Advance()) { |
692 const ResourceEntry& entry = it->GetValue(); | 689 const ResourceEntry& entry = it->GetValue(); |
693 if (!entry.file_specific_info().cache_state().is_present()) { | 690 if (!entry.file_specific_info().cache_state().is_present()) { |
694 continue; | 691 continue; |
695 } | 692 } |
696 | 693 |
697 // Ignore missing cache file case since it never succeeds. | |
698 // TODO(yawano): handle this case at metadata validation in FileCache. | |
699 const base::FilePath move_from = GetPathForId(from, entry.local_id()); | 694 const base::FilePath move_from = GetPathForId(from, entry.local_id()); |
700 if (!base::PathExists(move_from)) { | 695 if (!base::PathExists(move_from)) { |
701 continue; | 696 continue; |
702 } | 697 } |
703 | 698 |
704 // Create hard link to cache file if it's pinned or dirty. cryptohome will | 699 const base::FilePath move_to = GetPathForId(to, entry.local_id()); |
705 // not delete a cache file if there is a hard link to it. | |
706 const FileCacheEntry& file_cache_entry = | |
707 entry.file_specific_info().cache_state(); | |
708 if (file_cache_entry.is_pinned() || file_cache_entry.is_dirty()) { | |
709 const base::FilePath link_path = GetPathForId(to_links, entry.local_id()); | |
710 int link_result = link(move_from.AsUTF8Unsafe().c_str(), | |
711 link_path.AsUTF8Unsafe().c_str()); | |
712 if (link_result != 0 && errno != EEXIST) { | |
713 return false; | |
714 } | |
715 } | |
716 | |
717 // Move cache file. | |
718 const base::FilePath move_to = GetPathForId(to_files, entry.local_id()); | |
719 if (!base::Move(move_from, move_to)) { | 700 if (!base::Move(move_from, move_to)) { |
720 return false; | 701 return false; |
721 } | 702 } |
| 703 |
| 704 // TODO(yawano): create hard link if entry is marked as pinned or dirty. |
722 } | 705 } |
723 | 706 |
724 return true; | 707 return true; |
725 } | 708 } |
726 | 709 |
727 void FileCache::CloseForWrite(const std::string& id) { | 710 void FileCache::CloseForWrite(const std::string& id) { |
728 AssertOnSequencedWorkerPool(); | 711 AssertOnSequencedWorkerPool(); |
729 | 712 |
730 std::map<std::string, int>::iterator it = write_opened_files_.find(id); | 713 std::map<std::string, int>::iterator it = write_opened_files_.find(id); |
731 if (it == write_opened_files_.end()) | 714 if (it == write_opened_files_.end()) |
(...skipping 23 matching lines...) Expand all Loading... |
755 | 738 |
756 bool FileCache::IsEvictable(const std::string& id, const ResourceEntry& entry) { | 739 bool FileCache::IsEvictable(const std::string& id, const ResourceEntry& entry) { |
757 return entry.file_specific_info().has_cache_state() && | 740 return entry.file_specific_info().has_cache_state() && |
758 !entry.file_specific_info().cache_state().is_pinned() && | 741 !entry.file_specific_info().cache_state().is_pinned() && |
759 !entry.file_specific_info().cache_state().is_dirty() && | 742 !entry.file_specific_info().cache_state().is_dirty() && |
760 !mounted_files_.count(id); | 743 !mounted_files_.count(id); |
761 } | 744 } |
762 | 745 |
763 } // namespace internal | 746 } // namespace internal |
764 } // namespace drive | 747 } // namespace drive |
OLD | NEW |