Commit d3b86324 authored by Jan Kara's avatar Jan Kara

quota: Wire up ->quota_{enable,disable} callbacks into Q_QUOTA{ON,OFF}

Make Q_QUOTAON / Q_QUOTAOFF quotactl call ->quota_enable /
->quota_disable callback when provided. To match current behavior of
ocfs2 & ext4 we make these quotactls turn on / off quota enforcement for
appropriate quota type.
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 38e478c4
...@@ -66,18 +66,43 @@ static int quota_sync_all(int type) ...@@ -66,18 +66,43 @@ static int quota_sync_all(int type)
return ret; return ret;
} }
unsigned int qtype_enforce_flag(int type)
{
switch (type) {
case USRQUOTA:
return FS_QUOTA_UDQ_ENFD;
case GRPQUOTA:
return FS_QUOTA_GDQ_ENFD;
case PRJQUOTA:
return FS_QUOTA_PDQ_ENFD;
}
return 0;
}
static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id,
struct path *path) struct path *path)
{ {
if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta) if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta &&
!sb->s_qcop->quota_enable)
return -ENOSYS; return -ENOSYS;
if (sb->s_qcop->quota_on_meta) if (sb->s_qcop->quota_on_meta)
return sb->s_qcop->quota_on_meta(sb, type, id); return sb->s_qcop->quota_on_meta(sb, type, id);
if (sb->s_qcop->quota_enable)
return sb->s_qcop->quota_enable(sb, qtype_enforce_flag(type));
if (IS_ERR(path)) if (IS_ERR(path))
return PTR_ERR(path); return PTR_ERR(path);
return sb->s_qcop->quota_on(sb, type, id, path); return sb->s_qcop->quota_on(sb, type, id, path);
} }
static int quota_quotaoff(struct super_block *sb, int type)
{
if (!sb->s_qcop->quota_off && !sb->s_qcop->quota_disable)
return -ENOSYS;
if (sb->s_qcop->quota_disable)
return sb->s_qcop->quota_disable(sb, qtype_enforce_flag(type));
return sb->s_qcop->quota_off(sb, type);
}
static int quota_getfmt(struct super_block *sb, int type, void __user *addr) static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
{ {
__u32 fmt; __u32 fmt;
...@@ -440,9 +465,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, ...@@ -440,9 +465,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
case Q_QUOTAON: case Q_QUOTAON:
return quota_quotaon(sb, type, cmd, id, path); return quota_quotaon(sb, type, cmd, id, path);
case Q_QUOTAOFF: case Q_QUOTAOFF:
if (!sb->s_qcop->quota_off) return quota_quotaoff(sb, type);
return -ENOSYS;
return sb->s_qcop->quota_off(sb, type);
case Q_GETFMT: case Q_GETFMT:
return quota_getfmt(sb, type, addr); return quota_getfmt(sb, type, addr);
case Q_GETINFO: case Q_GETINFO:
......
...@@ -386,4 +386,6 @@ static inline void dquot_release_reservation_block(struct inode *inode, ...@@ -386,4 +386,6 @@ static inline void dquot_release_reservation_block(struct inode *inode,
__dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
} }
unsigned int qtype_enforce_flag(int type);
#endif /* _LINUX_QUOTAOPS_ */ #endif /* _LINUX_QUOTAOPS_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment