However, the draw means Steve Cotterill's side are now unbeaten in 11 league games, and stay top of the division by five points after second-placed Peterborough United could only draw with Oldham Athletic.
Aaron Wilbraham had a goal ruled out for offside and Ayling's near post effort was kept out by O'Donnell after a swift Bristol City counter-attack, but it remained 1-0 at the interval.
Luke Freeman nearly extended his side's lead when he beat two defenders and unleashed a shot from 20 yards minutes after the restart, but his effort flew inches wide of the post.
Wilbraham found Bryan in the box on 69 minutes, and he appeared to have his heels clipped as he got his shot away, but the referee waved away Bristol City's appeal for a penalty.
Sawyers then rescued a point for Walsall in dramatic fashion after exchanging passes with Anthony Forde and curling home from 20 yards.