38 Commits

Author SHA1 Message Date
Axel Dörfler
d89cda9ff7 * Fixed another big bug in the logging code: I obviously got confused
what RunArrays::Length() meant; it should have been the length of a
  log entry, but was only the block count.
* Now I've improved naming and fixed initializing the LogEntry with a 
  wrong size, causing subsequent log entries to lose track in the log
  (the log_start pointer got wrong, so BFS would not be able to replay
  such a log).
* This at least fixes one part of the problem of bug #1911.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24410 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-03-16 15:53:42 +00:00
Axel Dörfler
772506f830 Divided the _ReplayRunArray() method into two passes: first, the integrity
of the blocks in the log entry will be checked, and only if this passed,
all log entries are written back together; if the whole run array contained
bad data, it's no longer written to disk at all if it's detectable.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24402 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-03-15 16:35:10 +00:00
Axel Dörfler
f426071223 * For whatever weird reason, BFS apparently restricts a log entry to 126
entries, even though many more could fit in the blog. This fixes mounting
  a dirty (original-)BFS volume with a block size larger than 1024 bytes,
  and probably vice versa.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24401 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-03-15 16:25:55 +00:00
Axel Dörfler
0dc57dbece The log replay code now checks if a super block is valid before the current
one gets overwritten; if the log contains invalid data, it will no longer
render the whole disk unreadable. This should have helped to prevent bug #1911
(but of course the problem that there is invalid data in the log in the first
place remains).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24381 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-03-12 22:49:41 +00:00
Axel Dörfler
5d43cf2a84 * Added new debugger commands bfs_btree_header and bfs_btree_node that
dump a B+tree header resp. node.
* Use dprintf() when a transaction is too large instead of a panic; even
  though the file system has to revert the transaction, it's not lethal,
  and it does not corrupt your disk.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23653 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-19 20:58:47 +00:00
Axel Dörfler
4a553d3696 Forgot to update logStart after every written array - this
caused old entries (that were part of the same transaction) to be 
overwritten.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23642 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-19 16:35:19 +00:00
Axel Dörfler
ae16ab9d0f * When I ported over BFS to the new FS API, I pretty much toasted the logging
code:
  - The vec array to contain the block list and the index block was one entry
    to small.
  - But that didn't really matter, as RunArrays/run_array was broken and never
    put anything into the log; we only ever wrote index headers. BFS would
    totally screw up the disk when trying to replay the log (even though the
    replay code itself was and is working fine).
  - If a log entry ended at the end of the log area, BFS could overwrite the
    first block after the log with the next entry.
* run_array now adopt the sorting stuff from the sorted_array. Blocks in the
  log are now always sorted.
* Added TODO item to sorted_array as it's not endian safe (will only work
  correctly when BFS is used in the native endian).
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23638 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-19 15:46:41 +00:00
Axel Dörfler
5d0afa4e4e * cache_detach_sub_transaction() didn't really work: it did not put all needed
blocks into the new transaction, but it would set that transaction on all
  blocks of the old transaction, too. Also, it did not correctly update the
  num_blocks/sub_num_blocks fields of the old transaction. Even worse, it did
  return B_OK instead of the ID of the new transaction...
* get_writable_cached_block() did not correctly maintain the number of blocks
  in the sub transaction.
* write_cached_block() did not free the original_data of a block when it wrote
  it back as part of a previous transaction.
* Changed "cookie" for cache_next_block_in_transaction() to "long", so it will
  be 64 bits when needed.
* Improved the API for detaching sub transactions: you can now get the blocks
  of only the main (parent) transaction as well, added new
  cache_block_in_main_transaction() function.
* BFS now flushes the log when there is no space left for the current
  transaction.
