Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Nov 2004 19:08:11 +0300 (MSK)
From:      Igor Sysoev <is@rambler-co.ru>
To:        Uwe Doering <gemini@geminix.org>
Cc:        stable@freebsd.org
Subject:   Re: vnode_pager_putpages errors and DOS?
Message-ID:  <20041111190413.F41088@is.park.rambler.ru>
In-Reply-To: <418BEBC2.3020304@geminix.org>
References:  <Pine.NEB.3.96L.1041009150440.93055O-100000@fledge.watson.org> <4168578F.7060706@geminix.org> <20041103191641.K63546@is.park.rambler.ru> <4189666A.9020500@geminix.org> <20041104124616.S92154@is.park.rambler.ru> <418BEBC2.3020304@geminix.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 5 Nov 2004, Uwe Doering wrote:

> Igor Sysoev wrote:
> > [...]
> > I've tried your patch from second email (it requires to include
> > <sys/conf.h> for devsw and D_DISK): the system also became unresponsible.
> >
> > The main problem is that I could not kill the offending process - it
> > stuck in biowr state.
>
> In the meantime I've investigated this further.  The two patches I
> provided so far certainly have their merits, since they deal with some
> unwanted side effects.  However, I found that the root cause for the
> eventual system lock-up lies elsewhere.
>
> In an earlier email I already pointed out that function
> vnode_pager_generic_putpages() actually doesn't care whether the write
> operation failed or not.  It always returns VM_PAGER_OK.
>
> Now, in case the write operation succeeds the file system code takes
> care that the formerly dirty pages associated with the i/o buffer get
> marked clean.  On the other hand, if the write attempt fails, for
> instance in an out-of-disk-space situation, the pages are left dirty.
> At this point the syncer enters an infinite loop, trying to flush the
> same dirty pages to disk over and over again.
>
> The fix is actually quite simple.  In case of a write error we have to
> make sure ourselves that the associated pages get marked clean.  We do
> this by returning VM_PAGER_BAD instead of VM_PAGER_OK.  These two result
> codes are functionally identical, with the exception that VM_PAGER_BAD
> additionally marks the respective page clean.  For the details, please
> have a look at the caller function vm_pageout_flush() in 'vm_pageout.c'.
>
> What this modification means is that in case of a write error the
> affected pages remain intact in memory until they get recycled, but we
> lose their contents as far as the copy on disk is concerned.  I believe
> this is acceptable (and possibly even originally intended) because
> giving up on syncing is about the best thing we can do in this
> situation, anyway.  And it is certainly a much better choice than
> halting the whole system due to an infinite loop.
>
> I've attached an updated version of the patch for 'vnode_pager.c'.  On
> my test system it resolved the issue.  Please let us know whether it
> works for you as well.

Sorry for the late response: I was ill and have no access to the test machine.
I applied the patch to the clean 4.10. The result is the same: the process
could not be killed, the file system access is very limited and the system
became unresponsible.


Igor Sysoev
http://sysoev.ru/en/



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041111190413.F41088>