Sorry about the long lines in the previous post... On Tuesday 13 January 2009 01:51, I wrote: > Here is a prototype of block redirect for btree nodes. It has not > been tested at all, it just compiles (patch attached). It has one > severe deficiency: it can't handle redirecting the root of a btree > because the btree cursor does not know where the btree root is cached. > > To place this in conext, redirect on write comes in two distinctly > different flavors: > > Redirect a data extent in file page cache: > - Logically mapped > - no need to relocate data blocks in cache > - just need to update pointer in parent (dleaf) > - Handled by map_region > > Redirect a btree node in volume cache: > - Physically mapped > - need to move data to a new buffer and release old > - Handled various functions in btree.c > > In either case, we are releasing some data blocks and allocating new > ones, because the contents of cache has changed and we need to place it > on disk without overwriting any part of the existing, stable filesystem > image.
OK, we know what we are going to do with redirect of root: instead of passing (btree *) to btree functions, we will pass (inode *), which has the btree root. For the special case of the inode table root, the inode passed will be our volume map, our buffer cache replacement. Redirecting the root will set the cached inode dirty, and delta staging will flush all dirty inodes to disk (store_attrs). As a later optimization we can log a promise to update the disk inode, and only flush inodes at rollup intervals. Regards, Daniel _______________________________________________ Tux3 mailing list [email protected] http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3
