tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: [PATCH] Re: zero-filed page on VOP_PUTPAGES
hi,
> On Fri, Aug 19, 2011 at 01:54:28PM +0000, Emmanuel Dreyfus wrote:
>> Here is my complete anlysis of the problem:
> (snip)
your analysis seems to make a sense.
>
> And here is a fix in puffs_vnop_getattr(). It was tested on netbsd-5 only so
> far since the bug does not appear in -current. My test case does not exhibit
> the bug anymore on netbsd-5.
>
> Opinions?
>
> I obtain this without yamt's patch that flushes writes in dosetattr()
> before sending the SETATTR message. I wonder if this is really a
> different problem. yamt, how do you get the problem that is fixed by
> your patch? I would like to check if I can reproduce.
sorry, i forgot.
>
> Index: sys/fs/puffs/puffs_vnops.c
> ===================================================================
> RCS file: /cvsroot/src/sys/fs/puffs/puffs_vnops.c,v
> retrieving revision 1.129.4.9
> diff -U 4 -r1.129.4.9 puffs_vnops.c
> --- sys/fs/puffs/puffs_vnops.c 17 Jul 2011 15:36:03 -0000 1.129.4.9
> +++ sys/fs/puffs/puffs_vnops.c 19 Aug 2011 15:37:53 -0000
> @@ -897,8 +897,21 @@
> vap->va_size = pn->pn_mc_size;
> } else {
> if (rvap->va_size != VNOVAL
> && vp->v_type != VBLK && vp->v_type != VCHR) {
> + /*
> + * There may be a pending SETATTR triggered by
> + * another process (e.g.: syncer). The kernel
> + * is waiting in dosetattr() and decided on
> + * a newer and bigger size. If we report a
> + * smaller and older size from the filesystem,
> + * uvm_vnp_setsize() will truncate the file and
> + * discard the cached data not yet written. We
> + * therefore retain the biggest value from
> + * kernel and filesystem to avoid data corruption.
> + */
> + rvap->va_size = MAX(rvap->va_size, vp->v_size);
> +
couldn't it be a problem if the size of the file is shrinked by the server?
how about stopping using FAF for SETATTR?
i guess puffs_msg_setcall can be used instead.
YAMAMOTO Takashi
> uvm_vnp_setsize(vp, rvap->va_size);
> pn->pn_serversize = rvap->va_size;
> }
> }
>
>
> --
> Emmanuel Dreyfus
> manu%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index