A gross typo I just noticed: > void end_change(struct sb *sb, unsigned delta) > { > down_read(&sb->delta_lock); > if (need_delta(sb)) { > unsigned delta = atomic_read(&sb->delta); > up_read(&sb->delta_lock); > down_write(&sb->delta_lock); > if (sb->delta == atomic_read(&delta)) { > atomic_inc(&sb->delta); > up_write(&sb->delta_lock); > stage_delta(sb, delta); > commit_delta(sb, delta); > } else > up_write(&sb->delta_lock); > } else > up_read(&sb->delta_lock); > }
should be: void end_change(struct sb *sb, unsigned delta) { if (need_delta(sb)) { unsigned delta = atomic_read(&sb->delta); up_read(&sb->delta_lock); down_write(&sb->delta_lock); if (sb->delta == atomic_read(&delta)) { atomic_inc(&sb->delta); up_write(&sb->delta_lock); stage_delta(sb, delta); commit_delta(sb, delta); } else up_write(&sb->delta_lock); } else up_read(&sb->delta_lock); } That is, the end_change already has the sb->delta read lock. Regards, Daniel _______________________________________________ Tux3 mailing list Tux3@tux3.org http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3