* _WriteTransactionToLog() allocated a "vecs" array, but never freed it.
* _WriteTransactionToLog() now also supports detaching the current sub
  transaction if the whole thing is getting too large (it will now also panic
  if that doesn't work out).
* Removed a useless optimization: making the blocks available in the cache
  isn't really needed, as all blocks in a transaction are locked into the
  cache, anyway.
* Implemented Transaction::WriteBlocks().
* Minor cleanup, removed some dead code, fixed warnings in the fs_shell's
  block_cache when compiled with debug output on.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23610 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-18 17:07:18 +00:00
Axel Dörfler
4fc4f2c8ae * Added a transaction listener mechanism to be notified when a
transaction ends or has been aborted.
* BFS now listens for transactions when it created an inode to see if 
  the transaction will be aborted without freeing the inode (in which 
  case it will panic for now).
* Started implementing tracing support, but it's not working yet.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23492 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-13 17:18:29 +00:00
Axel Dörfler
d1ba9c8adc Fixed warnings when building the bfs_shell.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23462 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-01-12 23:58:56 +00:00
Axel Dörfler
4afaeabbd8 * bfs_free_cookie() accidently reverted a transaction after having updated
the inode's internal last modified and size copies, causing in inconsistent
  data. This fixes #1643.
* The block being replayed are now dumped to the debug output.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23050 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-12-02 16:38:38 +00:00
Axel Dörfler
6edf637ba6 Minor cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22896 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-11-11 13:00:59 +00:00
Ingo Weinhold
c391f84b2c * Prepared the BFS sources to be used with the new FS shell:
- Moved all inclusions of system headers into a new
    system_dependencies.h header, which conditionally either includes
    these or the FS shell headers.
  - Fixed compiler warnings related to printf-like functions (int32 is
    int, not long on non-BeOS platforms).
* Build a new bfs_shell. Compiles and links, but does nothing ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20860 a95241bf-73f2-0310-859d-f6bbb57e9c96
2007-04-27 12:25:49 +00:00
Axel Dörfler
eeb28bb7ee Some more PPC fixes.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17714 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-06-03 17:14:51 +00:00
Axel Dörfler
57808587d5 Fixed warning when build with DEBUG=1.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16554 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-02-28 21:45:27 +00:00
Axel Dörfler
923e3aaf6f Fixed two crucial bugs:
* When aborting the first sub-transaction, BFS didn't recognize this
  correctly, and aborted it via cache_abort_transaction() instead of
  cache_abort_sub_transaction() - that not only reversed the whole
  transaction, but also let subsequent cache_start_sub_transaction()
  fail (as there was no transaction to continue anymore). Reported
  in a reproducible way by Jerome Duval.
* Haiku didn't want to replay logs anymore - the off-by-one fix I did
  in r14428 was not complete, it only let Be's BFS replay our logs,
  but our's rejected them afterwards.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16018 a95241bf-73f2-0310-859d-f6bbb57e9c96
2006-01-21 13:35:08 +00:00
Axel Dörfler
9ebc6e3c2d Added a comment on what kind of functionality we need from the caching layer one day.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14442 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-10-20 09:29:40 +00:00
Axel Dörfler
cb6d675cf4 Aborting transactions doesn't change the number of unwritten transactions - that
counter does not take the current transaction into account.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14434 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-10-19 22:26:49 +00:00
Axel Dörfler
9a99234b1a Implemented basic sub transaction support - seems to work so far, but I haven't
tested it heavily yet.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14432 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-10-19 16:49:01 +00:00
Axel Dörfler
bd0b075c13 Now takes the off-by-one error in Be's BFS implemenation into account, too.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14428 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-10-19 14:36:21 +00:00
Axel Dörfler
e620c9328c Argl, turns out Be's replay log routine cannot handle block_runs with a size unequal
1 - IOW using block_runs here is completely bogus.
Crippled our code to not create longer block_runs - at least, a dirty BFS image is
now a dirty BFS image - you can mount a dirty image on either system and it will
work :-)
The R5 version of our BFS is still incompatible though - ie. running bfs_shell or
copy_to_bfs_image on a dirty image will still potentially corrupt it. Maybe I'll
even port the changes over one day...


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14418 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-10-18 20:52:15 +00:00
Axel Dörfler
a59b9afff0 Rewrote the log entry writing so that it should be BFS compatible - not yet tested for
compatibility, though!
Writing is now combined into a few writev_pos() function calls to speed up log writing.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14415 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-10-18 20:01:42 +00:00
Axel Dörfler
c0614f3291 Ported r13366 back from the R5 BFS to the Haiku BFS: fixed bad bug in the journaling
code, the super block log data could have been wrong. Moved the doubly linked list
code to the kernel's util/DoublyLinkedList.h.
Also removed Journal::fCurrent, as it's not really used.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13367 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-06-30 16:38:37 +00:00
Axel Dörfler
1c12a6a33f Inode::ShrinkStream() now evaluates the return values from some functions - dunno
if that's a good idea (it may still be a good idea to succeed for shrinking the
stream, even if not everything worked), but it looks better :-)
Improved debug output in case TrimPreallocation() fails.
Journal::FlushLogAndBlocks() no longer ends the current transaction if called
from within an ongoing transaction.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13019 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-06-08 17:33:56 +00:00
Axel Dörfler
2dbdc141cf Transactions can now be nested (bfs_release_vnode() actually did that before,
but that was not working correctly):
only the owning transaction (the one that came first) can now end a transaction.
To do: if the owning transaction fails, it should actually not abort the
transaction in case there were sub transactions, but does so right now
(should do no harm, eventually file data is not freed as it should).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12913 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-05-31 01:26:39 +00:00
Axel Dörfler
5692a950fa We don't stack transactions together, so we need to end each transaction,
even if empty.
Added some more debug output.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12904 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-05-30 18:35:25 +00:00
Axel Dörfler
23b6e06ac6 While the block list was written sorted to the log, the blocks were in
transaction order which caused corrupted disks when a log was replayed.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11539 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-03-02 17:55:49 +00:00
Axel Dörfler
92a076fcce Journal::FlushLogAndBlocks() no longer uses Journal::Lock() but the lock directly.
That avoids starting a new transaction for no reason (which wouldn't do any harm,
but still, it's not necessary to do that at all).
log_entry::cached_blocks is no longer maintained or needed.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10185 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-11-22 20:49:55 +00:00
Axel Dörfler
fb02804a89 Big update while moving over completely to the Haiku kernel:
- Ported over BFS to the new cache API
- Inode no longer inherits from CachedBlock, and therefore, no longer
  keeps the whole inode block in memory. It now has a copy of the bfs_inode
  structure in memory instead. This has a number of advantages but also some
  disadvantages, so it might be reverted later, even if it's unlikely.
- Added a NodeGetter class that can be used whenever the real block needs
  to be accessed (ie. for attributes)
- Changed *transaction to &transaction where possible
- Removed support for KEEP_WRONG_DIRENT_RECLEN
- Removed support for uncached file access since that's no longer needed
- Fixed some endian issues in bfs_write_stat()
- Removed the install BFS rules, since they don't make any sense anymore
  (unless you are running Haiku ;-))

