quota: Fix possible dq_flags corruption

dq_flags are modified non-atomically in do_set_dqblk via __set_bit calls and
atomically for example in mark_dquot_dirty or clear_dquot_dirty. Hence a
change done by an atomic operation can be overwritten by a change done by a
non-atomic one. Fix the problem by using atomic bitops even in do_set_dqblk.

Signed-off-by: Andrew Perepechko <andrew.perepechko@sun.com>
Signed-off-by: Jan Kara <jack@suse.cz>

authored by Andrew Perepechko and committed by Jan Kara 08261673 4c5e6c0e

+6 -6
+6 -6
fs/quota/dquot.c
··· 2328 2328 if (di->dqb_valid & QIF_SPACE) { 2329 2329 dm->dqb_curspace = di->dqb_curspace - dm->dqb_rsvspace; 2330 2330 check_blim = 1; 2331 - __set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags); 2331 + set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags); 2332 2332 } 2333 2333 if (di->dqb_valid & QIF_BLIMITS) { 2334 2334 dm->dqb_bsoftlimit = qbtos(di->dqb_bsoftlimit); 2335 2335 dm->dqb_bhardlimit = qbtos(di->dqb_bhardlimit); 2336 2336 check_blim = 1; 2337 - __set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags); 2337 + set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags); 2338 2338 } 2339 2339 if (di->dqb_valid & QIF_INODES) { 2340 2340 dm->dqb_curinodes = di->dqb_curinodes; 2341 2341 check_ilim = 1; 2342 - __set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags); 2342 + set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags); 2343 2343 } 2344 2344 if (di->dqb_valid & QIF_ILIMITS) { 2345 2345 dm->dqb_isoftlimit = di->dqb_isoftlimit; 2346 2346 dm->dqb_ihardlimit = di->dqb_ihardlimit; 2347 2347 check_ilim = 1; 2348 - __set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags); 2348 + set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags); 2349 2349 } 2350 2350 if (di->dqb_valid & QIF_BTIME) { 2351 2351 dm->dqb_btime = di->dqb_btime; 2352 2352 check_blim = 1; 2353 - __set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags); 2353 + set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags); 2354 2354 } 2355 2355 if (di->dqb_valid & QIF_ITIME) { 2356 2356 dm->dqb_itime = di->dqb_itime; 2357 2357 check_ilim = 1; 2358 - __set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags); 2358 + set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags); 2359 2359 } 2360 2360 2361 2361 if (check_blim) {