Commit 158a5d61 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2:
  ocfs2: Check heartbeat mode for kernel stacks only
  Ocfs2/refcounttree: Fix a bug for refcounttree to writeback clusters in a right number.
  ocfs2: Fix estimate of necessary credits for mkdir
parents c4319c7d 52c303c5
...@@ -405,9 +405,9 @@ static inline int ocfs2_remove_extent_credits(struct super_block *sb) ...@@ -405,9 +405,9 @@ static inline int ocfs2_remove_extent_credits(struct super_block *sb)
ocfs2_quota_trans_credits(sb); ocfs2_quota_trans_credits(sb);
} }
/* data block for new dir/symlink, 2 for bitmap updates (bitmap fe + /* data block for new dir/symlink, allocation of directory block, dx_root
* bitmap block for the new bit) dx_root update for free list */ * update for free list */
#define OCFS2_DIR_LINK_ADDITIONAL_CREDITS (1 + 2 + 1) #define OCFS2_DIR_LINK_ADDITIONAL_CREDITS (1 + OCFS2_SUBALLOC_ALLOC + 1)
static inline int ocfs2_add_dir_index_credits(struct super_block *sb) static inline int ocfs2_add_dir_index_credits(struct super_block *sb)
{ {
......
...@@ -3228,7 +3228,7 @@ static int ocfs2_make_clusters_writable(struct super_block *sb, ...@@ -3228,7 +3228,7 @@ static int ocfs2_make_clusters_writable(struct super_block *sb,
u32 num_clusters, unsigned int e_flags) u32 num_clusters, unsigned int e_flags)
{ {
int ret, delete, index, credits = 0; int ret, delete, index, credits = 0;
u32 new_bit, new_len; u32 new_bit, new_len, orig_num_clusters;
unsigned int set_len; unsigned int set_len;
struct ocfs2_super *osb = OCFS2_SB(sb); struct ocfs2_super *osb = OCFS2_SB(sb);
handle_t *handle; handle_t *handle;
...@@ -3261,6 +3261,8 @@ static int ocfs2_make_clusters_writable(struct super_block *sb, ...@@ -3261,6 +3261,8 @@ static int ocfs2_make_clusters_writable(struct super_block *sb,
goto out; goto out;
} }
orig_num_clusters = num_clusters;
while (num_clusters) { while (num_clusters) {
ret = ocfs2_get_refcount_rec(ref_ci, context->ref_root_bh, ret = ocfs2_get_refcount_rec(ref_ci, context->ref_root_bh,
p_cluster, num_clusters, p_cluster, num_clusters,
...@@ -3348,7 +3350,8 @@ static int ocfs2_make_clusters_writable(struct super_block *sb, ...@@ -3348,7 +3350,8 @@ static int ocfs2_make_clusters_writable(struct super_block *sb,
* in write-back mode. * in write-back mode.
*/ */
if (context->get_clusters == ocfs2_di_get_clusters) { if (context->get_clusters == ocfs2_di_get_clusters) {
ret = ocfs2_cow_sync_writeback(sb, context, cpos, num_clusters); ret = ocfs2_cow_sync_writeback(sb, context, cpos,
orig_num_clusters);
if (ret) if (ret)
mlog_errno(ret); mlog_errno(ret);
} }
......
...@@ -1316,7 +1316,7 @@ static int ocfs2_parse_options(struct super_block *sb, ...@@ -1316,7 +1316,7 @@ static int ocfs2_parse_options(struct super_block *sb,
struct mount_options *mopt, struct mount_options *mopt,
int is_remount) int is_remount)
{ {
int status; int status, user_stack = 0;
char *p; char *p;
u32 tmp; u32 tmp;
...@@ -1459,6 +1459,15 @@ static int ocfs2_parse_options(struct super_block *sb, ...@@ -1459,6 +1459,15 @@ static int ocfs2_parse_options(struct super_block *sb,
memcpy(mopt->cluster_stack, args[0].from, memcpy(mopt->cluster_stack, args[0].from,
OCFS2_STACK_LABEL_LEN); OCFS2_STACK_LABEL_LEN);
mopt->cluster_stack[OCFS2_STACK_LABEL_LEN] = '\0'; 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; break;
case Opt_inode64: case Opt_inode64:
mopt->mount_opt |= OCFS2_MOUNT_INODE64; mopt->mount_opt |= OCFS2_MOUNT_INODE64;
...@@ -1514,13 +1523,16 @@ static int ocfs2_parse_options(struct super_block *sb, ...@@ -1514,13 +1523,16 @@ static int ocfs2_parse_options(struct super_block *sb,
} }
} }
/* Ensure only one heartbeat mode */ if (user_stack == 0) {
tmp = mopt->mount_opt & (OCFS2_MOUNT_HB_LOCAL | OCFS2_MOUNT_HB_GLOBAL | /* Ensure only one heartbeat mode */
OCFS2_MOUNT_HB_NONE); tmp = mopt->mount_opt & (OCFS2_MOUNT_HB_LOCAL |
if (hweight32(tmp) != 1) { OCFS2_MOUNT_HB_GLOBAL |
mlog(ML_ERROR, "Invalid heartbeat mount options\n"); OCFS2_MOUNT_HB_NONE);
status = 0; if (hweight32(tmp) != 1) {
goto bail; mlog(ML_ERROR, "Invalid heartbeat mount options\n");
status = 0;
goto bail;
}
} }
status = 1; status = 1;
......
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