[lustre-devel] [PATCH 18/30] lustre: llite: llite.stat_blocksize param for fixed st_blksize

NeilBrown neilb at suse.com
Sun Sep 23 21:11:52 PDT 2018


On Mon, Sep 17 2018, James Simmons wrote:

> From: Andrew Perepechko <c17827 at cray.com>
>
> llite.stat_blocksize is added to allow configurable st_blksize
> for stat(2). The latter is treated incorrectly by some
> applications. For example, glibc pre-2.25 uses this value for
> stdio buffering which completely ruins performance with random
> reads.
>
> The patch changes the behaviour of getattr rather than inode
> initialization so that change of the setting causes immediate
> effect without the need of reclaiming existing inodes.
>
> The patch is similar to the patch from bz # 12739 by Aurelien
> Degremont.
>
> Signed-off-by: Andrew Perepechko <c17827 at cray.com>
> WC-bug-id: https://jira.whamcloud.com/browse/LU-9413
> Reviewed-on: https://review.whamcloud.com/26869
> Reviewed-by: Alexander Zarochentsev <c17826 at cray.com>
> Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
> Reviewed-by: Oleg Drokin <green at whamcloud.com>
> Signed-off-by: James Simmons <jsimmons at infradead.org>
> ---
>  drivers/staging/lustre/lustre/llite/file.c         |  2 +-
>  .../staging/lustre/lustre/llite/llite_internal.h   |  6 +++-
>  drivers/staging/lustre/lustre/llite/lproc_llite.c  | 33 ++++++++++++++++++++++
>  3 files changed, 39 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c
> index b90c59c..94760eb 100644
> --- a/drivers/staging/lustre/lustre/llite/file.c
> +++ b/drivers/staging/lustre/lustre/llite/file.c
> @@ -3267,7 +3267,7 @@ int ll_getattr(const struct path *path, struct kstat *stat,
>  	stat->atime = inode->i_atime;
>  	stat->mtime = inode->i_mtime;
>  	stat->ctime = inode->i_ctime;
> -	stat->blksize = 1 << inode->i_blkbits;
> +	stat->blksize = sbi->ll_stat_blksize ?: BIT(inode->i_blkbits);

I replaced the BIT() with (1<< ).

Thanks,
NeilBrown


>  
>  	stat->nlink = inode->i_nlink;
>  	stat->size = i_size_read(inode);
> diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h
> index 9d9f623..dcb2fed 100644
> --- a/drivers/staging/lustre/lustre/llite/llite_internal.h
> +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h
> @@ -523,7 +523,11 @@ struct ll_sb_info {
>  	struct root_squash_info	  ll_squash;
>  	struct path		 ll_mnt;
>  
> -	__kernel_fsid_t		  ll_fsid;
> +	/* st_blksize returned by stat(2), when non-zero */
> +	unsigned int		 ll_stat_blksize;
> +
> +	__kernel_fsid_t		 ll_fsid;
> +
>  	struct kset		ll_kset;	/* sysfs object */
>  	struct completion	 ll_kobj_unregister;
>  };
> diff --git a/drivers/staging/lustre/lustre/llite/lproc_llite.c b/drivers/staging/lustre/lustre/llite/lproc_llite.c
> index f775b4f..d8ef090 100644
> --- a/drivers/staging/lustre/lustre/llite/lproc_llite.c
> +++ b/drivers/staging/lustre/lustre/llite/lproc_llite.c
> @@ -128,6 +128,38 @@ static ssize_t blocksize_show(struct kobject *kobj, struct attribute *attr,
>  }
>  LUSTRE_RO_ATTR(blocksize);
>  
> +static ssize_t stat_blocksize_show(struct kobject *kobj, struct attribute *attr,
> +				   char *buf)
> +{
> +	struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info,
> +					      ll_kset.kobj);
> +
> +	return sprintf(buf, "%u\n", sbi->ll_stat_blksize);
> +}
> +
> +static ssize_t stat_blocksize_store(struct kobject *kobj,
> +				    struct attribute *attr,
> +				    const char *buffer,
> +				    size_t count)
> +{
> +	struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info,
> +					      ll_kset.kobj);
> +	unsigned int val;
> +	int rc;
> +
> +	rc = kstrtouint(buffer, 10, &val);
> +	if (rc)
> +		return rc;
> +
> +	if (val != 0 && (val < PAGE_SIZE || (val & (val - 1))) != 0)
> +		return -ERANGE;
> +
> +	sbi->ll_stat_blksize = val;
> +
> +	return count;
> +}
> +LUSTRE_RW_ATTR(stat_blocksize);
> +
>  static ssize_t kbytestotal_show(struct kobject *kobj, struct attribute *attr,
>  				char *buf)
>  {
> @@ -1123,6 +1155,7 @@ static ssize_t ll_nosquash_nids_seq_write(struct file *file,
>  
>  static struct attribute *llite_attrs[] = {
>  	&lustre_attr_blocksize.attr,
> +	&lustre_attr_stat_blocksize.attr,
>  	&lustre_attr_kbytestotal.attr,
>  	&lustre_attr_kbytesfree.attr,
>  	&lustre_attr_kbytesavail.attr,
> -- 
> 1.8.3.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.lustre.org/pipermail/lustre-devel-lustre.org/attachments/20180924/af54ade6/attachment.sig>


More information about the lustre-devel mailing list