diff --git a/headers/private/kernel/disk_device_manager/KPartition.h b/headers/private/kernel/disk_device_manager/KPartition.h index 53f2f23307..be6c2bf6cf 100644 --- a/headers/private/kernel/disk_device_manager/KPartition.h +++ b/headers/private/kernel/disk_device_manager/KPartition.h @@ -94,8 +94,6 @@ public: virtual void SetID(partition_id id); partition_id ID() const; - int32 ChangeCounter() const; - virtual status_t GetPath(char *path) const; // no setter (see BDiskDevice) -- built on the fly @@ -153,9 +151,18 @@ public: void SetContentCookie(void *cookie); void *ContentCookie() const; - void Changed(uint32 flags); + // Change Tracking + + void Changed(uint32 flags, uint32 clearFlags = 0); + void SetChangeFlags(uint32 flags); + uint32 ChangeFlags() const; + int32 ChangeCounter() const; void UninitializeContents(bool logChanges = true); + void SetAlgorithmData(uint32 data); + uint32 AlgorithmData() const; + // temporary storage freely usable by algorithms + virtual void WriteUserData(UserDataWriter &writer, user_partition_data *data); @@ -175,6 +182,7 @@ protected: KDiskSystem *fDiskSystem; uint32 fChangeFlags; int32 fChangeCounter; + uint32 fAlgorithmData; int32 fReferenceCount; bool fObsolete; static int32 fNextID; diff --git a/src/kernel/core/disk_device_manager/KPartition.cpp b/src/kernel/core/disk_device_manager/KPartition.cpp index 22a0a43d31..ad1f4bbec6 100644 --- a/src/kernel/core/disk_device_manager/KPartition.cpp +++ b/src/kernel/core/disk_device_manager/KPartition.cpp @@ -34,6 +34,7 @@ KPartition::KPartition(partition_id id) fDiskSystem(NULL), fChangeFlags(0), fChangeCounter(0), + fAlgorithmData(0), fReferenceCount(0), fObsolete(false) { @@ -422,13 +423,6 @@ KPartition::ID() const return fPartitionData.id; } -// ChangeCounter -int32 -KPartition::ChangeCounter() const -{ - return fChangeCounter; -} - // GetPath status_t KPartition::GetPath(char *path) const @@ -730,10 +724,34 @@ KPartition::ContentCookie() const // Changed void -KPartition::Changed(uint32 flags) +KPartition::Changed(uint32 flags, uint32 clearFlags) { + fChangeFlags &= ~clearFlags; fChangeFlags |= flags; fChangeCounter++; + if (Parent()) + Parent()->Changed(B_PARTITION_CHANGED_DESCENDANTS); +} + +// SetChangeFlags +void +KPartition::SetChangeFlags(uint32 flags) +{ + fChangeFlags = flags; +} + +// ChangeFlags +uint32 +KPartition::ChangeFlags() const +{ + return fChangeFlags; +} + +// ChangeCounter +int32 +KPartition::ChangeCounter() const +{ + return fChangeCounter; } // UninitializeContents @@ -741,30 +759,70 @@ void KPartition::UninitializeContents(bool logChanges) { if (DiskSystem()) { - uint32 flags = B_PARTITION_CHANGED_CONTENT_TYPE + uint32 flags = B_PARTITION_CHANGED_INITIALIZATION + | B_PARTITION_CHANGED_CONTENT_TYPE | B_PARTITION_CHANGED_STATUS | B_PARTITION_CHANGED_FLAGS; + // children + if (CountChildren() > 0) { + RemoveAllChildren(); + flags |= B_PARTITION_CHANGED_CHILDREN; + } + // volume if (VolumeID() >= 0) { // TODO: More? Unmounting would be a bit drastical for changes // only on a shadow partition. SetVolumeID(-1); flags |= B_PARTITION_CHANGED_VOLUME; } + // content name if (ContentName()) { SetContentName(NULL); flags |= B_PARTITION_CHANGED_CONTENT_NAME; } + // content parameters if (ContentParameters()) { SetContentParameters(NULL); flags |= B_PARTITION_CHANGED_CONTENT_PARAMETERS; } + // block size + if (Parent() && Parent()->BlockSize() != BlockSize()) { + SetBlockSize(Parent()->BlockSize()); + flags |= B_PARTITION_CHANGED_BLOCK_SIZE; + } + // disk system DiskSystem()->FreeContentCookie(this); SetDiskSystem(NULL); - if (logChanges) - Changed(flags); + // status + SetStatus(B_PARTITION_UNINITIALIZED); + // flags + SetFlags(Flags() & ~uint32(B_PARTITION_FILE_SYSTEM + | B_PARTITION_PARTITIONING_SYSTEM)); + if (!Device()->IsReadOnlyMedia()) + SetFlags(Flags() & ~(uint32)B_PARTITION_READ_ONLY); + // log changes + if (logChanges) { + Changed(flags, B_PARTITION_CHANGED_DEFRAGMENTATION + | B_PARTITION_CHANGED_CHECK + | B_PARTITION_CHANGED_REPAIR); + } } } +// SetAlgorithmData +void +KPartition::SetAlgorithmData(uint32 data) +{ + fAlgorithmData = data; +} + +// AlgorithmData +uint32 +KPartition::AlgorithmData() const +{ + return fAlgorithmData; +} + // WriteUserData void KPartition::WriteUserData(UserDataWriter &writer, user_partition_data *data)