ocfs2: without quota support, avoid calling quota recovery
[ Upstream commit 21158ca85b73ddd0088076a5209cfd040513a8b5 ] During one dead node's recovery by other node, quota recovery work will be queued. We should avoid calling quota when it is not supported, so check the quota flags. Link: http://lkml.kernel.org/r/71604351584F6A4EBAE558C676F37CA401071AC9FB@H3CMLB12-EX.srv.huawei-3com.com Signed-off-by: guozhonghua <guozhonghua@h3c.com> Reviewed-by: Jan Kara <jack@suse.cz> Cc: Mark Fasheh <mark@fasheh.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Junxiao Bi <junxiao.bi@oracle.com> Cc: Joseph Qi <jiangqi903@gmail.com> Cc: Changwei Ge <ge.changwei@h3c.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
6a2245d828
commit
abc7968b86
1 changed files with 34 additions and 17 deletions
|
@ -1379,15 +1379,23 @@ static int __ocfs2_recovery_thread(void *arg)
|
|||
int rm_quota_used = 0, i;
|
||||
struct ocfs2_quota_recovery *qrec;
|
||||
|
||||
/* Whether the quota supported. */
|
||||
int quota_enabled = OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb,
|
||||
OCFS2_FEATURE_RO_COMPAT_USRQUOTA)
|
||||
|| OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb,
|
||||
OCFS2_FEATURE_RO_COMPAT_GRPQUOTA);
|
||||
|
||||
status = ocfs2_wait_on_mount(osb);
|
||||
if (status < 0) {
|
||||
goto bail;
|
||||
}
|
||||
|
||||
rm_quota = kcalloc(osb->max_slots, sizeof(int), GFP_NOFS);
|
||||
if (!rm_quota) {
|
||||
status = -ENOMEM;
|
||||
goto bail;
|
||||
if (quota_enabled) {
|
||||
rm_quota = kcalloc(osb->max_slots, sizeof(int), GFP_NOFS);
|
||||
if (!rm_quota) {
|
||||
status = -ENOMEM;
|
||||
goto bail;
|
||||
}
|
||||
}
|
||||
restart:
|
||||
status = ocfs2_super_lock(osb, 1);
|
||||
|
@ -1423,9 +1431,14 @@ static int __ocfs2_recovery_thread(void *arg)
|
|||
* then quota usage would be out of sync until some node takes
|
||||
* the slot. So we remember which nodes need quota recovery
|
||||
* and when everything else is done, we recover quotas. */
|
||||
for (i = 0; i < rm_quota_used && rm_quota[i] != slot_num; i++);
|
||||
if (i == rm_quota_used)
|
||||
rm_quota[rm_quota_used++] = slot_num;
|
||||
if (quota_enabled) {
|
||||
for (i = 0; i < rm_quota_used
|
||||
&& rm_quota[i] != slot_num; i++)
|
||||
;
|
||||
|
||||
if (i == rm_quota_used)
|
||||
rm_quota[rm_quota_used++] = slot_num;
|
||||
}
|
||||
|
||||
status = ocfs2_recover_node(osb, node_num, slot_num);
|
||||
skip_recovery:
|
||||
|
@ -1453,16 +1466,19 @@ static int __ocfs2_recovery_thread(void *arg)
|
|||
/* Now it is right time to recover quotas... We have to do this under
|
||||
* superblock lock so that no one can start using the slot (and crash)
|
||||
* before we recover it */
|
||||
for (i = 0; i < rm_quota_used; i++) {
|
||||
qrec = ocfs2_begin_quota_recovery(osb, rm_quota[i]);
|
||||
if (IS_ERR(qrec)) {
|
||||
status = PTR_ERR(qrec);
|
||||
mlog_errno(status);
|
||||
continue;
|
||||
if (quota_enabled) {
|
||||
for (i = 0; i < rm_quota_used; i++) {
|
||||
qrec = ocfs2_begin_quota_recovery(osb, rm_quota[i]);
|
||||
if (IS_ERR(qrec)) {
|
||||
status = PTR_ERR(qrec);
|
||||
mlog_errno(status);
|
||||
continue;
|
||||
}
|
||||
ocfs2_queue_recovery_completion(osb->journal,
|
||||
rm_quota[i],
|
||||
NULL, NULL, qrec,
|
||||
ORPHAN_NEED_TRUNCATE);
|
||||
}
|
||||
ocfs2_queue_recovery_completion(osb->journal, rm_quota[i],
|
||||
NULL, NULL, qrec,
|
||||
ORPHAN_NEED_TRUNCATE);
|
||||
}
|
||||
|
||||
ocfs2_super_unlock(osb, 1);
|
||||
|
@ -1484,7 +1500,8 @@ static int __ocfs2_recovery_thread(void *arg)
|
|||
|
||||
mutex_unlock(&osb->recovery_lock);
|
||||
|
||||
kfree(rm_quota);
|
||||
if (quota_enabled)
|
||||
kfree(rm_quota);
|
||||
|
||||
/* no one is callint kthread_stop() for us so the kthread() api
|
||||
* requires that we call do_exit(). And it isn't exported, but
|
||||
|
|
Loading…
Reference in a new issue