quota: unify ->get_dqblk

Pass the larger struct fs_disk_quota to the ->get_dqblk operation so
that the Q_GETQUOTA and Q_XGETQUOTA operations can be implemented
with a single filesystem operation and we can retire the ->get_xquota
operation.  The additional information (RT-subvolume accounting and
warn counts) are left zero for the VFS quota implementation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
Christoph Hellwig 2010-05-06 17:04:58 -04:00 committed by Jan Kara
parent 0636c73ee7
commit b9b2dd36c1
6 changed files with 42 additions and 24 deletions

View File

@ -1476,8 +1476,8 @@ static int gfs2_quota_get_xstate(struct super_block *sb,
return 0; return 0;
} }
static int gfs2_xquota_get(struct super_block *sb, int type, qid_t id, static int gfs2_get_dqblk(struct super_block *sb, int type, qid_t id,
struct fs_disk_quota *fdq) struct fs_disk_quota *fdq)
{ {
struct gfs2_sbd *sdp = sb->s_fs_info; struct gfs2_sbd *sdp = sb->s_fs_info;
struct gfs2_quota_lvb *qlvb; struct gfs2_quota_lvb *qlvb;
@ -1629,7 +1629,7 @@ out_put:
const struct quotactl_ops gfs2_quotactl_ops = { const struct quotactl_ops gfs2_quotactl_ops = {
.quota_sync = gfs2_quota_sync, .quota_sync = gfs2_quota_sync,
.get_xstate = gfs2_quota_get_xstate, .get_xstate = gfs2_quota_get_xstate,
.get_xquota = gfs2_xquota_get, .get_dqblk = gfs2_get_dqblk,
.set_xquota = gfs2_xquota_set, .set_xquota = gfs2_xquota_set,
}; };

View File

@ -2301,25 +2301,30 @@ static inline qsize_t stoqb(qsize_t space)
} }
/* Generic routine for getting common part of quota structure */ /* Generic routine for getting common part of quota structure */
static void do_get_dqblk(struct dquot *dquot, struct if_dqblk *di) static void do_get_dqblk(struct dquot *dquot, struct fs_disk_quota *di)
{ {
struct mem_dqblk *dm = &dquot->dq_dqb; struct mem_dqblk *dm = &dquot->dq_dqb;
memset(di, 0, sizeof(*di));
di->d_version = FS_DQUOT_VERSION;
di->d_flags = dquot->dq_type == USRQUOTA ?
XFS_USER_QUOTA : XFS_GROUP_QUOTA;
di->d_id = dquot->dq_id;
spin_lock(&dq_data_lock); spin_lock(&dq_data_lock);
di->dqb_bhardlimit = stoqb(dm->dqb_bhardlimit); di->d_blk_hardlimit = stoqb(dm->dqb_bhardlimit);
di->dqb_bsoftlimit = stoqb(dm->dqb_bsoftlimit); di->d_blk_softlimit = stoqb(dm->dqb_bsoftlimit);
di->dqb_curspace = dm->dqb_curspace + dm->dqb_rsvspace; di->d_ino_hardlimit = dm->dqb_ihardlimit;
di->dqb_ihardlimit = dm->dqb_ihardlimit; di->d_ino_softlimit = dm->dqb_isoftlimit;
di->dqb_isoftlimit = dm->dqb_isoftlimit; di->d_bcount = dm->dqb_curspace + dm->dqb_rsvspace;
di->dqb_curinodes = dm->dqb_curinodes; di->d_icount = dm->dqb_curinodes;
di->dqb_btime = dm->dqb_btime; di->d_btimer = dm->dqb_btime;
di->dqb_itime = dm->dqb_itime; di->d_itimer = dm->dqb_itime;
di->dqb_valid = QIF_ALL;
spin_unlock(&dq_data_lock); spin_unlock(&dq_data_lock);
} }
int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, int vfs_get_dqblk(struct super_block *sb, int type, qid_t id,
struct if_dqblk *di) struct fs_disk_quota *di)
{ {
struct dquot *dquot; struct dquot *dquot;

View File

@ -136,19 +136,32 @@ static int quota_setinfo(struct super_block *sb, int type, void __user *addr)
return sb->s_qcop->set_info(sb, type, &info); return sb->s_qcop->set_info(sb, type, &info);
} }
static void copy_to_if_dqblk(struct if_dqblk *dst, struct fs_disk_quota *src)
{
dst->dqb_bhardlimit = src->d_blk_hardlimit;
dst->dqb_bsoftlimit = src->d_blk_softlimit;
dst->dqb_curspace = src->d_bcount;
dst->dqb_ihardlimit = src->d_ino_hardlimit;
dst->dqb_isoftlimit = src->d_ino_softlimit;
dst->dqb_curinodes = src->d_icount;
dst->dqb_btime = src->d_btimer;
dst->dqb_itime = src->d_itimer;
dst->dqb_valid = QIF_ALL;
}
static int quota_getquota(struct super_block *sb, int type, qid_t id, static int quota_getquota(struct super_block *sb, int type, qid_t id,
void __user *addr) void __user *addr)
{ {
struct fs_disk_quota fdq;
struct if_dqblk idq; struct if_dqblk idq;
int ret; int ret;
if (!sb_has_quota_active(sb, type))
return -ESRCH;
if (!sb->s_qcop->get_dqblk) if (!sb->s_qcop->get_dqblk)
return -ENOSYS; return -ENOSYS;
ret = sb->s_qcop->get_dqblk(sb, type, id, &idq); ret = sb->s_qcop->get_dqblk(sb, type, id, &fdq);
if (ret) if (ret)
return ret; return ret;
copy_to_if_dqblk(&idq, &fdq);
if (copy_to_user(addr, &idq, sizeof(idq))) if (copy_to_user(addr, &idq, sizeof(idq)))
return -EFAULT; return -EFAULT;
return 0; return 0;
@ -210,9 +223,9 @@ static int quota_getxquota(struct super_block *sb, int type, qid_t id,
struct fs_disk_quota fdq; struct fs_disk_quota fdq;
int ret; int ret;
if (!sb->s_qcop->get_xquota) if (!sb->s_qcop->get_dqblk)
return -ENOSYS; return -ENOSYS;
ret = sb->s_qcop->get_xquota(sb, type, id, &fdq); ret = sb->s_qcop->get_dqblk(sb, type, id, &fdq);
if (!ret && copy_to_user(addr, &fdq, sizeof(fdq))) if (!ret && copy_to_user(addr, &fdq, sizeof(fdq)))
return -EFAULT; return -EFAULT;
return ret; return ret;

View File

@ -97,7 +97,7 @@ xfs_fs_set_xstate(
} }
STATIC int STATIC int
xfs_fs_get_xquota( xfs_fs_get_dqblk(
struct super_block *sb, struct super_block *sb,
int type, int type,
qid_t id, qid_t id,
@ -135,6 +135,6 @@ xfs_fs_set_xquota(
const struct quotactl_ops xfs_quotactl_operations = { const struct quotactl_ops xfs_quotactl_operations = {
.get_xstate = xfs_fs_get_xstate, .get_xstate = xfs_fs_get_xstate,
.set_xstate = xfs_fs_set_xstate, .set_xstate = xfs_fs_set_xstate,
.get_xquota = xfs_fs_get_xquota, .get_dqblk = xfs_fs_get_dqblk,
.set_xquota = xfs_fs_set_xquota, .set_xquota = xfs_fs_set_xquota,
}; };

View File

@ -337,11 +337,10 @@ struct quotactl_ops {
int (*quota_sync)(struct super_block *, int, int); int (*quota_sync)(struct super_block *, int, int);
int (*get_info)(struct super_block *, int, struct if_dqinfo *); int (*get_info)(struct super_block *, int, struct if_dqinfo *);
int (*set_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 if_dqblk *); int (*get_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *);
int (*set_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *); int (*set_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *);
int (*get_xstate)(struct super_block *, struct fs_quota_stat *); int (*get_xstate)(struct super_block *, struct fs_quota_stat *);
int (*set_xstate)(struct super_block *, unsigned int, int); int (*set_xstate)(struct super_block *, unsigned int, int);
int (*get_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *);
int (*set_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *); int (*set_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *);
}; };

View File

@ -63,7 +63,8 @@ int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
int vfs_quota_sync(struct super_block *sb, int type, int wait); int vfs_quota_sync(struct super_block *sb, int type, int wait);
int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); int vfs_get_dqblk(struct super_block *sb, int type, qid_t id,
struct fs_disk_quota *di);
int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di); int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
int dquot_transfer(struct inode *inode, struct iattr *iattr); int dquot_transfer(struct inode *inode, struct iattr *iattr);