Commit 21158ca8 authored by Guozhonghua's avatar Guozhonghua Committed by Linus Torvalds

ocfs2: without quota support, avoid calling quota recovery

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.comSigned-off-by: default avatarguozhonghua <guozhonghua@h3c.com>
Reviewed-by: default avatarJan 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent a6346447
...@@ -1378,15 +1378,23 @@ static int __ocfs2_recovery_thread(void *arg) ...@@ -1378,15 +1378,23 @@ static int __ocfs2_recovery_thread(void *arg)
int rm_quota_used = 0, i; int rm_quota_used = 0, i;
struct ocfs2_quota_recovery *qrec; 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); status = ocfs2_wait_on_mount(osb);
if (status < 0) { if (status < 0) {
goto bail; goto bail;
} }
rm_quota = kcalloc(osb->max_slots, sizeof(int), GFP_NOFS); if (quota_enabled) {
if (!rm_quota) { rm_quota = kcalloc(osb->max_slots, sizeof(int), GFP_NOFS);
status = -ENOMEM; if (!rm_quota) {
goto bail; status = -ENOMEM;
goto bail;
}
} }
restart: restart:
status = ocfs2_super_lock(osb, 1); status = ocfs2_super_lock(osb, 1);
...@@ -1422,9 +1430,14 @@ static int __ocfs2_recovery_thread(void *arg) ...@@ -1422,9 +1430,14 @@ static int __ocfs2_recovery_thread(void *arg)
* then quota usage would be out of sync until some node takes * then quota usage would be out of sync until some node takes
* the slot. So we remember which nodes need quota recovery * the slot. So we remember which nodes need quota recovery
* and when everything else is done, we recover quotas. */ * and when everything else is done, we recover quotas. */
for (i = 0; i < rm_quota_used && rm_quota[i] != slot_num; i++); if (quota_enabled) {
if (i == rm_quota_used) for (i = 0; i < rm_quota_used
rm_quota[rm_quota_used++] = slot_num; && 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); status = ocfs2_recover_node(osb, node_num, slot_num);
skip_recovery: skip_recovery:
...@@ -1452,16 +1465,19 @@ static int __ocfs2_recovery_thread(void *arg) ...@@ -1452,16 +1465,19 @@ static int __ocfs2_recovery_thread(void *arg)
/* Now it is right time to recover quotas... We have to do this under /* 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) * superblock lock so that no one can start using the slot (and crash)
* before we recover it */ * before we recover it */
for (i = 0; i < rm_quota_used; i++) { if (quota_enabled) {
qrec = ocfs2_begin_quota_recovery(osb, rm_quota[i]); for (i = 0; i < rm_quota_used; i++) {
if (IS_ERR(qrec)) { qrec = ocfs2_begin_quota_recovery(osb, rm_quota[i]);
status = PTR_ERR(qrec); if (IS_ERR(qrec)) {
mlog_errno(status); status = PTR_ERR(qrec);
continue; 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); ocfs2_super_unlock(osb, 1);
...@@ -1483,7 +1499,8 @@ static int __ocfs2_recovery_thread(void *arg) ...@@ -1483,7 +1499,8 @@ static int __ocfs2_recovery_thread(void *arg)
mutex_unlock(&osb->recovery_lock); 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 /* no one is callint kthread_stop() for us so the kthread() api
* requires that we call do_exit(). And it isn't exported, but * requires that we call do_exit(). And it isn't exported, but
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment