Re: [PATCH 3/5] quota: Split dquot_quota_sync() to writeback and cache flushing part

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

 



Hi,

On Wed, 2011-07-27 at 00:38 +0200, Jan Kara wrote:
> Split off part of dquot_quota_sync() which writes dquots into a quota file
> to a separate function. In the next patch we will use the function from
> filesystems and we do not want to abuse ->quota_sync quotactl callback more
> than necessary.
> 
> Signed-off-by: Jan Kara <jack@xxxxxxx>
Acked-by: Steven Whitehouse <swhiteho@xxxxxxxxxx>

Steve.

> ---
>  fs/gfs2/quota.c          |    4 ++--
>  fs/gfs2/quota.h          |    2 +-
>  fs/gfs2/super.c          |    2 +-
>  fs/gfs2/sys.c            |    2 +-
>  fs/quota/dquot.c         |   35 ++++++++++++++++++++++++++---------
>  fs/quota/quota.c         |    4 ++--
>  fs/sync.c                |    2 +-
>  include/linux/quota.h    |    2 +-
>  include/linux/quotaops.h |    3 ++-
>  9 files changed, 37 insertions(+), 19 deletions(-)
> 
> diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
> index 42e8d23..2ca3c6a 100644
> --- a/fs/gfs2/quota.c
> +++ b/fs/gfs2/quota.c
> @@ -1122,7 +1122,7 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
>  	}
>  }
>  
> -int gfs2_quota_sync(struct super_block *sb, int type, int wait)
> +int gfs2_quota_sync(struct super_block *sb, int type)
>  {
>  	struct gfs2_sbd *sdp = sb->s_fs_info;
>  	struct gfs2_quota_data **qda;
> @@ -1168,7 +1168,7 @@ int gfs2_quota_sync(struct super_block *sb, int type, int wait)
>  
>  static int gfs2_quota_sync_timeo(struct super_block *sb, int type)
>  {
> -	return gfs2_quota_sync(sb, type, 0);
> +	return gfs2_quota_sync(sb, type);
>  }
>  
>  int gfs2_quota_refresh(struct gfs2_sbd *sdp, int user, u32 id)
> diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h
> index 90bf1c3..f25d98b 100644
> --- a/fs/gfs2/quota.h
> +++ b/fs/gfs2/quota.h
> @@ -26,7 +26,7 @@ extern int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid);
>  extern void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
>  			      u32 uid, u32 gid);
>  
> -extern int gfs2_quota_sync(struct super_block *sb, int type, int wait);
> +extern int gfs2_quota_sync(struct super_block *sb, int type);
>  extern int gfs2_quota_refresh(struct gfs2_sbd *sdp, int user, u32 id);
>  
>  extern int gfs2_quota_init(struct gfs2_sbd *sdp);
> diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
> index ed540e7..e361610 100644
> --- a/fs/gfs2/super.c
> +++ b/fs/gfs2/super.c
> @@ -807,7 +807,7 @@ static int gfs2_make_fs_ro(struct gfs2_sbd *sdp)
>  	int error;
>  
>  	flush_workqueue(gfs2_delete_workqueue);
> -	gfs2_quota_sync(sdp->sd_vfs, 0, 1);
> +	gfs2_quota_sync(sdp->sd_vfs, 0);
>  	gfs2_statfs_sync(sdp->sd_vfs, 0);
>  
>  	error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, GL_NOCACHE,
> diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c
> index e20eab3..b595462 100644
> --- a/fs/gfs2/sys.c
> +++ b/fs/gfs2/sys.c
> @@ -168,7 +168,7 @@ static ssize_t quota_sync_store(struct gfs2_sbd *sdp, const char *buf,
>  	if (simple_strtol(buf, NULL, 0) != 1)
>  		return -EINVAL;
>  
> -	gfs2_quota_sync(sdp->sd_vfs, 0, 1);
> +	gfs2_quota_sync(sdp->sd_vfs, 0);
>  	return len;
>  }
>  
> diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
> index 5b572c8..35c4a47 100644
> --- a/fs/quota/dquot.c
> +++ b/fs/quota/dquot.c
> @@ -595,12 +595,14 @@ out:
>  }
>  EXPORT_SYMBOL(dquot_scan_active);
>  
> -int dquot_quota_sync(struct super_block *sb, int type, int wait)
> +/* Write all dquot structures to quota files */
> +int dquot_writeback_dquots(struct super_block *sb, int type)
>  {
>  	struct list_head *dirty;
>  	struct dquot *dquot;
>  	struct quota_info *dqopt = sb_dqopt(sb);
>  	int cnt;
> +	int err, ret = 0;
>  
>  	mutex_lock(&dqopt->dqonoff_mutex);
>  	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
> @@ -624,7 +626,9 @@ int dquot_quota_sync(struct super_block *sb, int type, int wait)
>  			atomic_inc(&dquot->dq_count);
>  			spin_unlock(&dq_list_lock);
>  			dqstats_inc(DQST_LOOKUPS);
> -			sb->dq_op->write_dquot(dquot);
> +			err = sb->dq_op->write_dquot(dquot);
> +			if (!ret && err)
> +				err = ret;
>  			dqput(dquot);
>  			spin_lock(&dq_list_lock);
>  		}
> @@ -638,7 +642,21 @@ int dquot_quota_sync(struct super_block *sb, int type, int wait)
>  	dqstats_inc(DQST_SYNCS);
>  	mutex_unlock(&dqopt->dqonoff_mutex);
>  
> -	if (!wait || (sb_dqopt(sb)->flags & DQUOT_QUOTA_SYS_FILE))
> +	return ret;
> +}
> +EXPORT_SYMBOL(dquot_writeback_dquots);
> +
> +/* Write all dquot structures to disk and make them visible from userspace */
> +int dquot_quota_sync(struct super_block *sb, int type)
> +{
> +	struct quota_info *dqopt = sb_dqopt(sb);
> +	int cnt;
> +	int ret;
> +
> +	ret = dquot_writeback_dquots(sb, type);
> +	if (ret)
> +		return ret;
> +	if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
>  		return 0;
>  
>  	/* This is not very clever (and fast) but currently I don't know about
> @@ -652,18 +670,17 @@ int dquot_quota_sync(struct super_block *sb, int type, int wait)
>  	 * Now when everything is written we can discard the pagecache so
>  	 * that userspace sees the changes.
>  	 */
> -	mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
> +	mutex_lock(&dqopt->dqonoff_mutex);
>  	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
>  		if (type != -1 && cnt != type)
>  			continue;
>  		if (!sb_has_quota_active(sb, cnt))
>  			continue;
> -		mutex_lock_nested(&sb_dqopt(sb)->files[cnt]->i_mutex,
> -				  I_MUTEX_QUOTA);
> -		truncate_inode_pages(&sb_dqopt(sb)->files[cnt]->i_data, 0);
> -		mutex_unlock(&sb_dqopt(sb)->files[cnt]->i_mutex);
> +		mutex_lock_nested(&dqopt->files[cnt]->i_mutex, I_MUTEX_QUOTA);
> +		truncate_inode_pages(&dqopt->files[cnt]->i_data, 0);
> +		mutex_unlock(&dqopt->files[cnt]->i_mutex);
>  	}
> -	mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
> +	mutex_unlock(&dqopt->dqonoff_mutex);
>  
>  	return 0;
>  }
> diff --git a/fs/quota/quota.c b/fs/quota/quota.c
> index b34bdb2..76b8012 100644
> --- a/fs/quota/quota.c
> +++ b/fs/quota/quota.c
> @@ -48,7 +48,7 @@ static int check_quotactl_permission(struct super_block *sb, int type, int cmd,
>  static void quota_sync_one(struct super_block *sb, void *arg)
>  {
>  	if (sb->s_qcop && sb->s_qcop->quota_sync)
> -		sb->s_qcop->quota_sync(sb, *(int *)arg, 1);
> +		sb->s_qcop->quota_sync(sb, *(int *)arg);
>  }
>  
>  static int quota_sync_all(int type)
> @@ -271,7 +271,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
>  	case Q_SYNC:
>  		if (!sb->s_qcop->quota_sync)
>  			return -ENOSYS;
> -		return sb->s_qcop->quota_sync(sb, type, 1);
> +		return sb->s_qcop->quota_sync(sb, type);
>  	case Q_XQUOTAON:
>  	case Q_XQUOTAOFF:
>  	case Q_XQUOTARM:
> diff --git a/fs/sync.c b/fs/sync.c
> index 2f5bd52..2b7d569 100644
> --- a/fs/sync.c
> +++ b/fs/sync.c
> @@ -31,7 +31,7 @@
>  static void __sync_filesystem(struct super_block *sb, int wait)
>  {
>  	if (sb->s_qcop && sb->s_qcop->quota_sync)
> -		sb->s_qcop->quota_sync(sb, -1, wait);
> +		sb->s_qcop->quota_sync(sb, -1);
>  
>  	if (wait)
>  		sync_inodes_sb(sb);
> diff --git a/include/linux/quota.h b/include/linux/quota.h
> index 9a85412..86173d6 100644
> --- a/include/linux/quota.h
> +++ b/include/linux/quota.h
> @@ -329,7 +329,7 @@ struct quotactl_ops {
>  	int (*quota_on)(struct super_block *, int, int, struct path *);
>  	int (*quota_on_meta)(struct super_block *, int, int);
>  	int (*quota_off)(struct super_block *, int);
> -	int (*quota_sync)(struct super_block *, int, int);
> +	int (*quota_sync)(struct super_block *, int);
>  	int (*get_info)(struct super_block *, int, struct if_dqinfo *);
>  	int (*set_info)(struct super_block *, int, struct if_dqinfo *);
>  	int (*get_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *);
> diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h
> index 26f9e36..aba7578 100644
> --- a/include/linux/quotaops.h
> +++ b/include/linux/quotaops.h
> @@ -83,7 +83,8 @@ int dquot_quota_on(struct super_block *sb, int type, int format_id,
>  int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
>   	int format_id, int type);
>  int dquot_quota_off(struct super_block *sb, int type);
> -int dquot_quota_sync(struct super_block *sb, int type, int wait);
> +int dquot_writeback_dquots(struct super_block *sb, int type);
> +int dquot_quota_sync(struct super_block *sb, int type);
>  int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
>  int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
>  int dquot_get_dqblk(struct super_block *sb, int type, qid_t id,


--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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