Ticket #12788: misplace-size-of-item-data.patch

File misplace-size-of-item-data.patch, 3.3 KB (added by hyche, 7 years ago)
  • src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp

    From b36996509c59c3e7048316d5bef1e730b2aace12 Mon Sep 17 00:00:00 2001
    From: hy che <cvghy116@gmail.com>
    Date: Thu, 30 Mar 2017 08:53:16 +0000
    Subject: [PATCH] stream is re-defined which misplaces size of item data.
    
    ---
     .../kernel/file_systems/btrfs/BPlusTree.cpp        | 22 ++++++++++++----------
     1 file changed, 12 insertions(+), 10 deletions(-)
    
    diff --git a/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp b/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp
    index b4d2dd6..1e28a5b 100644
    a b BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size,  
    116116        }
    117117        TRACE("Find() getting index %" B_PRIu32 " at %" B_PRId64 "\n", i - 1,
    118118            stream->index[i - 1].BlockNum());
    119        
     119
    120120        if (fVolume->FindBlock(stream->index[i - 1].BlockNum(), physical)
    121121            != B_OK) {
    122122            ERROR("Find() unmapped block %" B_PRId64 "\n",
    BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size,  
    132132    for (i = 0; i < stream->header.ItemCount(); i++) {
    133133        int32 comp = _CompareKeys(key, stream->entries[i].key);
    134134        TRACE("Find() dump %" B_PRIu32 " %" B_PRIu32 " offset %" B_PRId64
    135             " comp %" B_PRId32 "\n", stream->entries[i].Offset(), 
     135            " comp %" B_PRId32 "\n", stream->entries[i].Offset(),
    136136            stream->entries[i].Size(), stream->entries[i].key.Offset(), comp);
    137137    }
    138138#endif
    139139
    140140    for (i = 0; i < stream->header.ItemCount(); i++) {
    141141        int32 comp = _CompareKeys(key, stream->entries[i].key);
    142         TRACE("Find() found %" B_PRIu32 " %" B_PRIu32 " oid %" B_PRId64 
     142        TRACE("Find() found %" B_PRIu32 " %" B_PRIu32 " oid %" B_PRId64
    143143            " type %d offset %" B_PRId64 " comp %" B_PRId32 "\n",
    144144            stream->entries[i].Offset(), stream->entries[i].Size(),
    145145            stream->entries[i].key.ObjectID(), stream->entries[i].key.Type(),
    BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size,  
    162162            return B_ENTRY_NOT_FOUND;
    163163    }
    164164
    165     if (i < stream->header.ItemCount() 
     165    if (i < stream->header.ItemCount()
    166166        && stream->entries[i].key.Type() == key.Type()) {
    167167        TRACE("Find() found %" B_PRIu32 " %" B_PRIu32 "\n",
    168168            stream->entries[i].Offset(), stream->entries[i].Size());
     169
    169170        if (_value != NULL) {
    170171            *_value = malloc(stream->entries[i].Size());
    171172            uint32 totalOffset = stream->entries[i].Offset() + sizeof(btrfs_header);
    172             key.SetOffset(stream->entries[i].key.Offset());
     173
    173174
    174175            if ((fVolume->BlockSize() - totalOffset % fVolume->BlockSize())
    175176                >= stream->entries[i].Size()) {
    176177                //If there is enough space for *_value
    177                 stream = (btrfs_stream*)cached.SetTo(physical
    178                     + totalOffset / fVolume->BlockSize());
    179                 memcpy(*_value, ((uint8 *)&stream->header
     178                memcpy(*_value, ((uint8 *)cached.SetTo(physical
     179                    + totalOffset / fVolume->BlockSize())
    180180                    + totalOffset % fVolume->BlockSize()),
    181181                    stream->entries[i].Size());
    182182            } else {
    BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size,  
    184184                    * fVolume->BlockSize() + totalOffset,
    185185                    *_value, stream->entries[i].Size());
    186186            }
     187
     188            key.SetOffset(stream->entries[i].key.Offset());
    187189            if (_size != NULL)
    188190                *_size = stream->entries[i].Size();
    189         }   
     191        }
    190192        return B_OK;
    191193    }
    192    
     194
    193195
    194196    TRACE("Find() not found %" B_PRId64 " %" B_PRId64 "\n", key.Offset(),
    195197        key.ObjectID());