Note, logged streams are not supported anymore right now. Also, the
transaction code is pretty simple and slow - it will be improved later
on. Attribute code is pretty much untested in the new environment.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10053 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-11-19 20:53:45 +00:00
Axel Dörfler
dca5d901c7 Added missing include.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7820 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-06-07 22:50:31 +00:00
Axel Dörfler
feec20d64b It's now <util/kernel_cpp.h> rather than <kernel_cpp.h>.
Forgot to commit that...


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7442 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-05-07 11:13:17 +00:00
Axel Dörfler
a49b150fff Removed the fOwningThread functionality from the Journal class; it now
just uses a RecursiveLock instead.
Changed Journal::CurrentTransaction() so that it returns the current
transaction only if it's valid for the thread asking for it.
That doesn't fix the bug, but changed its timing a bit.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6356 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-01-27 11:19:05 +00:00
Axel Dörfler
54343bbc2d Switched to kernel_cpp.h/cpp.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6291 a95241bf-73f2-0310-859d-f6bbb57e9c96
2004-01-25 14:48:40 +00:00
Nathan Whitehorn
1a49a0986b Bunches of changes to make mwcc like the code. I also coded an _atomic_set() and _atomic_test_and_set() for PowerPC. Of course, there's already one in the kernel tree, but mine's better. :P Now builds (and works, after a fashion) on R5 PowerPC.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5280 a95241bf-73f2-0310-859d-f6bbb57e9c96
2003-11-08 04:39:58 +00:00
Axel Dörfler
24d6529a93 Journal::LogBlocks() now calls cache_write() if the block is already in the
log entry - this is only necessary if the buffer is not the one of the
CachedBlock object.
Journal::TransactionDone() now properly aborts transactions if possible,
instead of just writing them to disk (does only work if the log entry
was not used by other transactions already).
Added a comment about how to speed up writing the log entries a bit more
(though it's not so easy to do, and might not be much faster).


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3362 a95241bf-73f2-0310-859d-f6bbb57e9c96
2003-05-28 01:10:22 +00:00
Axel Dörfler
98b972c906 Fixed all warnings that appeared with DEBUG=1 set.
Also fixed missing return codes in BufferPool::ReleaseBuffer() and Journal::WriteLogEntry().


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2845 a95241bf-73f2-0310-859d-f6bbb57e9c96
2003-02-25 15:07:26 +00:00
Axel Dörfler
ceeb00d41a Fixed a possibly crashing bug (missing strerror() with %s format).
Fixed many warnings (due to -Wall). Some style cleanups.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2843 a95241bf-73f2-0310-859d-f6bbb57e9c96
2003-02-25 03:03:30 +00:00
Axel Dörfler
c42ee13401 Initial revision
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@639 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-07 23:14:13 +00:00