Commit 52c303c5 authored by Mark Fasheh's avatar Mark Fasheh Committed by Joel Becker
Browse files

ocfs2: Check heartbeat mode for kernel stacks only



Commit 2c442719 added some checks for proper
heartbeat mode when the o2cb stack is running.  Unfortunately, it didn't
take into account that a userpsace stack could be running. Fix this by only
doing the check if o2cb is in use. This patch allows userspace stacks to
mount the fs again.

Cc: stable@kernel.org
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
Signed-off-by: default avatarJoel Becker <jlbec@evilplan.org>
parent acf3bb00
Loading
Loading
Loading
Loading
+20 −8
Original line number Diff line number Diff line
@@ -1316,7 +1316,7 @@ static int ocfs2_parse_options(struct super_block *sb,
			       struct mount_options *mopt,
			       int is_remount)
{
	int status;
	int status, user_stack = 0;
	char *p;
	u32 tmp;

@@ -1459,6 +1459,15 @@ static int ocfs2_parse_options(struct super_block *sb,
			memcpy(mopt->cluster_stack, args[0].from,
			       OCFS2_STACK_LABEL_LEN);
			mopt->cluster_stack[OCFS2_STACK_LABEL_LEN] = '\0';
			/*
			 * Open code the memcmp here as we don't have
			 * an osb to pass to
			 * ocfs2_userspace_stack().
			 */
			if (memcmp(mopt->cluster_stack,
				   OCFS2_CLASSIC_CLUSTER_STACK,
				   OCFS2_STACK_LABEL_LEN))
				user_stack = 1;
			break;
		case Opt_inode64:
			mopt->mount_opt |= OCFS2_MOUNT_INODE64;
@@ -1514,14 +1523,17 @@ static int ocfs2_parse_options(struct super_block *sb,
		}
	}

	if (user_stack == 0) {
		/* Ensure only one heartbeat mode */
	tmp = mopt->mount_opt & (OCFS2_MOUNT_HB_LOCAL | OCFS2_MOUNT_HB_GLOBAL |
		tmp = mopt->mount_opt & (OCFS2_MOUNT_HB_LOCAL |
					 OCFS2_MOUNT_HB_GLOBAL |
					 OCFS2_MOUNT_HB_NONE);
		if (hweight32(tmp) != 1) {
			mlog(ML_ERROR, "Invalid heartbeat mount options\n");
			status = 0;
			goto bail;
		}
	}

	status = 1;