Re: Introduce option to rebalance only metadata

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Nov 10, 2011 at 05:40:56PM -0200, Alexandre Oliva wrote:
> Experimental patch to be able to compact only the metadata after
> clustered allocation allocated lots of unnecessary metadata block
> groups.  It's also useful to measure performance differences between
> -o cluster and -o nocluster.
> 
> I guess it should be implemented as a balance option rather than a
> separate ioctl, but this was good enough for me to try it.

   This should be covered by the restriper work. (And was also covered
by my balance-management patches, which were superseded by restriper).

   Hugo.

> Signed-off-by: Alexandre Oliva <oliva@xxxxxxxxxxxxxxxxx>
> ---
>  fs/btrfs/ioctl.c   |    2 ++
>  fs/btrfs/ioctl.h   |    3 +++
>  fs/btrfs/volumes.c |   33 ++++++++++++++++++++++++++++-----
>  fs/btrfs/volumes.h |    1 +
>  4 files changed, 34 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index 4a34c47..69bf6f2 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -3074,6 +3074,8 @@ long btrfs_ioctl(struct file *file, unsigned int
>  		return btrfs_ioctl_dev_info(root, argp);
>  	case BTRFS_IOC_BALANCE:
>  		return btrfs_balance(root->fs_info->dev_root);
> +	case BTRFS_IOC_BALANCE_METADATA:
> +		return btrfs_balance_metadata(root->fs_info->dev_root);
>  	case BTRFS_IOC_CLONE:
>  		return btrfs_ioctl_clone(file, arg, 0, 0, 0);
>  	case BTRFS_IOC_CLONE_RANGE:
> diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h
> index 252ae99..46bc428 100644
> --- a/fs/btrfs/ioctl.h
> +++ b/fs/btrfs/ioctl.h
> @@ -277,4 +277,7 @@ struct btrfs_ioctl_logical_ino_args {
>  #define BTRFS_IOC_LOGICAL_INO _IOWR(BTRFS_IOCTL_MAGIC, 36, \
>  					struct btrfs_ioctl_ino_path_args)
>  
> +#define BTRFS_IOC_BALANCE_METADATA _IOW(BTRFS_IOCTL_MAGIC, 37, \
> +					struct btrfs_ioctl_vol_args)
> +
>  #endif
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index f8e29431..4d5b29f 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -2077,7 +2077,7 @@ static u64 div_factor(u64 num, int factor)
>  	return num;
>  }
>  
> -int btrfs_balance(struct btrfs_root *dev_root)
> +static int btrfs_balance_skip(struct btrfs_root *dev_root, u64 skip_type)
>  {
>  	int ret;
>  	struct list_head *devices = &dev_root->fs_info->fs_devices->devices;
> @@ -2089,6 +2089,9 @@ int btrfs_balance(struct btrfs_root *dev_root)
>  	struct btrfs_root *chunk_root = dev_root->fs_info->chunk_root;
>  	struct btrfs_trans_handle *trans;
>  	struct btrfs_key found_key;
> +	struct btrfs_chunk *chunk;
> +	u64 chunk_type;
> +	bool skip;
>  
>  	if (dev_root->fs_info->sb->s_flags & MS_RDONLY)
>  		return -EROFS;
> @@ -2158,11 +2161,21 @@ int btrfs_balance(struct btrfs_root *dev_root)
>  		if (found_key.offset == 0)
>  			break;
>  
> +		if (skip_type) {
> +			chunk = btrfs_item_ptr(path->nodes[0], path->slots[0],
> +					       struct btrfs_chunk);
> +			chunk_type = btrfs_chunk_type(path->nodes[0], chunk);
> +			skip = (chunk_type & skip_type);
> +		} else
> +			skip = false;
> +
>  		btrfs_release_path(path);
> -		ret = btrfs_relocate_chunk(chunk_root,
> -					   chunk_root->root_key.objectid,
> -					   found_key.objectid,
> -					   found_key.offset);
> +
> +		ret = (skip ? 0 :
> +		       btrfs_relocate_chunk(chunk_root,
> +					    chunk_root->root_key.objectid,
> +					    found_key.objectid,
> +					    found_key.offset));
>  		if (ret && ret != -ENOSPC)
>  			goto error;
>  		key.offset = found_key.offset - 1;
> @@ -2174,6 +2187,16 @@ error:
>  	return ret;
>  }
>  
> +int btrfs_balance(struct btrfs_root *dev_root)
> +{
> +	return btrfs_balance_skip(dev_root, 0);
> +}
> +
> +int btrfs_balance_metadata(struct btrfs_root *dev_root)
> +{
> +	return btrfs_balance_skip(dev_root, BTRFS_BLOCK_GROUP_DATA);
> +}
> +
>  /*
>   * shrinking a device means finding all of the device extents past
>   * the new size, and then following the back refs to the chunks.
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index ab5b1c4..c467499 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -223,6 +223,7 @@ struct btrfs_device *btrfs_find_device(struct btrfs_root *root, u64 devid,
>  int btrfs_shrink_device(struct btrfs_device *device, u64 new_size);
>  int btrfs_init_new_device(struct btrfs_root *root, char *path);
>  int btrfs_balance(struct btrfs_root *dev_root);
> +int btrfs_balance_metadata(struct btrfs_root *dev_root);
>  int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset);
>  int find_free_dev_extent(struct btrfs_trans_handle *trans,
>  			 struct btrfs_device *device, u64 num_bytes,

-- 
=== Hugo Mills: hugo@... carfax.org.uk | darksatanic.net | lug.org.uk ===
  PGP key: 515C238D from wwwkeys.eu.pgp.net or http://www.carfax.org.uk
                --- If it ain't broke,  hit it again. ---                

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux