Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

f2fs: fix to preserve previous reserve_{blocks,node} value when remount

The following steps will change previous value of reserve_{blocks,node},
this dones not match the original intention.

1.mount -t f2fs -o reserve_root=8192 imgfile test_mount/
F2FS-fs (loop56): Mounted with checkpoint version = 1b69f8c7
mount info:
/dev/block/loop56 on /data/test_mount type f2fs (xxx,reserve_root=8192,reserve_node=0,resuid=0,resgid=0,xxx)

2.mount -t f2fs -o remount,reserve_root=4096 /data/test_mount
F2FS-fs (loop56): Preserve previous reserve_root=8192
check mount info: reserve_root change to 4096
/dev/block/loop56 on /data/test_mount type f2fs (xxx,reserve_root=4096,reserve_node=0,resuid=0,resgid=0,xxx)

Prior to commit d18535132523 ("f2fs: separate the options parsing and options checking"),
the value of reserve_{blocks,node} was only set during the first mount, along with
the corresponding mount option F2FS_MOUNT_RESERVE_{ROOT,NODE} . If the mount option
F2FS_MOUNT_RESERVE_{ROOT,NODE} was found to have been set during the mount/remount,
the previously value of reserve_{blocks,node} would also be preserved, as shown in
the code below.
if (test_opt(sbi, RESERVE_ROOT)) {
f2fs_info(sbi, "Preserve previous reserve_root=%u",
F2FS_OPTION(sbi).root_reserved_blocks);
} else {
F2FS_OPTION(sbi).root_reserved_blocks = arg;
set_opt(sbi, RESERVE_ROOT);
}
But commit d18535132523 ("f2fs: separate the options parsing and options checking")
only preserved the previous mount option; it did not preserve the previous value of
reserve_{blocks,node}. Since value of reserve_{blocks,node} value is assigned
or not depends on ctx->spec_mask, ctx->spec_mask should be alos handled in
f2fs_check_opt_consistency.

This patch will clear the corresponding ctx->spec_mask bits in f2fs_check_opt_consistency
to preserve the previously values of reserve_{blocks,node} if it already have a value.

Fixes: d18535132523 ("f2fs: separate the options parsing and options checking")
Signed-off-by: Zhiguo Niu <zhiguo.niu@unisoc.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

authored by

Zhiguo Niu and committed by
Jaegeuk Kim
01968164 8979bc3d

+2
+2
fs/f2fs/super.c
··· 1515 1515 F2FS_OPTION(sbi).root_reserved_blocks); 1516 1516 ctx_clear_opt(ctx, F2FS_MOUNT_RESERVE_ROOT); 1517 1517 ctx->opt_mask &= ~BIT(F2FS_MOUNT_RESERVE_ROOT); 1518 + ctx->spec_mask &= ~F2FS_SPEC_reserve_root; 1518 1519 } 1519 1520 if (test_opt(sbi, RESERVE_NODE) && 1520 1521 (ctx->opt_mask & BIT(F2FS_MOUNT_RESERVE_NODE)) && ··· 1524 1523 F2FS_OPTION(sbi).root_reserved_nodes); 1525 1524 ctx_clear_opt(ctx, F2FS_MOUNT_RESERVE_NODE); 1526 1525 ctx->opt_mask &= ~BIT(F2FS_MOUNT_RESERVE_NODE); 1526 + ctx->spec_mask &= ~F2FS_SPEC_reserve_node; 1527 1527 } 1528 1528 1529 1529 err = f2fs_check_test_dummy_encryption(fc, sb);