From 869141e1e56115092e110107165d4ff4bc1b0f14 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 14 Jun 2010 09:16:46 +1000 Subject: [PATCH] README update --- README | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/README b/README index 07f805c..9096950 100644 --- a/README +++ b/README @@ -4137,3 +4137,126 @@ Then spin in a soft-lockup in lafs_inode_handle_orphan 320 nbfile-44 - 30K 296 nbfile-20 - 30K ??331?? + +11 June 2010 + + Thinking about truncate and index blocks becoming empty while + they still have children. + For leaf indexes, we need to leave the block in place in case + the children get written. We need to find a time to ultimately + delete it... + For internal indexes,.... uhm, it just works, OK?? + + When I drop an uninc block, I need to remove it from the + uninc list, and from phase_leafs + clearing dirty and refiling should remove from leafs. + + When we recurse to a parent, we need to remove + *this* block from the uninc list for said parent. + It should be the only thing in the list. + But even when we don't recurse, the fact that we have + incorporated means that we should tidy up the ->uninc + list. + + + +12 June 2010 + unmount hung after lafs_run_orphans from lafs_put_super + There are two orphans in Writeback which cannot progress + until the current cluster is written... + But they keep getting re-written! + Other time, one orphan, index block is Dirty on a leaf ??? + +orph=[cfbdcf24]0/331(3780)r2E:Valid,SegRef,C,CI,CN,CNI,Claimed,PhysValid,Orphan(0) orphan_list(1) iblock(1) +[cfb8e460]331/0(NoPhysAddr)r1F:Index(1),Pinned,Phase0,InoIdx,Valid,Dirty,SegRef,CN,CNI,UninCredit{0,0}[0] leaf(1) Leaf0(1) +LAFS_cluster_flush 1 + + +orph=[ce5c9bb4]0/327(3317)r2E:Valid,SegRef,C,CI,CN,CNI,Claimed,PhysValid,Orphan(0) iblock(1) orphan_list(1) +[cfbe3a40]327/0(NoPhysAddr)r1F:Index(1),Pinned,Phase0,InoIdx,Valid,Dirty,SegRef,CN,CNI,UninCredit{0,0}[0] leaf(1) Leaf0(0) + + OK, problem is that when we truncate and remove an index block, the + next index block expands backwards to fill the space. + Then we apply prune_some, but don't check if anything was done. + We always mark it dirty, so it has to be written and then + we loop through again... + So need to check if prune_some did anything. + +TODO: + - prune_some need to get more done at a time + - let cleaner finish up before umount + - use early segments first ?? + - look at write-clusters and check OK + - check that df:cb= drops properly. + +Bugs: + 1 BUG: spinlock lockup on CPU#0, sh/1168, c0441170 - SECONDARY BUG + 1 BUG: unable to handle kernel NULL pointer dereference at 000001b4 + 3 BUG: unable to handle kernel paging request at 00100104 + 5 BUG: unable to handle kernel paging request at 6b6b6bfb + 1 BUG: unable to handle kernel paging request at 7fffffff + 7 kernel BUG at /home/neilb/work/nfsbrick/fs/module/block.c:197! + 9 kernel BUG at /home/neilb/work/nfsbrick/fs/module/block.c:479! + 2 kernel BUG at /home/neilb/work/nfsbrick/fs/module/block.c:529! + 2 kernel BUG at /home/neilb/work/nfsbrick/fs/module/block.c:67!! + 2 kernel BUG at /home/neilb/work/nfsbrick/fs/module/inode.c:828! + 4 kernel BUG at /home/neilb/work/nfsbrick/fs/module/inode.c:843! + 1 kernel BUG at /home/neilb/work/nfsbrick/fs/module/modify.c:1708! + 7 kernel BUG at /home/neilb/work/nfsbrick/fs/module/segments.c:1028! + 2 kernel BUG at /home/neilb/work/nfsbrick/fs/module/segments.c:332! + 30 kernel BUG at /home/neilb/work/nfsbrick/fs/module/super.c:655! + +Quite a haul there! + +super.c:655 + Pinned block in lafs_release: + 0/2 is Dirty with plenty of credits, so it is a child + 0/16 is Dirty/Realloc, or once Async + +segments.c:332 + seg_deref with refcnt , 2 in lafs_seg_put_all + +segments.c:1028 + No free segments - no real pattern. + +modify.c:1708 + lafs_incorporate on non-dirty/realloc block + 328/0 Index(1). 1 in uninc_table - probably during truncate. + +inode.c:843 + children present in truncate after final incorp... + 328/0. 64 children, no uninc list. Maybe we ran the orphans too early?? + or invalidate_page isn't removing the children. + Might want print_tree here? + +inode.c:828 + Orphan handling - uninc but not dirty: is Realloc (sometimes) + Maybe like mod:1708 + +block.c:67 + delref 'primary' from modify.c:2063 in the q2 branch. + nxt has PrimaryRef... Maybe move earlier, but that shouldn't make a diff. + ditto at modify.c:2035 nxt is primary as was I, so drop mine. + +block.c:529 + erase with index depth > 1. + 0/328 in orphan handling. Still have 8 or 15 blocks registered! + +block.c:479 + not enough credits to dirty block 2/0 in dir_delete_commit for unlink. + 74/xxxx in unlink + 16/1 in seg_inc/seg_move...allocated_block/cluster_flush + +block.c:197 + invalidated pages finds dirty block after EOF, after iolock_written + 0/0 Dirty/Realloc in unmount - all Realloc! + +NULL deref in 1b4 + cleaner->cluster_flush->count_credits->lock?? + +001001 + generic_drop_inode -- extra iput?? in lafs_inode_checkpin from refile +6b6b6b invalidate_inode_buffers!! in kill. use-after-free + +7fffff + seginsert from scan_seg -- 2.39.5