We need to disable quota in umounting ubifs. So we have to disable quota in ubifs_put_super(). But quota disable will write quota file, and we have to budget for it. Signed-off-by: Dongsheng Yang <yangds.fnst@xxxxxxxxxxxxxx> --- fs/ubifs/super.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 4e60330..e53cd40 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -2003,6 +2003,34 @@ static void ubifs_put_super(struct super_block *sb) ubifs_msg(c, "un-mount UBI device %d", c->vi.ubi_num); + if (!c->ro_mount) { + struct quota_info *dqopt = sb_dqopt(sb); + struct inode *inodes[MAXQUOTAS] = {}; + struct inode *tmp = NULL; + struct ubifs_inode *ui = NULL; + struct ubifs_budget_req req = {}; + int cnt = 0; + int index = 0; + + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { + if (!sb_has_quota_loaded(sb, cnt)) + continue; + req.dirtied_ino += 1; + inodes[index++] = dqopt->files[cnt]; + } + ubifs_budget_space(c, &req); + + for (cnt = 0; cnt < MAXQUOTAS; cnt++) { + tmp = inodes[cnt]; + if (!tmp) + break; + ui = ubifs_inode(tmp); + mutex_lock(&ui->ui_mutex); + ui->budgeted = 1; + mutex_unlock(&ui->ui_mutex); + } + dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); + } /* * The following asserts are only valid if there has not been a failure * of the media. For example, there will be dirty inodes if we failed -- 1.8.4.2 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html