All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
To: Ryusuke Konishi
	<konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
Cc: linux-nilfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH v2 2/9] nilfs2: extend SUFILE on-disk format to enable tracking of live blocks
Date: Sat, 09 May 2015 20:47:09 +0200	[thread overview]
Message-ID: <554E562D.7070700@gmx.net> (raw)
In-Reply-To: <20150509.112403.380867861504859109.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>

On 2015-05-09 04:24, Ryusuke Konishi wrote:
> On Sun,  3 May 2015 12:05:15 +0200, Andreas Rohner wrote:
>> This patch extends the nilfs_segment_usage structure with two extra
>> fields. This changes the on-disk format of the SUFILE, but the NILFS2
>> metadata files are flexible enough, so that there are no compatibility
>> issues. The extension is fully backwards compatible. Nevertheless a
>> feature compatibility flag was added to indicate the on-disk format
>> change.
>>
>> The new field su_nlive_blks is used to track the number of live blocks
>> in the corresponding segment. Its value should always be smaller than
>> su_nblocks, which contains the total number of blocks in the segment.
>>
>> The field su_nlive_lastmod is necessary because of the protection period
>> used by the GC. It is a timestamp, which contains the last time
>> su_nlive_blks was modified. For example if a file is deleted, its
>> blocks are subtracted from su_nlive_blks and are therefore considered to
>> be reclaimable by the kernel. But the GC additionally protects them with
>> the protection period. So while su_nilve_blks contains the number of
>> potentially reclaimable blocks, the actual number depends on the
>> protection period. To enable GC policies to effectively choose or prefer
>> segments with unprotected blocks, the timestamp in su_nlive_lastmod is
>> necessary.
>>
>> The new field su_nsnapshot_blks contains the number of blocks in a
>> segment that are protected by a snapshot. The value is meant to be a
>> heuristic for the GC and is not necessarily always accurate.
>>
>> Signed-off-by: Andreas Rohner <andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
>> ---
>>  fs/nilfs2/ioctl.c         |  4 +--
>>  fs/nilfs2/sufile.c        | 45 +++++++++++++++++++++++++++++++--
>>  fs/nilfs2/sufile.h        |  6 +++++
>>  include/linux/nilfs2_fs.h | 63 +++++++++++++++++++++++++++++++++++++++++------
>>  4 files changed, 106 insertions(+), 12 deletions(-)
>>
>> diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c
>> index 9a20e51..f6ee54e 100644
>> --- a/fs/nilfs2/ioctl.c
>> +++ b/fs/nilfs2/ioctl.c
>> @@ -1250,7 +1250,7 @@ static int nilfs_ioctl_set_suinfo(struct inode *inode, struct file *filp,
>>  		goto out;
>>  
>>  	ret = -EINVAL;
>> -	if (argv.v_size < sizeof(struct nilfs_suinfo_update))
>> +	if (argv.v_size < NILFS_MIN_SUINFO_UPDATE_SIZE)
>>  		goto out;
>>  
>>  	if (argv.v_nmembs > nilfs->ns_nsegments)
>> @@ -1316,7 +1316,7 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>>  		return nilfs_ioctl_get_cpstat(inode, filp, cmd, argp);
>>  	case NILFS_IOCTL_GET_SUINFO:
>>  		return nilfs_ioctl_get_info(inode, filp, cmd, argp,
>> -					    sizeof(struct nilfs_suinfo),
>> +					    NILFS_MIN_SEGMENT_USAGE_SIZE,
>>  					    nilfs_ioctl_do_get_suinfo);
>>  	case NILFS_IOCTL_SET_SUINFO:
>>  		return nilfs_ioctl_set_suinfo(inode, filp, cmd, argp);
>> diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c
>> index 2a869c3..1cce358 100644
>> --- a/fs/nilfs2/sufile.c
>> +++ b/fs/nilfs2/sufile.c
>> @@ -453,6 +453,11 @@ void nilfs_sufile_do_scrap(struct inode *sufile, __u64 segnum,
>>  	su->su_lastmod = cpu_to_le64(0);
>>  	su->su_nblocks = cpu_to_le32(0);
>>  	su->su_flags = cpu_to_le32(1UL << NILFS_SEGMENT_USAGE_DIRTY);
>> +	if (nilfs_sufile_live_blks_ext_supported(sufile)) {
>> +		su->su_nlive_blks = cpu_to_le32(0);
>> +		su->su_nsnapshot_blks = cpu_to_le32(0);
>> +		su->su_nlive_lastmod = cpu_to_le64(0);
>> +	}
>>  	kunmap_atomic(kaddr);
>>  
>>  	nilfs_sufile_mod_counter(header_bh, clean ? (u64)-1 : 0, dirty ? 0 : 1);
>> @@ -482,7 +487,7 @@ void nilfs_sufile_do_free(struct inode *sufile, __u64 segnum,
>>  	WARN_ON(!nilfs_segment_usage_dirty(su));
>>  
>>  	sudirty = nilfs_segment_usage_dirty(su);
>> -	nilfs_segment_usage_set_clean(su);
>> +	nilfs_segment_usage_set_clean(su, NILFS_MDT(sufile)->mi_entry_size);
>>  	kunmap_atomic(kaddr);
>>  	mark_buffer_dirty(su_bh);
>>  
>> @@ -698,7 +703,7 @@ static int nilfs_sufile_truncate_range(struct inode *sufile,
>>  		nc = 0;
>>  		for (su = su2, j = 0; j < n; j++, su = (void *)su + susz) {
>>  			if (nilfs_segment_usage_error(su)) {
>> -				nilfs_segment_usage_set_clean(su);
>> +				nilfs_segment_usage_set_clean(su, susz);
>>  				nc++;
>>  			}
>>  		}
>> @@ -821,6 +826,8 @@ ssize_t nilfs_sufile_get_suinfo(struct inode *sufile, __u64 segnum, void *buf,
>>  	struct the_nilfs *nilfs = sufile->i_sb->s_fs_info;
>>  	void *kaddr;
>>  	unsigned long nsegs, segusages_per_block;
>> +	__u64 lm = 0;
>> +	__u32 nlb = 0, nsb = 0;
>>  	ssize_t n;
>>  	int ret, i, j;
>>  
>> @@ -858,6 +865,18 @@ ssize_t nilfs_sufile_get_suinfo(struct inode *sufile, __u64 segnum, void *buf,
>>  			if (nilfs_segment_is_active(nilfs, segnum + j))
>>  				si->sui_flags |=
>>  					(1UL << NILFS_SEGMENT_USAGE_ACTIVE);
>> +
>> +			if (susz >= NILFS_LIVE_BLKS_EXT_SEGMENT_USAGE_SIZE) {
>> +				nlb = le32_to_cpu(su->su_nlive_blks);
>> +				nsb = le32_to_cpu(su->su_nsnapshot_blks);
>> +				lm = le64_to_cpu(su->su_nlive_lastmod);
>> +			}
>> +
>> +			if (sisz >= NILFS_LIVE_BLKS_EXT_SUINFO_SIZE) {
>> +				si->sui_nlive_blks = nlb;
>> +				si->sui_nsnapshot_blks = nsb;
>> +				si->sui_nlive_lastmod = lm;
>> +			}
>>  		}
>>  		kunmap_atomic(kaddr);
>>  		brelse(su_bh);
>> @@ -901,6 +920,9 @@ ssize_t nilfs_sufile_set_suinfo(struct inode *sufile, void *buf,
>>  	int cleansi, cleansu, dirtysi, dirtysu;
>>  	long ncleaned = 0, ndirtied = 0;
>>  	int ret = 0;
>> +	bool sup_ext = (supsz >= NILFS_LIVE_BLKS_EXT_SUINFO_UPDATE_SIZE);
>> +	bool su_ext = nilfs_sufile_live_blks_ext_supported(sufile);
>> +	bool supsu_ext = sup_ext && su_ext;
> 
> These boolean variables determine the control follow.  For these, more
> intuitive names are preferable.  For instance:
> 
>   - sup_ext -> suinfo_extended
>   - su_ext -> su_extended
>   - supsu_ext -> both_extended

I agree.

>>  
>>  	if (unlikely(nsup == 0))
>>  		return ret;
>> @@ -911,6 +933,13 @@ ssize_t nilfs_sufile_set_suinfo(struct inode *sufile, void *buf,
>>  				(~0UL << __NR_NILFS_SUINFO_UPDATE_FIELDS))
>>  			|| (nilfs_suinfo_update_nblocks(sup) &&
>>  				sup->sup_sui.sui_nblocks >
>> +				nilfs->ns_blocks_per_segment)
>> +			|| (nilfs_suinfo_update_nlive_blks(sup) && sup_ext &&
>> +				sup->sup_sui.sui_nlive_blks >
>> +				nilfs->ns_blocks_per_segment)
>> +			|| (nilfs_suinfo_update_nsnapshot_blks(sup) &&
>> +				sup_ext &&
>> +				sup->sup_sui.sui_nsnapshot_blks >
>>  				nilfs->ns_blocks_per_segment))
>>  			return -EINVAL;
>>  	}
> 
> Testing sup_ext repeatedly is pointless since it increases branches.
> Consider moving it forward as follows:
> 
>         for (sup = buf; sup < supend; sup = (void *)sup + supsz) {
>                 if (sup->sup_segnum >= nilfs->ns_nsegments ||
>                    || (sup->sup_flags &
>                        (~0UL << __NR_NILFS_SUINFO_UPDATE_FIELDS))
>                    || (nilfs_suinfo_update_nblocks(sup) &&
>                        sup->sup_sui.sui_nblocks > nilfs->ns_blocks_per_segment)\
> )
>                         return -EINVAL;
>                 if (!sup_extended)
>                         continue;
>                 if (nilfs_suinfo_update_nlive_blks(sup) &&
>                     (sup->sup_sui.sui_nlive_blks >
>                      nilfs->ns_blocks_per_segment)
>                     || (nilfs_suinfo_update_nsnapshot_blks(sup) &&
>                         sup->sup_sui.sui_nsnapshot_blks >
>                         nilfs->ns_blocks_per_segment))
>                         return -EINVAL;
>         }

Good suggestion.

>> @@ -938,6 +967,18 @@ ssize_t nilfs_sufile_set_suinfo(struct inode *sufile, void *buf,
>>  		if (nilfs_suinfo_update_nblocks(sup))
>>  			su->su_nblocks = cpu_to_le32(sup->sup_sui.sui_nblocks);
>>  
>> +		if (nilfs_suinfo_update_nlive_blks(sup) && supsu_ext)
>> +			su->su_nlive_blks =
>> +				cpu_to_le32(sup->sup_sui.sui_nlive_blks);
>> +
>> +		if (nilfs_suinfo_update_nsnapshot_blks(sup) && supsu_ext)
>> +			su->su_nsnapshot_blks =
>> +				cpu_to_le32(sup->sup_sui.sui_nsnapshot_blks);
>> +
>> +		if (nilfs_suinfo_update_nlive_lastmod(sup) && supsu_ext)
>> +			su->su_nlive_lastmod =
>> +				cpu_to_le64(sup->sup_sui.sui_nlive_lastmod);
>> +
> 
> Ditto.
> 
> Consider defining pointer to suinfo structure
> 
>         for (;;) {
>                 struct nilfs_suinfo *sui = &sup->sup_sui;
> 
> and simplifying the above part as follows:
> 
>                 if (both_extended) {
>                         if (nilfs_suinfo_update_nlive_blks(sup))
>                                 su->su_nlive_blks =
>                                         cpu_to_le32(sui->sui_nlive_blks);
>                         if (nilfs_suinfo_update_nsnapshot_blks(sup))
>                                 su->su_nsnapshot_blks =
>                                         cpu_to_le32(sui->sui_nsnapshot_blks);
>                         if (nilfs_suinfo_update_nlive_lastmod(sup))
>                                 su->su_nlive_lastmod =
>                                         cpu_to_le64(sui->sui_nlive_lastmod);
>                 }
> 

I agree this is much nicer.

>>  		if (nilfs_suinfo_update_flags(sup)) {
>>  			/*
>>  			 * Active flag is a virtual flag projected by running
>> diff --git a/fs/nilfs2/sufile.h b/fs/nilfs2/sufile.h
>> index b8afd72..da78edf 100644
>> --- a/fs/nilfs2/sufile.h
>> +++ b/fs/nilfs2/sufile.h
>> @@ -28,6 +28,12 @@
>>  #include <linux/nilfs2_fs.h>
>>  #include "mdt.h"
>>  
>> +static inline int
>> +nilfs_sufile_live_blks_ext_supported(const struct inode *sufile)
>> +{
>> +	return NILFS_MDT(sufile)->mi_entry_size >=
>> +			NILFS_LIVE_BLKS_EXT_SEGMENT_USAGE_SIZE;
>> +}
>>  
>>  static inline unsigned long nilfs_sufile_get_nsegments(struct inode *sufile)
>>  {
>> diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h
>> index ff3fea3..4800daa 100644
>> --- a/include/linux/nilfs2_fs.h
>> +++ b/include/linux/nilfs2_fs.h
>> @@ -220,9 +220,12 @@ struct nilfs_super_block {
>>   * If there is a bit set in the incompatible feature set that the kernel
>>   * doesn't know about, it should refuse to mount the filesystem.
>>   */
>> -#define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT	0x00000001ULL
> 
>> +#define NILFS_FEATURE_COMPAT_SUFILE_LIVE_BLKS_EXT	BIT(0)
> 
> You should not use BIT() macro and its variants for now because they
> are only enabled in kernel space (__KERNEL__ macro is required).
> 
> "nilfs2_fs.h" should be defined both for kernel space and user space.
> Consider defining it like "(1ULL << 0)".

Ok.

>>  
>> -#define NILFS_FEATURE_COMPAT_SUPP	0ULL
> 
>> +#define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT		BIT(0)
> 
> Ditto.
> 
>> +
>> +#define NILFS_FEATURE_COMPAT_SUPP					\
>> +			(NILFS_FEATURE_COMPAT_SUFILE_LIVE_BLKS_EXT)
>>  #define NILFS_FEATURE_COMPAT_RO_SUPP	NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT
>>  #define NILFS_FEATURE_INCOMPAT_SUPP	0ULL
>>  
>> @@ -609,19 +612,34 @@ struct nilfs_cpfile_header {
>>  	  sizeof(struct nilfs_checkpoint) - 1) /			\
>>  			sizeof(struct nilfs_checkpoint))
>>  
>> +#ifndef offsetofend
>> +#define offsetofend(TYPE, MEMBER) \
>> +		(offsetof(TYPE, MEMBER) + sizeof(((TYPE *)0)->MEMBER))
>> +#endif
>> +
>>  /**
>>   * struct nilfs_segment_usage - segment usage
>>   * @su_lastmod: last modified timestamp
>>   * @su_nblocks: number of blocks in segment
>>   * @su_flags: flags
>> + * @su_nlive_blks: number of live blocks in the segment
>> + * @su_nsnapshot_blks: number of blocks belonging to a snapshot in the segment
>> + * @su_nlive_lastmod: timestamp nlive_blks was last modified
>>   */
>>  struct nilfs_segment_usage {
>>  	__le64 su_lastmod;
>>  	__le32 su_nblocks;
>>  	__le32 su_flags;
>> +	__le32 su_nlive_blks;
>> +	__le32 su_nsnapshot_blks;
>> +	__le64 su_nlive_lastmod;
>>  };
>>  
>> -#define NILFS_MIN_SEGMENT_USAGE_SIZE	16
>> +#define NILFS_MIN_SEGMENT_USAGE_SIZE	\
>> +	offsetofend(struct nilfs_segment_usage, su_flags)
>> +
>> +#define NILFS_LIVE_BLKS_EXT_SEGMENT_USAGE_SIZE	\
>> +	offsetofend(struct nilfs_segment_usage, su_nlive_lastmod)
>>  
>>  /* segment usage flag */
>>  enum {
>> @@ -658,11 +676,16 @@ NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty)
>>  NILFS_SEGMENT_USAGE_FNS(ERROR, error)
>>  
> 
>>  static inline void
>> -nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su)
>> +nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su, size_t susz)
>>  {
>>  	su->su_lastmod = cpu_to_le64(0);
>>  	su->su_nblocks = cpu_to_le32(0);
>>  	su->su_flags = cpu_to_le32(0);
>> +	if (susz >= NILFS_LIVE_BLKS_EXT_SEGMENT_USAGE_SIZE) {
>> +		su->su_nlive_blks = cpu_to_le32(0);
>> +		su->su_nsnapshot_blks = cpu_to_le32(0);
>> +		su->su_nlive_lastmod = cpu_to_le64(0);
>> +	}
>>  }
> 
> nilfs_sufile_do_scrap() function does almost the same thing.
> Consider defining common inline function and using it for
> nilfs_segment_usage_set_clean() and nilfs_sufile_do_scrap():
> 
> static inline void
> nilfs_segment_usage_format(struct nilfs_segment_usage *su, size_t susz,
> 			   __u32 flags)
> {
> 	su->su_lastmod = cpu_to_le64(0);
> 	su->su_nblocks = cpu_to_le32(0);
> 	su->su_flags = cpu_to_le32(flags);
> 	if (susz >= NILFS_LIVE_BLKS_EXT_SEGMENT_USAGE_SIZE) {
> 		su->su_nlive_blks = cpu_to_le32(0);
> 		su->su_nsnapshot_blks = cpu_to_le32(0);
> 		su->su_nlive_lastmod = cpu_to_le64(0);
> 	}
> }
> 
> static inline void
> nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su, size_t susz)
> {
> 	nilfs_segment_usage_format(su, susz, 0);
> }

Good idea. I will start with the modifications right away. I will of
course wait with version 3 of the patch set until you finished your review.

Regards,
Andreas Rohner

> Regards,
> Ryusuke Konishi
> 
>>  
>>  static inline int
>> @@ -684,23 +707,33 @@ struct nilfs_sufile_header {
>>  	/* ... */
>>  };
>>  
>> -#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET	\
>> -	((sizeof(struct nilfs_sufile_header) +				\
>> -	  sizeof(struct nilfs_segment_usage) - 1) /			\
>> -			 sizeof(struct nilfs_segment_usage))
>> +#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET(susz)	\
>> +	((sizeof(struct nilfs_sufile_header) + (susz) - 1) / (susz))
>>  
>>  /**
>>   * nilfs_suinfo - segment usage information
>>   * @sui_lastmod: timestamp of last modification
>>   * @sui_nblocks: number of written blocks in segment
>>   * @sui_flags: segment usage flags
>> + * @sui_nlive_blks: number of live blocks in the segment
>> + * @sui_nsnapshot_blks: number of blocks belonging to a snapshot in the segment
>> + * @sui_nlive_lastmod: timestamp nlive_blks was last modified
>>   */
>>  struct nilfs_suinfo {
>>  	__u64 sui_lastmod;
>>  	__u32 sui_nblocks;
>>  	__u32 sui_flags;
>> +	__u32 sui_nlive_blks;
>> +	__u32 sui_nsnapshot_blks;
>> +	__u64 sui_nlive_lastmod;
>>  };
>>  
>> +#define NILFS_MIN_SUINFO_SIZE	\
>> +	offsetofend(struct nilfs_suinfo, sui_flags)
>> +
>> +#define NILFS_LIVE_BLKS_EXT_SUINFO_SIZE	\
>> +	offsetofend(struct nilfs_suinfo, sui_nlive_lastmod)
>> +
>>  #define NILFS_SUINFO_FNS(flag, name)					\
>>  static inline int							\
>>  nilfs_suinfo_##name(const struct nilfs_suinfo *si)			\
>> @@ -736,6 +769,9 @@ enum {
>>  	NILFS_SUINFO_UPDATE_LASTMOD,
>>  	NILFS_SUINFO_UPDATE_NBLOCKS,
>>  	NILFS_SUINFO_UPDATE_FLAGS,
>> +	NILFS_SUINFO_UPDATE_NLIVE_BLKS,
>> +	NILFS_SUINFO_UPDATE_NLIVE_LASTMOD,
>> +	NILFS_SUINFO_UPDATE_NSNAPSHOT_BLKS,
>>  	__NR_NILFS_SUINFO_UPDATE_FIELDS,
>>  };
>>  
>> @@ -759,6 +795,17 @@ nilfs_suinfo_update_##name(const struct nilfs_suinfo_update *sup)	\
>>  NILFS_SUINFO_UPDATE_FNS(LASTMOD, lastmod)
>>  NILFS_SUINFO_UPDATE_FNS(NBLOCKS, nblocks)
>>  NILFS_SUINFO_UPDATE_FNS(FLAGS, flags)
>> +NILFS_SUINFO_UPDATE_FNS(NLIVE_BLKS, nlive_blks)
>> +NILFS_SUINFO_UPDATE_FNS(NSNAPSHOT_BLKS, nsnapshot_blks)
>> +NILFS_SUINFO_UPDATE_FNS(NLIVE_LASTMOD, nlive_lastmod)
>> +
>> +#define NILFS_MIN_SUINFO_UPDATE_SIZE	\
>> +	(offsetofend(struct nilfs_suinfo_update, sup_reserved) + \
>> +	NILFS_MIN_SUINFO_SIZE)
>> +
>> +#define NILFS_LIVE_BLKS_EXT_SUINFO_UPDATE_SIZE	\
>> +	(offsetofend(struct nilfs_suinfo_update, sup_reserved) + \
>> +	NILFS_LIVE_BLKS_EXT_SUINFO_SIZE)
>>  
>>  enum {
>>  	NILFS_CHECKPOINT,
>> -- 
>> 2.3.7
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
>> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
>> 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-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2015-05-09 18:47 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-03 10:05 [PATCH v2 0/9] nilfs2: implementation of cost-benefit GC policy Andreas Rohner
     [not found] ` <1430647522-14304-1-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-03 10:05   ` [PATCH v2 1/9] nilfs2: copy file system feature flags to the nilfs object Andreas Rohner
     [not found]     ` <1430647522-14304-2-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-09  1:54       ` Ryusuke Konishi
     [not found]         ` <20150509.105445.1816655707671265145.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-09 18:41           ` Andreas Rohner
2015-05-03 10:05   ` [PATCH v2 2/9] nilfs2: extend SUFILE on-disk format to enable tracking of live blocks Andreas Rohner
     [not found]     ` <1430647522-14304-3-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-09  2:24       ` Ryusuke Konishi
     [not found]         ` <20150509.112403.380867861504859109.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-09 18:47           ` Andreas Rohner [this message]
2015-05-03 10:05   ` [PATCH v2 3/9] nilfs2: introduce new feature flag for tracking " Andreas Rohner
     [not found]     ` <1430647522-14304-4-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-09  2:28       ` Ryusuke Konishi
     [not found]         ` <20150509.112814.2026089040966346261.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-09 18:53           ` Andreas Rohner
2015-05-03 10:05   ` [PATCH v2 4/9] nilfs2: add kmem_cache for SUFILE cache nodes Andreas Rohner
     [not found]     ` <1430647522-14304-5-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-09  2:41       ` Ryusuke Konishi
     [not found]         ` <20150509.114149.1643183669812667339.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-09 19:10           ` Andreas Rohner
     [not found]             ` <554E5B9D.7070807-hi6Y0CQ0nG0@public.gmane.org>
2015-05-10  0:05               ` Ryusuke Konishi
2015-05-03 10:05   ` [PATCH v2 5/9] nilfs2: add SUFILE cache for changes to su_nlive_blks field Andreas Rohner
     [not found]     ` <1430647522-14304-6-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-09  4:09       ` Ryusuke Konishi
     [not found]         ` <20150509.130900.223492430584220355.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-09 19:39           ` Andreas Rohner
     [not found]             ` <554E626A.2030503-hi6Y0CQ0nG0@public.gmane.org>
2015-05-10  2:09               ` Ryusuke Konishi
2015-05-03 10:05   ` [PATCH v2 6/9] nilfs2: add tracking of block deletions and updates Andreas Rohner
     [not found]     ` <1430647522-14304-7-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-09  7:05       ` Ryusuke Konishi
     [not found]         ` <20150509.160512.1087140271092828536.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-09 15:58           ` Ryusuke Konishi
2015-05-09 20:02           ` Andreas Rohner
     [not found]             ` <554E67C0.1050309-hi6Y0CQ0nG0@public.gmane.org>
2015-05-10  3:17               ` Ryusuke Konishi
2015-05-03 10:05   ` [PATCH v2 7/9] nilfs2: ensure that all dirty blocks are written out Andreas Rohner
     [not found]     ` <1430647522-14304-8-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-09 12:17       ` Ryusuke Konishi
     [not found]         ` <20150509.211741.1463241033923032068.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-09 20:18           ` Andreas Rohner
     [not found]             ` <554E6B7E.8070000-hi6Y0CQ0nG0@public.gmane.org>
2015-05-10  3:31               ` Ryusuke Konishi
2015-05-10 11:04           ` Andreas Rohner
     [not found]             ` <554F3B32.5050004-hi6Y0CQ0nG0@public.gmane.org>
2015-06-01  4:13               ` Ryusuke Konishi
     [not found]                 ` <20150601.131320.1075202804382267027.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-06-01 14:33                   ` Andreas Rohner
2015-05-03 10:05   ` [PATCH v2 8/9] nilfs2: correct live block tracking for GC protection period Andreas Rohner
     [not found]     ` <1430647522-14304-9-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-10 18:15       ` Ryusuke Konishi
     [not found]         ` <20150511.031512.1036934606749624197.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-10 18:23           ` Ryusuke Konishi
     [not found]             ` <20150511.032323.1250231827423193240.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-11  2:07               ` Ryusuke Konishi
     [not found]                 ` <20150511.110726.725667075147435663.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-11 12:32                   ` Andreas Rohner
2015-05-11 13:00           ` Andreas Rohner
     [not found]             ` <5550A7FC.4050709-hi6Y0CQ0nG0@public.gmane.org>
2015-05-12 14:31               ` Ryusuke Konishi
     [not found]                 ` <20150512.233126.2206330706583570566.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-12 15:37                   ` Andreas Rohner
2015-05-03 10:05   ` [PATCH v2 9/9] nilfs2: prevent starvation of segments protected by snapshots Andreas Rohner
     [not found]     ` <1430647522-14304-10-git-send-email-andreas.rohner-hi6Y0CQ0nG0@public.gmane.org>
2015-05-20 14:43       ` Ryusuke Konishi
     [not found]         ` <20150520.234335.542615158366069430.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-20 15:49           ` Ryusuke Konishi
2015-05-22 18:10           ` Andreas Rohner
     [not found]             ` <555F70FD.6090500-hi6Y0CQ0nG0@public.gmane.org>
2015-05-31 16:45               ` Ryusuke Konishi
     [not found]                 ` <20150601.014550.269184778137708369.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-05-31 18:13                   ` Andreas Rohner
     [not found]                     ` <556B4F58.9080801-hi6Y0CQ0nG0@public.gmane.org>
2015-06-01  0:44                       ` Ryusuke Konishi
     [not found]                         ` <20150601.094441.24658496988941562.konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org>
2015-06-01 14:45                           ` Andreas Rohner
2015-05-03 10:07   ` [PATCH v2 1/5] nilfs-utils: extend SUFILE on-disk format to enable track live blocks Andreas Rohner
2015-05-03 10:07   ` [PATCH v2 2/5] nilfs-utils: add additional flags for nilfs_vdesc Andreas Rohner
2015-05-03 10:07   ` [PATCH v2 3/5] nilfs-utils: add support for tracking live blocks Andreas Rohner
2015-05-03 10:07   ` [PATCH v2 4/5] nilfs-utils: implement the tracking of live blocks for set_suinfo Andreas Rohner
2015-05-03 10:07   ` [PATCH v2 5/5] nilfs-utils: add support for greedy/cost-benefit policies Andreas Rohner
2015-05-05  3:09   ` [PATCH v2 0/9] nilfs2: implementation of cost-benefit GC policy Ryusuke Konishi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=554E562D.7070700@gmx.net \
    --to=andreas.rohner-hi6y0cq0ng0@public.gmane.org \
    --cc=konishi.ryusuke-Zyj7fXuS5i5L9jVzuh4AOg@public.gmane.org \
    --cc=linux-nilfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.