* [f2fs-dev] [PATCH] mkfs.f2fs: add -r (fake_seed) and -T flags
@ 2020-08-13 8:42 Theotime Combes via Linux-f2fs-devel
2020-08-18 8:25 ` Chao Yu
0 siblings, 1 reply; 4+ messages in thread
From: Theotime Combes via Linux-f2fs-devel @ 2020-08-13 8:42 UTC (permalink / raw)
To: linux-f2fs-devel
r flag sets the checkpointing seed to 0 (initially used to
remove randomness for apex generation).
T flag sets timestamps to a given value.
Signed-off-by: Theotime Combes <tcombes@google.com>
---
include/f2fs_fs.h | 3 ++-
man/mkfs.f2fs.8 | 13 +++++++++++++
mkfs/f2fs_format.c | 26 ++++++++++++++------------
mkfs/f2fs_format_main.c | 10 +++++++++-
4 files changed, 38 insertions(+), 14 deletions(-)
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index a9982f0..76db3bf 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -405,8 +405,10 @@ struct f2fs_configuration {
int large_nat_bitmap;
int fix_chksum; /* fix old cp.chksum position */
__le32 feature; /* defined features */
+ time_t fixed_time;
/* mkfs parameters */
+ int fake_seed;
u_int32_t next_free_nid;
u_int32_t quota_inum;
u_int32_t quota_dnum;
@@ -427,7 +429,6 @@ struct f2fs_configuration {
char *mount_point;
char *target_out_dir;
char *fs_config_file;
- time_t fixed_time;
#ifdef HAVE_LIBSELINUX
struct selinux_opt seopt_file[8];
int nr_opt;
diff --git a/man/mkfs.f2fs.8 b/man/mkfs.f2fs.8
index 022941f..5266dfd 100644
--- a/man/mkfs.f2fs.8
+++ b/man/mkfs.f2fs.8
@@ -59,6 +59,9 @@ mkfs.f2fs \- create an F2FS file system
.B \-q
]
[
+.B \-r
+]
+[
.B \-R
.I root_owner
]
@@ -74,6 +77,10 @@ mkfs.f2fs \- create an F2FS file system
.I nodiscard/discard
]
[
+.B \-T
+.I timestamp
+]
+[
.B \-w
.I wanted-sector-size
]
@@ -212,6 +219,9 @@ Default is disabled.
Quiet mode.
With it, mkfs.f2fs does not show any messages, including the basic messages.
.TP
+.BI \-r
+Sets the checkpointing srand seed to 0.
+.TP
.BI \-R
Give root_owner option for initial uid/gid assignment.
Default is set by getuid()/getgid(), and assigned by "-R $uid:$gid".
@@ -228,6 +238,9 @@ Enable sparse mode.
Specify 1 or 0 to enable or disable discard policy, respectively.
The default value is 1.
.TP
+.BI \-T " timestamp"
+Set inodes times to a given timestamp.
+.TP
.BI \-w " wanted-sector-size"
Specify the sector size in bytes.
Without it, the sectors will be calculated by device sector size.
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index 1639752..e711982 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -692,7 +692,7 @@ static int f2fs_write_check_point_pack(void)
}
/* 1. cp page 1 of checkpoint pack 1 */
- srand(time(NULL));
+ srand((c.fake_seed) ? 0 : time(NULL));
cp->checkpoint_ver = cpu_to_le64(rand() | 0x1);
set_cp(cur_node_segno[0], c.cur_seg[CURSEG_HOT_NODE]);
set_cp(cur_node_segno[1], c.cur_seg[CURSEG_WARM_NODE]);
@@ -1192,11 +1192,11 @@ static int f2fs_write_root_inode(void)
raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes); /* dentry */
raw_node->i.i_blocks = cpu_to_le64(2);
- raw_node->i.i_atime = cpu_to_le32(time(NULL));
+ raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_atime_nsec = 0;
- raw_node->i.i_ctime = cpu_to_le32(time(NULL));
+ raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_ctime_nsec = 0;
- raw_node->i.i_mtime = cpu_to_le32(time(NULL));
+ raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_mtime_nsec = 0;
raw_node->i.i_generation = 0;
raw_node->i.i_xattr_nid = 0;
@@ -1213,7 +1213,8 @@ static int f2fs_write_root_inode(void)
raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
- raw_node->i.i_crtime = cpu_to_le32(time(NULL));
+ raw_node->i.i_crtime = cpu_to_le32(
+ (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_crtime_nsec = 0;
}
@@ -1350,11 +1351,11 @@ static int f2fs_write_qf_inode(int qtype)
raw_node->i.i_size = cpu_to_le64(1024 * 6); /* Hard coded */
raw_node->i.i_blocks = cpu_to_le64(1 + QUOTA_DATA(qtype));
- raw_node->i.i_atime = cpu_to_le32(time(NULL));
+ raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_atime_nsec = 0;
- raw_node->i.i_ctime = cpu_to_le32(time(NULL));
+ raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_ctime_nsec = 0;
- raw_node->i.i_mtime = cpu_to_le32(time(NULL));
+ raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_mtime_nsec = 0;
raw_node->i.i_generation = 0;
raw_node->i.i_xattr_nid = 0;
@@ -1545,11 +1546,11 @@ static int f2fs_write_lpf_inode(void)
raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes);
raw_node->i.i_blocks = cpu_to_le64(2);
- raw_node->i.i_atime = cpu_to_le32(time(NULL));
+ raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_atime_nsec = 0;
- raw_node->i.i_ctime = cpu_to_le32(time(NULL));
+ raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_ctime_nsec = 0;
- raw_node->i.i_mtime = cpu_to_le32(time(NULL));
+ raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_mtime_nsec = 0;
raw_node->i.i_generation = 0;
raw_node->i.i_xattr_nid = 0;
@@ -1569,7 +1570,8 @@ static int f2fs_write_lpf_inode(void)
raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
- raw_node->i.i_crtime = cpu_to_le32(time(NULL));
+ raw_node->i.i_crtime = cpu_to_le32(
+ (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
raw_node->i.i_crtime_nsec = 0;
}
diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
index 27c1f1d..4acc42a 100644
--- a/mkfs/f2fs_format_main.c
+++ b/mkfs/f2fs_format_main.c
@@ -59,10 +59,12 @@ static void mkfs_usage()
MSG(0, " -C [encoding[:flag1,...]] Support casefolding with optional flags\n");
MSG(0, " -p number of pinned segments (2MB) [default:0]\n");
MSG(0, " -q quiet mode\n");
+ MSG(0, " -r set checkpointing seed (srand()) to 0\n");
MSG(0, " -R root_owner [default: 0:0]\n");
MSG(0, " -s # of segments per section [default:1]\n");
MSG(0, " -S sparse mode\n");
MSG(0, " -t 0: nodiscard, 1: discard [default:1]\n");
+ MSG(0, " -T timestamps\n");
MSG(0, " -w wanted sector size\n");
MSG(0, " -z # of sections per zone [default:1]\n");
MSG(0, " -V print the version number and exit\n");
@@ -124,7 +126,7 @@ static void add_default_options(void)
static void f2fs_parse_options(int argc, char *argv[])
{
- static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:R:s:S:z:t:U:Vfw:";
+ static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:rR:s:S:z:t:T:U:Vfw:";
int32_t option=0;
int val;
char *token;
@@ -187,6 +189,9 @@ static void f2fs_parse_options(int argc, char *argv[])
case 'p':
c.pinned_segments = atof(optarg);
break;
+ case 'r':
+ c.fake_seed = 1;
+ break;
case 'R':
if (parse_root_owner(optarg, &c.root_uid, &c.root_gid))
mkfs_usage();
@@ -205,6 +210,9 @@ static void f2fs_parse_options(int argc, char *argv[])
case 't':
c.trim = atoi(optarg);
break;
+ case 'T':
+ c.fixed_time = strtoul(optarg, NULL, 0);
+ break;
case 'U':
c.vol_uuid = strdup(optarg);
break;
--
2.28.0.236.gb10cc79966-goog
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [f2fs-dev] [PATCH] mkfs.f2fs: add -r (fake_seed) and -T flags
2020-08-13 8:42 [f2fs-dev] [PATCH] mkfs.f2fs: add -r (fake_seed) and -T flags Theotime Combes via Linux-f2fs-devel
@ 2020-08-18 8:25 ` Chao Yu
2020-08-18 9:43 ` Theotime Combes via Linux-f2fs-devel
0 siblings, 1 reply; 4+ messages in thread
From: Chao Yu @ 2020-08-18 8:25 UTC (permalink / raw)
To: Theotime Combes, linux-f2fs-devel
On 2020/8/13 16:42, Theotime Combes via Linux-f2fs-devel wrote:
> r flag sets the checkpointing seed to 0 (initially used to
> remove randomness for apex generation).
> T flag sets timestamps to a given value.
Normally, we introduce one feature in one patch...it helps review,
merge or revert patches more easily, how about splitting this into two.
>
> Signed-off-by: Theotime Combes <tcombes@google.com>
> ---
> include/f2fs_fs.h | 3 ++-
> man/mkfs.f2fs.8 | 13 +++++++++++++
> mkfs/f2fs_format.c | 26 ++++++++++++++------------
> mkfs/f2fs_format_main.c | 10 +++++++++-
> 4 files changed, 38 insertions(+), 14 deletions(-)
>
> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> index a9982f0..76db3bf 100644
> --- a/include/f2fs_fs.h
> +++ b/include/f2fs_fs.h
> @@ -405,8 +405,10 @@ struct f2fs_configuration {
> int large_nat_bitmap;
> int fix_chksum; /* fix old cp.chksum position */
> __le32 feature; /* defined features */
> + time_t fixed_time;
>
> /* mkfs parameters */
> + int fake_seed;
> u_int32_t next_free_nid;
> u_int32_t quota_inum;
> u_int32_t quota_dnum;
> @@ -427,7 +429,6 @@ struct f2fs_configuration {
> char *mount_point;
> char *target_out_dir;
> char *fs_config_file;
> - time_t fixed_time;
> #ifdef HAVE_LIBSELINUX
> struct selinux_opt seopt_file[8];
> int nr_opt;
> diff --git a/man/mkfs.f2fs.8 b/man/mkfs.f2fs.8
> index 022941f..5266dfd 100644
> --- a/man/mkfs.f2fs.8
> +++ b/man/mkfs.f2fs.8
> @@ -59,6 +59,9 @@ mkfs.f2fs \- create an F2FS file system
> .B \-q
> ]
> [
> +.B \-r
> +]
> +[
> .B \-R
> .I root_owner
> ]
> @@ -74,6 +77,10 @@ mkfs.f2fs \- create an F2FS file system
> .I nodiscard/discard
> ]
> [
> +.B \-T
> +.I timestamp
> +]
> +[
> .B \-w
> .I wanted-sector-size
> ]
> @@ -212,6 +219,9 @@ Default is disabled.
> Quiet mode.
> With it, mkfs.f2fs does not show any messages, including the basic messages.
> .TP
> +.BI \-r
> +Sets the checkpointing srand seed to 0.
> +.TP
> .BI \-R
> Give root_owner option for initial uid/gid assignment.
> Default is set by getuid()/getgid(), and assigned by "-R $uid:$gid".
> @@ -228,6 +238,9 @@ Enable sparse mode.
> Specify 1 or 0 to enable or disable discard policy, respectively.
> The default value is 1.
> .TP
> +.BI \-T " timestamp"
> +Set inodes times to a given timestamp.
Can we set this value to -1?
> +.TP
> .BI \-w " wanted-sector-size"
> Specify the sector size in bytes.
> Without it, the sectors will be calculated by device sector size.
> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> index 1639752..e711982 100644
> --- a/mkfs/f2fs_format.c
> +++ b/mkfs/f2fs_format.c
> @@ -692,7 +692,7 @@ static int f2fs_write_check_point_pack(void)
> }
>
> /* 1. cp page 1 of checkpoint pack 1 */
> - srand(time(NULL));
> + srand((c.fake_seed) ? 0 : time(NULL));
> cp->checkpoint_ver = cpu_to_le64(rand() | 0x1);
> set_cp(cur_node_segno[0], c.cur_seg[CURSEG_HOT_NODE]);
> set_cp(cur_node_segno[1], c.cur_seg[CURSEG_WARM_NODE]);
> @@ -1192,11 +1192,11 @@ static int f2fs_write_root_inode(void)
> raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes); /* dentry */
> raw_node->i.i_blocks = cpu_to_le64(2);
>
> - raw_node->i.i_atime = cpu_to_le32(time(NULL));
> + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
How about wrapping
(c.fixed_time == -1) ? time(NULL) : c.fixed_time)
to inline function or macro?
Thanks,
> raw_node->i.i_atime_nsec = 0;
> - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
> + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_ctime_nsec = 0;
> - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
> + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_mtime_nsec = 0;
> raw_node->i.i_generation = 0;
> raw_node->i.i_xattr_nid = 0;
> @@ -1213,7 +1213,8 @@ static int f2fs_write_root_inode(void)
> raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
>
> if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
> - raw_node->i.i_crtime = cpu_to_le32(time(NULL));
> + raw_node->i.i_crtime = cpu_to_le32(
> + (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_crtime_nsec = 0;
> }
>
> @@ -1350,11 +1351,11 @@ static int f2fs_write_qf_inode(int qtype)
> raw_node->i.i_size = cpu_to_le64(1024 * 6); /* Hard coded */
> raw_node->i.i_blocks = cpu_to_le64(1 + QUOTA_DATA(qtype));
>
> - raw_node->i.i_atime = cpu_to_le32(time(NULL));
> + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_atime_nsec = 0;
> - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
> + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_ctime_nsec = 0;
> - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
> + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_mtime_nsec = 0;
> raw_node->i.i_generation = 0;
> raw_node->i.i_xattr_nid = 0;
> @@ -1545,11 +1546,11 @@ static int f2fs_write_lpf_inode(void)
> raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes);
> raw_node->i.i_blocks = cpu_to_le64(2);
>
> - raw_node->i.i_atime = cpu_to_le32(time(NULL));
> + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_atime_nsec = 0;
> - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
> + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_ctime_nsec = 0;
> - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
> + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_mtime_nsec = 0;
> raw_node->i.i_generation = 0;
> raw_node->i.i_xattr_nid = 0;
> @@ -1569,7 +1570,8 @@ static int f2fs_write_lpf_inode(void)
> raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
>
> if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
> - raw_node->i.i_crtime = cpu_to_le32(time(NULL));
> + raw_node->i.i_crtime = cpu_to_le32(
> + (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> raw_node->i.i_crtime_nsec = 0;
> }
>
> diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
> index 27c1f1d..4acc42a 100644
> --- a/mkfs/f2fs_format_main.c
> +++ b/mkfs/f2fs_format_main.c
> @@ -59,10 +59,12 @@ static void mkfs_usage()
> MSG(0, " -C [encoding[:flag1,...]] Support casefolding with optional flags\n");
> MSG(0, " -p number of pinned segments (2MB) [default:0]\n");
> MSG(0, " -q quiet mode\n");
> + MSG(0, " -r set checkpointing seed (srand()) to 0\n");
> MSG(0, " -R root_owner [default: 0:0]\n");
> MSG(0, " -s # of segments per section [default:1]\n");
> MSG(0, " -S sparse mode\n");
> MSG(0, " -t 0: nodiscard, 1: discard [default:1]\n");
> + MSG(0, " -T timestamps\n");
> MSG(0, " -w wanted sector size\n");
> MSG(0, " -z # of sections per zone [default:1]\n");
> MSG(0, " -V print the version number and exit\n");
> @@ -124,7 +126,7 @@ static void add_default_options(void)
>
> static void f2fs_parse_options(int argc, char *argv[])
> {
> - static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:R:s:S:z:t:U:Vfw:";
> + static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:rR:s:S:z:t:T:U:Vfw:";
> int32_t option=0;
> int val;
> char *token;
> @@ -187,6 +189,9 @@ static void f2fs_parse_options(int argc, char *argv[])
> case 'p':
> c.pinned_segments = atof(optarg);
> break;
> + case 'r':
> + c.fake_seed = 1;
> + break;
> case 'R':
> if (parse_root_owner(optarg, &c.root_uid, &c.root_gid))
> mkfs_usage();
> @@ -205,6 +210,9 @@ static void f2fs_parse_options(int argc, char *argv[])
> case 't':
> c.trim = atoi(optarg);
> break;
> + case 'T':
> + c.fixed_time = strtoul(optarg, NULL, 0);
> + break;
> case 'U':
> c.vol_uuid = strdup(optarg);
> break;
>
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [f2fs-dev] [PATCH] mkfs.f2fs: add -r (fake_seed) and -T flags
2020-08-18 8:25 ` Chao Yu
@ 2020-08-18 9:43 ` Theotime Combes via Linux-f2fs-devel
2020-08-18 9:58 ` Chao Yu
0 siblings, 1 reply; 4+ messages in thread
From: Theotime Combes via Linux-f2fs-devel @ 2020-08-18 9:43 UTC (permalink / raw)
To: Chao Yu; +Cc: linux-f2fs-devel
On Tue, Aug 18, 2020 at 10:26 AM Chao Yu <yuchao0@huawei.com> wrote:
> On 2020/8/13 16:42, Theotime Combes via Linux-f2fs-devel wrote:
> > r flag sets the checkpointing seed to 0 (initially used to
> > remove randomness for apex generation).
> > T flag sets timestamps to a given value.
>
> Normally, we introduce one feature in one patch...it helps review,
> merge or revert patches more easily, how about splitting this into two.
>
Sure, I'll split it into two.
> >
> > Signed-off-by: Theotime Combes <tcombes@google.com>
> > ---
> > include/f2fs_fs.h | 3 ++-
> > man/mkfs.f2fs.8 | 13 +++++++++++++
> > mkfs/f2fs_format.c | 26 ++++++++++++++------------
> > mkfs/f2fs_format_main.c | 10 +++++++++-
> > 4 files changed, 38 insertions(+), 14 deletions(-)
> >
> > diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> > index a9982f0..76db3bf 100644
> > --- a/include/f2fs_fs.h
> > +++ b/include/f2fs_fs.h
> > @@ -405,8 +405,10 @@ struct f2fs_configuration {
> > int large_nat_bitmap;
> > int fix_chksum; /* fix old cp.chksum position */
> > __le32 feature; /* defined features */
> > + time_t fixed_time;
> >
> > /* mkfs parameters */
> > + int fake_seed;
> > u_int32_t next_free_nid;
> > u_int32_t quota_inum;
> > u_int32_t quota_dnum;
> > @@ -427,7 +429,6 @@ struct f2fs_configuration {
> > char *mount_point;
> > char *target_out_dir;
> > char *fs_config_file;
> > - time_t fixed_time;
> > #ifdef HAVE_LIBSELINUX
> > struct selinux_opt seopt_file[8];
> > int nr_opt;
> > diff --git a/man/mkfs.f2fs.8 b/man/mkfs.f2fs.8
> > index 022941f..5266dfd 100644
> > --- a/man/mkfs.f2fs.8
> > +++ b/man/mkfs.f2fs.8
> > @@ -59,6 +59,9 @@ mkfs.f2fs \- create an F2FS file system
> > .B \-q
> > ]
> > [
> > +.B \-r
> > +]
> > +[
> > .B \-R
> > .I root_owner
> > ]
> > @@ -74,6 +77,10 @@ mkfs.f2fs \- create an F2FS file system
> > .I nodiscard/discard
> > ]
> > [
> > +.B \-T
> > +.I timestamp
> > +]
> > +[
> > .B \-w
> > .I wanted-sector-size
> > ]
> > @@ -212,6 +219,9 @@ Default is disabled.
> > Quiet mode.
> > With it, mkfs.f2fs does not show any messages, including the basic messages.
> > .TP
> > +.BI \-r
> > +Sets the checkpointing srand seed to 0.
> > +.TP
> > .BI \-R
> > Give root_owner option for initial uid/gid assignment.
> > Default is set by getuid()/getgid(), and assigned by "-R $uid:$gid".
> > @@ -228,6 +238,9 @@ Enable sparse mode.
> > Specify 1 or 0 to enable or disable discard policy, respectively.
> > The default value is 1.
> > .TP
> > +.BI \-T " timestamp"
> > +Set inodes times to a given timestamp.
>
> Can we set this value to -1?
>
-1 is used as an init value, therefore setting this value to -1 will
fall back to using the current time. Should I specify it here ?
> > +.TP
> > .BI \-w " wanted-sector-size"
> > Specify the sector size in bytes.
> > Without it, the sectors will be calculated by device sector size.
> > diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> > index 1639752..e711982 100644
> > --- a/mkfs/f2fs_format.c
> > +++ b/mkfs/f2fs_format.c
> > @@ -692,7 +692,7 @@ static int f2fs_write_check_point_pack(void)
> > }
> >
> > /* 1. cp page 1 of checkpoint pack 1 */
> > - srand(time(NULL));
> > + srand((c.fake_seed) ? 0 : time(NULL));
> > cp->checkpoint_ver = cpu_to_le64(rand() | 0x1);
> > set_cp(cur_node_segno[0], c.cur_seg[CURSEG_HOT_NODE]);
> > set_cp(cur_node_segno[1], c.cur_seg[CURSEG_WARM_NODE]);
> > @@ -1192,11 +1192,11 @@ static int f2fs_write_root_inode(void)
> > raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes); /* dentry */
> > raw_node->i.i_blocks = cpu_to_le64(2);
> >
> > - raw_node->i.i_atime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>
> How about wrapping
>
> (c.fixed_time == -1) ? time(NULL) : c.fixed_time)
>
> to inline function or macro?
I'll replace it with a macro in the new patch (once split),
Thanks for the review!
>
> Thanks,
>
> > raw_node->i.i_atime_nsec = 0;
> > - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_ctime_nsec = 0;
> > - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_mtime_nsec = 0;
> > raw_node->i.i_generation = 0;
> > raw_node->i.i_xattr_nid = 0;
> > @@ -1213,7 +1213,8 @@ static int f2fs_write_root_inode(void)
> > raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
> >
> > if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
> > - raw_node->i.i_crtime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_crtime = cpu_to_le32(
> > + (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_crtime_nsec = 0;
> > }
> >
> > @@ -1350,11 +1351,11 @@ static int f2fs_write_qf_inode(int qtype)
> > raw_node->i.i_size = cpu_to_le64(1024 * 6); /* Hard coded */
> > raw_node->i.i_blocks = cpu_to_le64(1 + QUOTA_DATA(qtype));
> >
> > - raw_node->i.i_atime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_atime_nsec = 0;
> > - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_ctime_nsec = 0;
> > - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_mtime_nsec = 0;
> > raw_node->i.i_generation = 0;
> > raw_node->i.i_xattr_nid = 0;
> > @@ -1545,11 +1546,11 @@ static int f2fs_write_lpf_inode(void)
> > raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes);
> > raw_node->i.i_blocks = cpu_to_le64(2);
> >
> > - raw_node->i.i_atime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_atime_nsec = 0;
> > - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_ctime_nsec = 0;
> > - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_mtime_nsec = 0;
> > raw_node->i.i_generation = 0;
> > raw_node->i.i_xattr_nid = 0;
> > @@ -1569,7 +1570,8 @@ static int f2fs_write_lpf_inode(void)
> > raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
> >
> > if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
> > - raw_node->i.i_crtime = cpu_to_le32(time(NULL));
> > + raw_node->i.i_crtime = cpu_to_le32(
> > + (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
> > raw_node->i.i_crtime_nsec = 0;
> > }
> >
> > diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
> > index 27c1f1d..4acc42a 100644
> > --- a/mkfs/f2fs_format_main.c
> > +++ b/mkfs/f2fs_format_main.c
> > @@ -59,10 +59,12 @@ static void mkfs_usage()
> > MSG(0, " -C [encoding[:flag1,...]] Support casefolding with optional flags\n");
> > MSG(0, " -p number of pinned segments (2MB) [default:0]\n");
> > MSG(0, " -q quiet mode\n");
> > + MSG(0, " -r set checkpointing seed (srand()) to 0\n");
> > MSG(0, " -R root_owner [default: 0:0]\n");
> > MSG(0, " -s # of segments per section [default:1]\n");
> > MSG(0, " -S sparse mode\n");
> > MSG(0, " -t 0: nodiscard, 1: discard [default:1]\n");
> > + MSG(0, " -T timestamps\n");
> > MSG(0, " -w wanted sector size\n");
> > MSG(0, " -z # of sections per zone [default:1]\n");
> > MSG(0, " -V print the version number and exit\n");
> > @@ -124,7 +126,7 @@ static void add_default_options(void)
> >
> > static void f2fs_parse_options(int argc, char *argv[])
> > {
> > - static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:R:s:S:z:t:U:Vfw:";
> > + static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:rR:s:S:z:t:T:U:Vfw:";
> > int32_t option=0;
> > int val;
> > char *token;
> > @@ -187,6 +189,9 @@ static void f2fs_parse_options(int argc, char *argv[])
> > case 'p':
> > c.pinned_segments = atof(optarg);
> > break;
> > + case 'r':
> > + c.fake_seed = 1;
> > + break;
> > case 'R':
> > if (parse_root_owner(optarg, &c.root_uid, &c.root_gid))
> > mkfs_usage();
> > @@ -205,6 +210,9 @@ static void f2fs_parse_options(int argc, char *argv[])
> > case 't':
> > c.trim = atoi(optarg);
> > break;
> > + case 'T':
> > + c.fixed_time = strtoul(optarg, NULL, 0);
> > + break;
> > case 'U':
> > c.vol_uuid = strdup(optarg);
> > break;
> >
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [f2fs-dev] [PATCH] mkfs.f2fs: add -r (fake_seed) and -T flags
2020-08-18 9:43 ` Theotime Combes via Linux-f2fs-devel
@ 2020-08-18 9:58 ` Chao Yu
0 siblings, 0 replies; 4+ messages in thread
From: Chao Yu @ 2020-08-18 9:58 UTC (permalink / raw)
To: Theotime Combes; +Cc: linux-f2fs-devel
On 2020/8/18 17:43, Theotime Combes wrote:
> On Tue, Aug 18, 2020 at 10:26 AM Chao Yu <yuchao0@huawei.com> wrote:
>> On 2020/8/13 16:42, Theotime Combes via Linux-f2fs-devel wrote:
>>> r flag sets the checkpointing seed to 0 (initially used to
>>> remove randomness for apex generation).
>>> T flag sets timestamps to a given value.
>>
>> Normally, we introduce one feature in one patch...it helps review,
>> merge or revert patches more easily, how about splitting this into two.
>>
>
> Sure, I'll split it into two.
>
>>>
>>> Signed-off-by: Theotime Combes <tcombes@google.com>
>>> ---
>>> include/f2fs_fs.h | 3 ++-
>>> man/mkfs.f2fs.8 | 13 +++++++++++++
>>> mkfs/f2fs_format.c | 26 ++++++++++++++------------
>>> mkfs/f2fs_format_main.c | 10 +++++++++-
>>> 4 files changed, 38 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
>>> index a9982f0..76db3bf 100644
>>> --- a/include/f2fs_fs.h
>>> +++ b/include/f2fs_fs.h
>>> @@ -405,8 +405,10 @@ struct f2fs_configuration {
>>> int large_nat_bitmap;
>>> int fix_chksum; /* fix old cp.chksum position */
>>> __le32 feature; /* defined features */
>>> + time_t fixed_time;
>>>
>>> /* mkfs parameters */
>>> + int fake_seed;
>>> u_int32_t next_free_nid;
>>> u_int32_t quota_inum;
>>> u_int32_t quota_dnum;
>>> @@ -427,7 +429,6 @@ struct f2fs_configuration {
>>> char *mount_point;
>>> char *target_out_dir;
>>> char *fs_config_file;
>>> - time_t fixed_time;
>>> #ifdef HAVE_LIBSELINUX
>>> struct selinux_opt seopt_file[8];
>>> int nr_opt;
>>> diff --git a/man/mkfs.f2fs.8 b/man/mkfs.f2fs.8
>>> index 022941f..5266dfd 100644
>>> --- a/man/mkfs.f2fs.8
>>> +++ b/man/mkfs.f2fs.8
>>> @@ -59,6 +59,9 @@ mkfs.f2fs \- create an F2FS file system
>>> .B \-q
>>> ]
>>> [
>>> +.B \-r
>>> +]
>>> +[
>>> .B \-R
>>> .I root_owner
>>> ]
>>> @@ -74,6 +77,10 @@ mkfs.f2fs \- create an F2FS file system
>>> .I nodiscard/discard
>>> ]
>>> [
>>> +.B \-T
>>> +.I timestamp
>>> +]
>>> +[
>>> .B \-w
>>> .I wanted-sector-size
>>> ]
>>> @@ -212,6 +219,9 @@ Default is disabled.
>>> Quiet mode.
>>> With it, mkfs.f2fs does not show any messages, including the basic messages.
>>> .TP
>>> +.BI \-r
>>> +Sets the checkpointing srand seed to 0.
>>> +.TP
>>> .BI \-R
>>> Give root_owner option for initial uid/gid assignment.
>>> Default is set by getuid()/getgid(), and assigned by "-R $uid:$gid".
>>> @@ -228,6 +238,9 @@ Enable sparse mode.
>>> Specify 1 or 0 to enable or disable discard policy, respectively.
>>> The default value is 1.
>>> .TP
>>> +.BI \-T " timestamp"
>>> +Set inodes times to a given timestamp.
>>
>> Can we set this value to -1?
>>
>
> -1 is used as an init value, therefore setting this value to -1 will
> fall back to using the current time. Should I specify it here ?
Yes, it's better to add it into manual, :)
Thanks,
>
>>> +.TP
>>> .BI \-w " wanted-sector-size"
>>> Specify the sector size in bytes.
>>> Without it, the sectors will be calculated by device sector size.
>>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
>>> index 1639752..e711982 100644
>>> --- a/mkfs/f2fs_format.c
>>> +++ b/mkfs/f2fs_format.c
>>> @@ -692,7 +692,7 @@ static int f2fs_write_check_point_pack(void)
>>> }
>>>
>>> /* 1. cp page 1 of checkpoint pack 1 */
>>> - srand(time(NULL));
>>> + srand((c.fake_seed) ? 0 : time(NULL));
>>> cp->checkpoint_ver = cpu_to_le64(rand() | 0x1);
>>> set_cp(cur_node_segno[0], c.cur_seg[CURSEG_HOT_NODE]);
>>> set_cp(cur_node_segno[1], c.cur_seg[CURSEG_WARM_NODE]);
>>> @@ -1192,11 +1192,11 @@ static int f2fs_write_root_inode(void)
>>> raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes); /* dentry */
>>> raw_node->i.i_blocks = cpu_to_le64(2);
>>>
>>> - raw_node->i.i_atime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>
>> How about wrapping
>>
>> (c.fixed_time == -1) ? time(NULL) : c.fixed_time)
>>
>> to inline function or macro?
>
> I'll replace it with a macro in the new patch (once split),
> Thanks for the review!
>
>>
>> Thanks,
>>
>>> raw_node->i.i_atime_nsec = 0;
>>> - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_ctime_nsec = 0;
>>> - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_mtime_nsec = 0;
>>> raw_node->i.i_generation = 0;
>>> raw_node->i.i_xattr_nid = 0;
>>> @@ -1213,7 +1213,8 @@ static int f2fs_write_root_inode(void)
>>> raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
>>>
>>> if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
>>> - raw_node->i.i_crtime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_crtime = cpu_to_le32(
>>> + (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_crtime_nsec = 0;
>>> }
>>>
>>> @@ -1350,11 +1351,11 @@ static int f2fs_write_qf_inode(int qtype)
>>> raw_node->i.i_size = cpu_to_le64(1024 * 6); /* Hard coded */
>>> raw_node->i.i_blocks = cpu_to_le64(1 + QUOTA_DATA(qtype));
>>>
>>> - raw_node->i.i_atime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_atime_nsec = 0;
>>> - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_ctime_nsec = 0;
>>> - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_mtime_nsec = 0;
>>> raw_node->i.i_generation = 0;
>>> raw_node->i.i_xattr_nid = 0;
>>> @@ -1545,11 +1546,11 @@ static int f2fs_write_lpf_inode(void)
>>> raw_node->i.i_size = cpu_to_le64(1 * blk_size_bytes);
>>> raw_node->i.i_blocks = cpu_to_le64(2);
>>>
>>> - raw_node->i.i_atime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_atime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_atime_nsec = 0;
>>> - raw_node->i.i_ctime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_ctime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_ctime_nsec = 0;
>>> - raw_node->i.i_mtime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_mtime = cpu_to_le32((c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_mtime_nsec = 0;
>>> raw_node->i.i_generation = 0;
>>> raw_node->i.i_xattr_nid = 0;
>>> @@ -1569,7 +1570,8 @@ static int f2fs_write_lpf_inode(void)
>>> raw_node->i.i_projid = cpu_to_le32(F2FS_DEF_PROJID);
>>>
>>> if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CRTIME)) {
>>> - raw_node->i.i_crtime = cpu_to_le32(time(NULL));
>>> + raw_node->i.i_crtime = cpu_to_le32(
>>> + (c.fixed_time == -1) ? time(NULL) : c.fixed_time);
>>> raw_node->i.i_crtime_nsec = 0;
>>> }
>>>
>>> diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
>>> index 27c1f1d..4acc42a 100644
>>> --- a/mkfs/f2fs_format_main.c
>>> +++ b/mkfs/f2fs_format_main.c
>>> @@ -59,10 +59,12 @@ static void mkfs_usage()
>>> MSG(0, " -C [encoding[:flag1,...]] Support casefolding with optional flags\n");
>>> MSG(0, " -p number of pinned segments (2MB) [default:0]\n");
>>> MSG(0, " -q quiet mode\n");
>>> + MSG(0, " -r set checkpointing seed (srand()) to 0\n");
>>> MSG(0, " -R root_owner [default: 0:0]\n");
>>> MSG(0, " -s # of segments per section [default:1]\n");
>>> MSG(0, " -S sparse mode\n");
>>> MSG(0, " -t 0: nodiscard, 1: discard [default:1]\n");
>>> + MSG(0, " -T timestamps\n");
>>> MSG(0, " -w wanted sector size\n");
>>> MSG(0, " -z # of sections per zone [default:1]\n");
>>> MSG(0, " -V print the version number and exit\n");
>>> @@ -124,7 +126,7 @@ static void add_default_options(void)
>>>
>>> static void f2fs_parse_options(int argc, char *argv[])
>>> {
>>> - static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:R:s:S:z:t:U:Vfw:";
>>> + static const char *option_string = "qa:c:C:d:e:E:g:il:mo:O:p:rR:s:S:z:t:T:U:Vfw:";
>>> int32_t option=0;
>>> int val;
>>> char *token;
>>> @@ -187,6 +189,9 @@ static void f2fs_parse_options(int argc, char *argv[])
>>> case 'p':
>>> c.pinned_segments = atof(optarg);
>>> break;
>>> + case 'r':
>>> + c.fake_seed = 1;
>>> + break;
>>> case 'R':
>>> if (parse_root_owner(optarg, &c.root_uid, &c.root_gid))
>>> mkfs_usage();
>>> @@ -205,6 +210,9 @@ static void f2fs_parse_options(int argc, char *argv[])
>>> case 't':
>>> c.trim = atoi(optarg);
>>> break;
>>> + case 'T':
>>> + c.fixed_time = strtoul(optarg, NULL, 0);
>>> + break;
>>> case 'U':
>>> c.vol_uuid = strdup(optarg);
>>> break;
>>>
> .
>
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-08-18 9:59 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-13 8:42 [f2fs-dev] [PATCH] mkfs.f2fs: add -r (fake_seed) and -T flags Theotime Combes via Linux-f2fs-devel
2020-08-18 8:25 ` Chao Yu
2020-08-18 9:43 ` Theotime Combes via Linux-f2fs-devel
2020-08-18 9:58 ` Chao Yu
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.