On Tue, 24 Feb 2015 20:04:16 +0100, Andreas Rohner wrote: > This patch adds a new feature flag NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS, > which allows the user to enable and disable the tracking of live > blocks. The flag can be set at file system creation time with mkfs or > at any later time with nilfs-tune. > > Additionally a new option NILFS_OPT_TRACK_LIVE_BLKS is added to be > used by the GC. It is set to the same value as > NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS at startup. It is mainly used to > easily and efficiently check for the feature at runtime and to disable > it if the kernel doesn't support it. > > It is fully backwards compatible, because > NILFS_FEATURE_COMPAT_SUFILE_EXTENSION also is backwards compatible and > it basically only tells the kernel to update a counter for every > segment in the SUFILE. If the kernel doesn't support it, the counter > won't be updated and the GC policies depending on that information > will work less efficient, but they would still work. > > Signed-off-by: Andreas Rohner <andreas.rohner@xxxxxxx> > --- > include/nilfs.h | 30 +++++++++++++++++++++++++++--- > include/nilfs2_fs.h | 4 +++- > lib/feature.c | 2 ++ > lib/nilfs.c | 32 ++++---------------------------- > man/mkfs.nilfs2.8 | 6 ++++++ > sbin/mkfs/mkfs.c | 3 ++- > sbin/nilfs-tune/nilfs-tune.c | 4 ++-- > 7 files changed, 46 insertions(+), 35 deletions(-) > > diff --git a/include/nilfs.h b/include/nilfs.h > index f695f48..22a9190 100644 > --- a/include/nilfs.h > +++ b/include/nilfs.h > @@ -130,6 +130,7 @@ struct nilfs { > > #define NILFS_OPT_MMAP 0x01 > #define NILFS_OPT_SET_SUINFO 0x02 > +#define NILFS_OPT_TRACK_LIVE_BLKS 0x04 > > > struct nilfs *nilfs_open(const char *, const char *, int); > @@ -141,9 +142,25 @@ void nilfs_opt_clear_mmap(struct nilfs *); > int nilfs_opt_set_mmap(struct nilfs *); > int nilfs_opt_test_mmap(struct nilfs *); > > -void nilfs_opt_clear_set_suinfo(struct nilfs *); > -int nilfs_opt_set_set_suinfo(struct nilfs *); > -int nilfs_opt_test_set_suinfo(struct nilfs *); > +#define NILFS_OPT_FLAG(flag, name) \ > +static inline void \ > +nilfs_opt_set_##name(struct nilfs *nilfs) \ > +{ \ > + nilfs->n_opts |= NILFS_OPT_##flag; \ > +} \ > +static inline void \ > +nilfs_opt_clear_##name(struct nilfs *nilfs) \ > +{ \ > + nilfs->n_opts &= ~NILFS_OPT_##flag; \ > +} \ > +static inline int \ > +nilfs_opt_test_##name(const struct nilfs *nilfs) \ > +{ \ > + return !!(nilfs->n_opts & NILFS_OPT_##flag); \ > +} Don't break library compatibility by inlining. Al least this should be done in a separate patch. I think we should do the opposite thing. I mean that the implementation of nilfs structure should be hidden in nilfs library sometime when we will bump up the library version because it will break the library compatibility. > + > +NILFS_OPT_FLAG(SET_SUINFO, set_suinfo); > +NILFS_OPT_FLAG(TRACK_LIVE_BLKS, track_live_blks); > > nilfs_cno_t nilfs_get_oldest_cno(struct nilfs *); > > @@ -326,4 +343,11 @@ static inline __u32 nilfs_get_blocks_per_segment(const struct nilfs *nilfs) > return le32_to_cpu(nilfs->n_sb->s_blocks_per_segment); > } > > +static inline int nilfs_feature_track_live_blks(const struct nilfs *nilfs) > +{ > + __u64 fc = le64_to_cpu(nilfs->n_sb->s_feature_compat); > + return (fc & NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS) && > + (fc & NILFS_FEATURE_COMPAT_SUFILE_EXTENSION); > +} > + > #endif /* NILFS_H */ > diff --git a/include/nilfs2_fs.h b/include/nilfs2_fs.h > index d01a924..427ca53 100644 > --- a/include/nilfs2_fs.h > +++ b/include/nilfs2_fs.h > @@ -220,10 +220,12 @@ struct nilfs_super_block { > * doesn't know about, it should refuse to mount the filesystem. > */ > #define NILFS_FEATURE_COMPAT_SUFILE_EXTENSION (1ULL << 0) > +#define NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS (1ULL << 1) > > #define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT (1ULL << 0) > > -#define NILFS_FEATURE_COMPAT_SUPP NILFS_FEATURE_COMPAT_SUFILE_EXTENSION > +#define NILFS_FEATURE_COMPAT_SUPP (NILFS_FEATURE_COMPAT_SUFILE_EXTENSION \ > + | NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS) > #define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT > #define NILFS_FEATURE_INCOMPAT_SUPP 0ULL > > diff --git a/lib/feature.c b/lib/feature.c > index d954cda..ebe8c3f 100644 > --- a/lib/feature.c > +++ b/lib/feature.c > @@ -57,6 +57,8 @@ static const struct nilfs_feature features[] = { > /* Compat features */ > { NILFS_FEATURE_TYPE_COMPAT, > NILFS_FEATURE_COMPAT_SUFILE_EXTENSION, "sufile_ext" }, > + { NILFS_FEATURE_TYPE_COMPAT, > + NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS, "track_live_blks" }, > /* Read-only compat features */ > { NILFS_FEATURE_TYPE_COMPAT_RO, > NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT, "block_count" }, > diff --git a/lib/nilfs.c b/lib/nilfs.c > index 30db654..2067fc0 100644 > --- a/lib/nilfs.c > +++ b/lib/nilfs.c > @@ -290,34 +290,6 @@ int nilfs_opt_test_mmap(struct nilfs *nilfs) > return !!(nilfs->n_opts & NILFS_OPT_MMAP); > } > > -/** > - * nilfs_opt_set_set_suinfo - set set_suinfo option > - * @nilfs: nilfs object > - */ > -int nilfs_opt_set_set_suinfo(struct nilfs *nilfs) > -{ > - nilfs->n_opts |= NILFS_OPT_SET_SUINFO; > - return 0; > -} > - > -/** > - * nilfs_opt_clear_set_suinfo - clear set_suinfo option > - * @nilfs: nilfs object > - */ > -void nilfs_opt_clear_set_suinfo(struct nilfs *nilfs) > -{ > - nilfs->n_opts &= ~NILFS_OPT_SET_SUINFO; > -} > - > -/** > - * nilfs_opt_test_set_suinfo - test whether set_suinfo option is set or not > - * @nilfs: nilfs object > - */ > -int nilfs_opt_test_set_suinfo(struct nilfs *nilfs) > -{ > - return !!(nilfs->n_opts & NILFS_OPT_SET_SUINFO); > -} > - > static int nilfs_open_sem(struct nilfs *nilfs) > { > char semnambuf[NAME_MAX - 4]; > @@ -382,6 +354,7 @@ struct nilfs *nilfs_open(const char *dev, const char *dir, int flags) > nilfs->n_dev = NULL; > nilfs->n_ioc = NULL; > nilfs->n_mincno = NILFS_CNO_MIN; > + nilfs->n_opts = 0; Please fix this as a separate patch. This is a leak bug even though it doesn't really matters. Regards, Ryusuke Konishi > memset(nilfs->n_sems, 0, sizeof(nilfs->n_sems)); > > if (flags & NILFS_OPEN_RAW) { > @@ -405,6 +378,9 @@ struct nilfs *nilfs_open(const char *dev, const char *dir, int flags) > errno = ENOTSUP; > goto out_fd; > } > + > + if (nilfs_feature_track_live_blks(nilfs)) > + nilfs_opt_set_track_live_blks(nilfs); > } > > if (flags & > diff --git a/man/mkfs.nilfs2.8 b/man/mkfs.nilfs2.8 > index 6c9a644..2431ac9 100644 > --- a/man/mkfs.nilfs2.8 > +++ b/man/mkfs.nilfs2.8 > @@ -176,6 +176,12 @@ cannot be disabled, because it changes the ondisk format. Nevertheless it > is fully compatible with older versions of the file system. This feature > is on by default, because it is fully backwards compatible and can only > be set at file system creation time. > +.TP > +.B track_live_blks > +Enables the tracking of live blocks, which might improve the effectiveness of > +garbage collection, but entails a small runtime overhead. It is important to > +note, that this feature depends on sufile_ext, which can only be set > +at file system creation time. > .RE > .TP > .B \-q > diff --git a/sbin/mkfs/mkfs.c b/sbin/mkfs/mkfs.c > index 3985262..680311c 100644 > --- a/sbin/mkfs/mkfs.c > +++ b/sbin/mkfs/mkfs.c > @@ -1082,7 +1082,8 @@ static inline void check_ctime(time_t ctime) > > static const __u64 ok_features[NILFS_MAX_FEATURE_TYPES] = { > /* Compat */ > - NILFS_FEATURE_COMPAT_SUFILE_EXTENSION, > + NILFS_FEATURE_COMPAT_SUFILE_EXTENSION | > + NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS, > /* Read-only compat */ > NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT, > /* Incompat */ > diff --git a/sbin/nilfs-tune/nilfs-tune.c b/sbin/nilfs-tune/nilfs-tune.c > index 60f1d39..7889310 100644 > --- a/sbin/nilfs-tune/nilfs-tune.c > +++ b/sbin/nilfs-tune/nilfs-tune.c > @@ -84,7 +84,7 @@ static void nilfs_tune_usage(void) > > static const __u64 ok_features[NILFS_MAX_FEATURE_TYPES] = { > /* Compat */ > - 0, > + NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS, > /* Read-only compat */ > NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT, > /* Incompat */ > @@ -93,7 +93,7 @@ static const __u64 ok_features[NILFS_MAX_FEATURE_TYPES] = { > > static const __u64 clear_ok_features[NILFS_MAX_FEATURE_TYPES] = { > /* Compat */ > - 0, > + NILFS_FEATURE_COMPAT_TRACK_LIVE_BLKS, > /* Read-only compat */ > NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT, > /* Incompat */ > -- > 2.3.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html