mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
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 <[email protected]> Signed-off-by: Jan Kara <[email protected]>
This commit is contained in:
parent
0636c73ee7
commit
b9b2dd36c1
6 changed files with 42 additions and 24 deletions
|
|
@ -2301,25 +2301,30 @@ static inline qsize_t stoqb(qsize_t space)
|
|||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
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);
|
||||
di->dqb_bhardlimit = stoqb(dm->dqb_bhardlimit);
|
||||
di->dqb_bsoftlimit = stoqb(dm->dqb_bsoftlimit);
|
||||
di->dqb_curspace = dm->dqb_curspace + dm->dqb_rsvspace;
|
||||
di->dqb_ihardlimit = dm->dqb_ihardlimit;
|
||||
di->dqb_isoftlimit = dm->dqb_isoftlimit;
|
||||
di->dqb_curinodes = dm->dqb_curinodes;
|
||||
di->dqb_btime = dm->dqb_btime;
|
||||
di->dqb_itime = dm->dqb_itime;
|
||||
di->dqb_valid = QIF_ALL;
|
||||
di->d_blk_hardlimit = stoqb(dm->dqb_bhardlimit);
|
||||
di->d_blk_softlimit = stoqb(dm->dqb_bsoftlimit);
|
||||
di->d_ino_hardlimit = dm->dqb_ihardlimit;
|
||||
di->d_ino_softlimit = dm->dqb_isoftlimit;
|
||||
di->d_bcount = dm->dqb_curspace + dm->dqb_rsvspace;
|
||||
di->d_icount = dm->dqb_curinodes;
|
||||
di->d_btimer = dm->dqb_btime;
|
||||
di->d_itimer = dm->dqb_itime;
|
||||
spin_unlock(&dq_data_lock);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
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,
|
||||
void __user *addr)
|
||||
{
|
||||
struct fs_disk_quota fdq;
|
||||
struct if_dqblk idq;
|
||||
int ret;
|
||||
|
||||
if (!sb_has_quota_active(sb, type))
|
||||
return -ESRCH;
|
||||
if (!sb->s_qcop->get_dqblk)
|
||||
return -ENOSYS;
|
||||
ret = sb->s_qcop->get_dqblk(sb, type, id, &idq);
|
||||
ret = sb->s_qcop->get_dqblk(sb, type, id, &fdq);
|
||||
if (ret)
|
||||
return ret;
|
||||
copy_to_if_dqblk(&idq, &fdq);
|
||||
if (copy_to_user(addr, &idq, sizeof(idq)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
|
|
@ -210,9 +223,9 @@ static int quota_getxquota(struct super_block *sb, int type, qid_t id,
|
|||
struct fs_disk_quota fdq;
|
||||
int ret;
|
||||
|
||||
if (!sb->s_qcop->get_xquota)
|
||||
if (!sb->s_qcop->get_dqblk)
|
||||
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)))
|
||||
return -EFAULT;
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in a new issue