|
@@ -562,6 +562,8 @@ static struct shrinker dqcache_shrinker = {
|
|
|
*/
|
|
|
static void dqput(struct dquot *dquot)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
if (!dquot)
|
|
|
return;
|
|
|
#ifdef __DQUOT_PARANOIA
|
|
@@ -594,7 +596,19 @@ we_slept:
|
|
|
if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) {
|
|
|
spin_unlock(&dq_list_lock);
|
|
|
/* Commit dquot before releasing */
|
|
|
- dquot->dq_sb->dq_op->write_dquot(dquot);
|
|
|
+ ret = dquot->dq_sb->dq_op->write_dquot(dquot);
|
|
|
+ if (ret < 0) {
|
|
|
+ printk(KERN_ERR "VFS: cannot write quota structure on "
|
|
|
+ "device %s (error %d). Quota may get out of "
|
|
|
+ "sync!\n", dquot->dq_sb->s_id, ret);
|
|
|
+ /*
|
|
|
+ * We clear dirty bit anyway, so that we avoid
|
|
|
+ * infinite loop here
|
|
|
+ */
|
|
|
+ spin_lock(&dq_list_lock);
|
|
|
+ clear_dquot_dirty(dquot);
|
|
|
+ spin_unlock(&dq_list_lock);
|
|
|
+ }
|
|
|
goto we_slept;
|
|
|
}
|
|
|
/* Clear flag in case dquot was inactive (something bad happened) */
|