Most of this patch was written by Dave Airlie , with some additions by me.