Re: ext2 FS corruption with 2.5.59.

From: Andrew Morton (akpm@digeo.com)
Date: Sat Jan 25 2003 - 22:46:48 EST


William Lee Irwin III <wli@holomorphy.com> wrote:
>
> On Sat, Jan 25, 2003 at 07:04:10PM -0800, Andrew Morton wrote:
> +static inline unsigned fr_write_begin(frlock_t *rw)
> +{
> + unsigned ret = rw->pre_sequence++;
> + wmb();
> + return ret;
> +}
> +
> +static inline unsigned fr_write_end(frlock_t *rw)
> +{
> + unsgned ret;
> + wmb();
> + ret = ++(rw->post_sequence);
> + wmb();
> + return ret;
> +}
>
> Ticket locks need atomic fetch and increment. These don't look right.

Well look at the reader side:

loff_t i_size_read(struct inode *inode)
{
        unsigned seq;
        loff_t ret;

        do {
                seq = fr_write_begin(&inode->i_frlock);
                ret = inode->i_size;
        } while (seq != fr_write_end(&inode->i_frlock);
        return ret;
}

One change which is needed here is to disable preemption in fr_write_begin();
otherwise an frlock could be in the pre!=post state for hundreds of
milliseconds while the writer gets preempted. Other CPUs would just spin for
the duration.

The same would happen if the writer takes an interrupt while pre!=post, but
that's the same for all spinlocks...

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Jan 31 2003 - 22:00:14 EST