tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: very bad behavior on overquota writes



On Thu, Nov 22, 2012 at 12:46:54PM +0100, Manuel Bouyer wrote:
> @@ -521,6 +527,16 @@ out:
>               (void) UFS_TRUNCATE(vp, osize, ioflag & IO_SYNC, ap->a_cred);
>               uio->uio_offset -= resid - uio->uio_resid;
>               uio->uio_resid = resid;
> +             if (error == EDQUOT || error == ENOSPC) {
> +                     /* if the process keeps writing (e.g. nfsd),
> +                      * UFS_TRUNCATE() may be very expensive as it
> +                      * walks the page list. As a workaround flush and
> +                      * free all pages associated with this vnode
> +                      */
> +                     (void)VOP_PUTPAGES(vp, 0, 0,
> +                         PGO_ALLPAGES |PGO_CLEANIT | PGO_FREE | PGO_SYNCIO |
> +                         PGO_JOURNALLOCKED);
> +             }
>       } else if (resid > uio->uio_resid && (ioflag & IO_SYNC) == IO_SYNC)
>               error = UFS_UPDATE(vp, NULL, NULL, UPDATE_WAIT);
>       else

And we should probably do this on any erorr, no only space-related errors.
I've adjusted my local tree.

-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
     NetBSD: 26 ans d'experience feront toujours la difference
--


Home | Main Index | Thread Index | Old Index