diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.cpp b/src/add-ons/kernel/file_systems/bfs/Inode.cpp index 469315a514..3b8e1167a8 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Inode.cpp @@ -1759,10 +1759,13 @@ status_t Inode::ShrinkStream(Transaction &transaction, off_t size) { data_stream *data = &Node().data; + status_t status; if (data->MaxDoubleIndirectRange() > size) { - FreeStaticStreamArray(transaction, 0, data->double_indirect, size, + status = FreeStaticStreamArray(transaction, 0, data->double_indirect, size, data->MaxIndirectRange(), data->max_double_indirect_range); + if (status < B_OK) + return status; if (size <= data->MaxIndirectRange()) { fVolume->Free(transaction, data->double_indirect); @@ -1792,8 +1795,10 @@ Inode::ShrinkStream(Transaction &transaction, off_t size) } if (data->MaxDirectRange() > size) { off_t offset = 0; - FreeStreamArray(transaction, data->direct, NUM_DIRECT_BLOCKS, size, offset, - data->max_direct_range); + status = FreeStreamArray(transaction, data->direct, NUM_DIRECT_BLOCKS, + size, offset, data->max_direct_range); + if (status < B_OK) + return status; } data->size = HOST_ENDIAN_TO_BFS_INT64(size); diff --git a/src/add-ons/kernel/file_systems/bfs/Journal.cpp b/src/add-ons/kernel/file_systems/bfs/Journal.cpp index aae9df64db..5585af54fd 100644 --- a/src/add-ons/kernel/file_systems/bfs/Journal.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Journal.cpp @@ -336,6 +336,12 @@ Journal::FlushLogAndBlocks() if (status != B_OK) return status; + if (fLock.OwnerCount() > 1) { + // whoa, FlushLogAndBlocks() was called from inside a transaction + fLock.Unlock(); + return B_OK; + } + // write the current log entry to disk if (fTransactionID != -1 && TransactionSize() != 0) { @@ -343,6 +349,7 @@ Journal::FlushLogAndBlocks() if (status < B_OK) FATAL(("writing current log entry failed: %s\n", strerror(status))); } + status = fVolume->FlushDevice(); fLock.Unlock(); diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index 9ea7fea42e..4de919e69e 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -1259,8 +1259,13 @@ bfs_free_cookie(void *_ns, void *_node, void *_cookie) if (needsTrimming) { status = inode->TrimPreallocation(transaction); - if (status < B_OK) - FATAL(("Could not trim preallocated blocks!")); + if (status < B_OK) { + FATAL(("Could not trim preallocated blocks: inode %Ld, transaction %ld: %s!\n", + inode->ID(), transaction.ID(), strerror(status))); + + // we still want this transaction to succeed + status = B_OK; + } } if (needsTrimming || inode->OldSize() != inode->Size()) { index.UpdateSize(transaction, inode);