Re: [PATCH 13/27] quota: Push dqio_sem down to ->write_file_info()

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

 



On Aug 16, 2017, at 9:41 AM, Jan Kara <jack@xxxxxxx> wrote:
> 
> Push down acquisition of dqio_sem into ->write_file_info() callback.
> Mostly for consistency with other operations.
> 
> Signed-off-by: Jan Kara <jack@xxxxxxx>
> ---
> fs/ocfs2/quota_global.c |  9 +++++++--
> fs/quota/dquot.c        | 10 +---------
> fs/quota/quota_v1.c     |  2 ++
> fs/quota/quota_v2.c     |  5 ++++-
> 4 files changed, 14 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c
> index 4134d557a8e5..6f7c5bd3cbc6 100644
> --- a/fs/ocfs2/quota_global.c
> +++ b/fs/ocfs2/quota_global.c
> @@ -443,13 +443,18 @@ static int __ocfs2_global_write_info(struct super_block *sb, int type)
> int ocfs2_global_write_info(struct super_block *sb, int type)

Would be nice if this was named ocfs2_global_write_file_info() so that
it showed up in searches more easily, though not a huge deal.  I guess
the same for ocfs2_local_read_file_info() and ocfs2_local_free_file_info(),
if we wanted to be consistent here, but that should go into a separate
patch.

> {
> 	int err;
> -	struct ocfs2_mem_dqinfo *info = sb_dqinfo(sb, type)->dqi_priv;
> +	struct quota_info *dqopt = sb_dqopt(sb);
> +	struct ocfs2_mem_dqinfo *info = dqopt->info[type].dqi_priv;
> 
> +	down_write(&dqopt->dqio_sem);
> 	err = ocfs2_qinfo_lock(info, 1);
> -	if (err < 0)
> +	if (err < 0) {
> +		up_write(&dqopt->dqio_sem);
> 		return err;
> +	}

		goto out_sem?

> 	err = __ocfs2_global_write_info(sb, type);
> 	ocfs2_qinfo_unlock(info, 1);

out_sem:

Other than this minor suggestion,

Reviewed-by: Andreas Dilger <adilger@xxxxxxxxx>


> +	up_write(&dqopt->dqio_sem);
> 	return err;
> }
> 
> diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
> index 332f7026edad..1e1ff97098ec 100644
> --- a/fs/quota/dquot.c
> +++ b/fs/quota/dquot.c
> @@ -415,10 +415,8 @@ int dquot_acquire(struct dquot *dquot)
> 		ret = dqopt->ops[dquot->dq_id.type]->commit_dqblk(dquot);
> 		/* Write the info if needed */
> 		if (info_dirty(&dqopt->info[dquot->dq_id.type])) {
> -			down_write(&dqopt->dqio_sem);
> 			ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info(
> 					dquot->dq_sb, dquot->dq_id.type);
> -			up_write(&dqopt->dqio_sem);
> 		}
> 		if (ret < 0)
> 			goto out_iolock;
> @@ -482,10 +480,8 @@ int dquot_release(struct dquot *dquot)
> 		ret = dqopt->ops[dquot->dq_id.type]->release_dqblk(dquot);
> 		/* Write the info */
> 		if (info_dirty(&dqopt->info[dquot->dq_id.type])) {
> -			down_write(&dqopt->dqio_sem);
> 			ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info(
> 						dquot->dq_sb, dquot->dq_id.type);
> -			up_write(&dqopt->dqio_sem);
> 		}
> 		if (ret >= 0)
> 			ret = ret2;
> @@ -2054,13 +2050,9 @@ EXPORT_SYMBOL(dquot_transfer);
>  */
> int dquot_commit_info(struct super_block *sb, int type)
> {
> -	int ret;
> 	struct quota_info *dqopt = sb_dqopt(sb);
> 
> -	down_write(&dqopt->dqio_sem);
> -	ret = dqopt->ops[type]->write_file_info(sb, type);
> -	up_write(&dqopt->dqio_sem);
> -	return ret;
> +	return dqopt->ops[type]->write_file_info(sb, type);
> }
> EXPORT_SYMBOL(dquot_commit_info);
> 
> diff --git a/fs/quota/quota_v1.c b/fs/quota/quota_v1.c
> index 12d69cda57cc..fe68bf544b29 100644
> --- a/fs/quota/quota_v1.c
> +++ b/fs/quota/quota_v1.c
> @@ -186,6 +186,7 @@ static int v1_write_file_info(struct super_block *sb, int type)
> 	struct v1_disk_dqblk dqblk;
> 	int ret;
> 
> +	down_write(&dqopt->dqio_sem);
> 	dqopt->info[type].dqi_flags &= ~DQF_INFO_DIRTY;
> 	ret = sb->s_op->quota_read(sb, type, (char *)&dqblk,
> 				sizeof(struct v1_disk_dqblk), v1_dqoff(0));
> @@ -203,6 +204,7 @@ static int v1_write_file_info(struct super_block *sb, int type)
> 	else if (ret > 0)
> 		ret = -EIO;
> out:
> +	up_write(&dqopt->dqio_sem);
> 	return ret;
> }
> 
> diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c
> index f82638e43c07..5e47012d2f57 100644
> --- a/fs/quota/quota_v2.c
> +++ b/fs/quota/quota_v2.c
> @@ -154,10 +154,12 @@ static int v2_read_file_info(struct super_block *sb, int type)
> static int v2_write_file_info(struct super_block *sb, int type)
> {
> 	struct v2_disk_dqinfo dinfo;
> -	struct mem_dqinfo *info = sb_dqinfo(sb, type);
> +	struct quota_info *dqopt = sb_dqopt(sb);
> +	struct mem_dqinfo *info = &dqopt->info[type];
> 	struct qtree_mem_dqinfo *qinfo = info->dqi_priv;
> 	ssize_t size;
> 
> +	down_write(&dqopt->dqio_sem);
> 	spin_lock(&dq_data_lock);
> 	info->dqi_flags &= ~DQF_INFO_DIRTY;
> 	dinfo.dqi_bgrace = cpu_to_le32(info->dqi_bgrace);
> @@ -170,6 +172,7 @@ static int v2_write_file_info(struct super_block *sb, int type)
> 	dinfo.dqi_free_entry = cpu_to_le32(qinfo->dqi_free_entry);
> 	size = sb->s_op->quota_write(sb, type, (char *)&dinfo,
> 	       sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF);
> +	up_write(&dqopt->dqio_sem);
> 	if (size != sizeof(struct v2_disk_dqinfo)) {
> 		quota_error(sb, "Can't write info structure");
> 		return -1;
> --
> 2.12.3
> 


Cheers, Andreas





Attachment: signature.asc
Description: Message signed with OpenPGP


[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux