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