From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 In-Reply-To: <374355743955e49056ab782feaec77f7@hamnavoe.com> References: <374355743955e49056ab782feaec77f7@hamnavoe.com> Date: Mon, 26 Mar 2012 08:04:03 -0400 Message-ID: Subject: Re: [9fans] could not write super block; waiting 10 seconds From: Russ Cox To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Topicbox-Message-UUID: 6ee91b02-ead7-11e9-9d60-3106f5b1d025 On Mon, Mar 26, 2012 at 6:18 AM, Richard Miller <9fans@hamnavoe.com> wrote: > (1) When taking a snapshot, blockWrite in cache.c is called to write > an updated super block S, which has a pointer to the root block R > for the new epoch. =C2=A0To maintain consistency on the disk, R must be > written before S, so blockWrite checks whether R is still in the > cache and marked dirty. =C2=A0Very rarely, blockWrite finds R locked (eg > because the flush thread is just now writing it), so it gives up and > returns zero. =C2=A0The zero return is OK when blockWrite is called by > the flush thread, because the flush thread can get on with writing > out other blocks before coming back to try the failed block again. > But when blockWrite is called by superWrite, there's nothing else to > do; hence the 10 second sleep and warning message. =C2=A0The solution is > to add a waitlock parameter to blockWrite, so superWrite can tell it > to wait for a locked dependent block. > > (2) After the new super block S is sent to the disk write queue, > superWrite removes the previous epoch's root block R' from the > active file system. =C2=A0This is normally done by attaching a BList > entry to S in the cache, noting that R' must be marked closed after > S actually goes to the disk. =C2=A0Rarely, S has already been written by > the time blistAlloc is called. =C2=A0In this case the correct thing was > being done (just close R' immediately), but a spurious warning was > produced. Than you for cleaning these up. These are both things that I meant to come back to some day, but I never did. Russ