Re: [RFC][PATCH] problem of cont_prepare_write()

From: Anton Altaparmakov
Date: Mon Nov 22 2004 - 18:38:49 EST


On Mon, 22 Nov 2004, Andrew Morton wrote:
> Anton Altaparmakov <aia21@xxxxxxxxx> wrote:
> >
> > Would it be ok to modify i_size from prepare_write?
>
> I think so - I seem to recall seeing that done somewhere else...

Great.

> One thing to watch out for is when to bring the page uptodate. If the
> page is uptodate then the read() code just won't try to lock it at all.
> If you increase i_size AND set PG_uptodate too early you could open a
> window which allows read() to peek at uninitialised data.
>
> But if you set the page uptodate only when its contents really are sane
> then things should work OK.

Yes, I would never set PG_Uptodate without having sane page contents
first.

In fact all the metadata writing code in NTFS actually clears PG_Uptodate
on a locked page because it mangles the page contents, writes them out,
and then demangles them again, before finally setting PG_Uptodate again
to protect against read_cache_page() getting hold of pages with i/o in
flight which for NTFS metadata would cause corruption.

> If you end up doing
>
> memset(page, 0, N);
> SetPageUptodate(page);
>
> then I think you'll need an smb_wmb() in between so the read() code sees the
> above two writes in the correct order.

Thanks. I always have a flush_dcache_page(page) between the memset() and
the SetPageUptodate() so I don't need the barrier, right? Or does the
flush_dcache_page() not imply ordering? (I naively thought it did...)

Best regards,

Anton
--
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
Unix Support, Computing Service, University of Cambridge, CB2 3QH, UK
Linux NTFS maintainer / IRC: #ntfs on irc.freenode.net
WWW: http://linux-ntfs.sf.net/ & http://www-stu.christs.cam.ac.uk/~aia21/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/