1884d179dSJan Kara /* 2884d179dSJan Kara * vfsv0 quota IO operations on file 3884d179dSJan Kara */ 4884d179dSJan Kara 5884d179dSJan Kara #include <linux/errno.h> 6884d179dSJan Kara #include <linux/fs.h> 7884d179dSJan Kara #include <linux/mount.h> 8884d179dSJan Kara #include <linux/dqblk_v2.h> 9884d179dSJan Kara #include <linux/kernel.h> 10884d179dSJan Kara #include <linux/init.h> 11884d179dSJan Kara #include <linux/module.h> 12884d179dSJan Kara #include <linux/slab.h> 13884d179dSJan Kara #include <linux/quotaops.h> 14884d179dSJan Kara 15884d179dSJan Kara #include <asm/byteorder.h> 16884d179dSJan Kara 17884d179dSJan Kara #include "quota_tree.h" 18884d179dSJan Kara #include "quotaio_v2.h" 19884d179dSJan Kara 20884d179dSJan Kara MODULE_AUTHOR("Jan Kara"); 21884d179dSJan Kara MODULE_DESCRIPTION("Quota format v2 support"); 22884d179dSJan Kara MODULE_LICENSE("GPL"); 23884d179dSJan Kara 24884d179dSJan Kara #define __QUOTA_V2_PARANOIA 25884d179dSJan Kara 26498c6015SJan Kara static void v2r0_mem2diskdqb(void *dp, struct dquot *dquot); 27498c6015SJan Kara static void v2r0_disk2memdqb(struct dquot *dquot, void *dp); 28498c6015SJan Kara static int v2r0_is_id(void *dp, struct dquot *dquot); 29498c6015SJan Kara static void v2r1_mem2diskdqb(void *dp, struct dquot *dquot); 30498c6015SJan Kara static void v2r1_disk2memdqb(struct dquot *dquot, void *dp); 31498c6015SJan Kara static int v2r1_is_id(void *dp, struct dquot *dquot); 32884d179dSJan Kara 33d1b98c23SJulia Lawall static const struct qtree_fmt_operations v2r0_qtree_ops = { 34498c6015SJan Kara .mem2disk_dqblk = v2r0_mem2diskdqb, 35498c6015SJan Kara .disk2mem_dqblk = v2r0_disk2memdqb, 36498c6015SJan Kara .is_id = v2r0_is_id, 37498c6015SJan Kara }; 38498c6015SJan Kara 39d1b98c23SJulia Lawall static const struct qtree_fmt_operations v2r1_qtree_ops = { 40498c6015SJan Kara .mem2disk_dqblk = v2r1_mem2diskdqb, 41498c6015SJan Kara .disk2mem_dqblk = v2r1_disk2memdqb, 42498c6015SJan Kara .is_id = v2r1_is_id, 43884d179dSJan Kara }; 44884d179dSJan Kara 45884d179dSJan Kara #define QUOTABLOCK_BITS 10 46884d179dSJan Kara #define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS) 47884d179dSJan Kara 48884d179dSJan Kara static inline qsize_t v2_stoqb(qsize_t space) 49884d179dSJan Kara { 50884d179dSJan Kara return (space + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS; 51884d179dSJan Kara } 52884d179dSJan Kara 53884d179dSJan Kara static inline qsize_t v2_qbtos(qsize_t blocks) 54884d179dSJan Kara { 55884d179dSJan Kara return blocks << QUOTABLOCK_BITS; 56884d179dSJan Kara } 57884d179dSJan Kara 58498c6015SJan Kara static int v2_read_header(struct super_block *sb, int type, 59498c6015SJan Kara struct v2_disk_dqheader *dqhead) 60498c6015SJan Kara { 61498c6015SJan Kara ssize_t size; 62498c6015SJan Kara 63498c6015SJan Kara size = sb->s_op->quota_read(sb, type, (char *)dqhead, 64498c6015SJan Kara sizeof(struct v2_disk_dqheader), 0); 65498c6015SJan Kara if (size != sizeof(struct v2_disk_dqheader)) { 66fb5ffb0eSJiaying Zhang quota_error(sb, "Failed header read: expected=%zd got=%zd", 67498c6015SJan Kara sizeof(struct v2_disk_dqheader), size); 68498c6015SJan Kara return 0; 69498c6015SJan Kara } 70498c6015SJan Kara return 1; 71498c6015SJan Kara } 72498c6015SJan Kara 73884d179dSJan Kara /* Check whether given file is really vfsv0 quotafile */ 74884d179dSJan Kara static int v2_check_quota_file(struct super_block *sb, int type) 75884d179dSJan Kara { 76884d179dSJan Kara struct v2_disk_dqheader dqhead; 77884d179dSJan Kara static const uint quota_magics[] = V2_INITQMAGICS; 78884d179dSJan Kara static const uint quota_versions[] = V2_INITQVERSIONS; 79884d179dSJan Kara 80498c6015SJan Kara if (!v2_read_header(sb, type, &dqhead)) 81884d179dSJan Kara return 0; 82884d179dSJan Kara if (le32_to_cpu(dqhead.dqh_magic) != quota_magics[type] || 83498c6015SJan Kara le32_to_cpu(dqhead.dqh_version) > quota_versions[type]) 84884d179dSJan Kara return 0; 85884d179dSJan Kara return 1; 86884d179dSJan Kara } 87884d179dSJan Kara 88884d179dSJan Kara /* Read information header from quota file */ 89884d179dSJan Kara static int v2_read_file_info(struct super_block *sb, int type) 90884d179dSJan Kara { 91884d179dSJan Kara struct v2_disk_dqinfo dinfo; 92498c6015SJan Kara struct v2_disk_dqheader dqhead; 93884d179dSJan Kara struct mem_dqinfo *info = sb_dqinfo(sb, type); 94884d179dSJan Kara struct qtree_mem_dqinfo *qinfo; 95884d179dSJan Kara ssize_t size; 96498c6015SJan Kara unsigned int version; 97498c6015SJan Kara 98498c6015SJan Kara if (!v2_read_header(sb, type, &dqhead)) 99869835dfSJan Kara return -1; 100498c6015SJan Kara version = le32_to_cpu(dqhead.dqh_version); 101869835dfSJan Kara if ((info->dqi_fmt_id == QFMT_VFS_V0 && version != 0) || 102869835dfSJan Kara (info->dqi_fmt_id == QFMT_VFS_V1 && version != 1)) 103869835dfSJan Kara return -1; 104884d179dSJan Kara 105884d179dSJan Kara size = sb->s_op->quota_read(sb, type, (char *)&dinfo, 106884d179dSJan Kara sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF); 107884d179dSJan Kara if (size != sizeof(struct v2_disk_dqinfo)) { 108fb5ffb0eSJiaying Zhang quota_error(sb, "Can't read info structure"); 109884d179dSJan Kara return -1; 110884d179dSJan Kara } 111884d179dSJan Kara info->dqi_priv = kmalloc(sizeof(struct qtree_mem_dqinfo), GFP_NOFS); 112884d179dSJan Kara if (!info->dqi_priv) { 113884d179dSJan Kara printk(KERN_WARNING 114884d179dSJan Kara "Not enough memory for quota information structure.\n"); 1157a39de15SDavidlohr Bueso return -ENOMEM; 116884d179dSJan Kara } 117884d179dSJan Kara qinfo = info->dqi_priv; 118498c6015SJan Kara if (version == 0) { 119884d179dSJan Kara /* limits are stored as unsigned 32-bit data */ 1207e08da50SJan Kara info->dqi_max_spc_limit = 0xffffffffLL << QUOTABLOCK_BITS; 121b10a0819SJan Kara info->dqi_max_ino_limit = 0xffffffff; 122498c6015SJan Kara } else { 1237e08da50SJan Kara /* 1247e08da50SJan Kara * Used space is stored as unsigned 64-bit value in bytes but 1257e08da50SJan Kara * quota core supports only signed 64-bit values so use that 1267e08da50SJan Kara * as a limit 1277e08da50SJan Kara */ 1287e08da50SJan Kara info->dqi_max_spc_limit = 0x7fffffffffffffffLL; /* 2^63-1 */ 1297e08da50SJan Kara info->dqi_max_ino_limit = 0x7fffffffffffffffLL; 130498c6015SJan Kara } 131884d179dSJan Kara info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); 132884d179dSJan Kara info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); 133c119c5b9SJan Kara /* No flags currently supported */ 134c119c5b9SJan Kara info->dqi_flags = 0; 135884d179dSJan Kara qinfo->dqi_sb = sb; 136884d179dSJan Kara qinfo->dqi_type = type; 137884d179dSJan Kara qinfo->dqi_blocks = le32_to_cpu(dinfo.dqi_blocks); 138884d179dSJan Kara qinfo->dqi_free_blk = le32_to_cpu(dinfo.dqi_free_blk); 139884d179dSJan Kara qinfo->dqi_free_entry = le32_to_cpu(dinfo.dqi_free_entry); 140884d179dSJan Kara qinfo->dqi_blocksize_bits = V2_DQBLKSIZE_BITS; 141884d179dSJan Kara qinfo->dqi_usable_bs = 1 << V2_DQBLKSIZE_BITS; 142884d179dSJan Kara qinfo->dqi_qtree_depth = qtree_depth(qinfo); 143498c6015SJan Kara if (version == 0) { 144498c6015SJan Kara qinfo->dqi_entry_size = sizeof(struct v2r0_disk_dqblk); 145498c6015SJan Kara qinfo->dqi_ops = &v2r0_qtree_ops; 146498c6015SJan Kara } else { 147498c6015SJan Kara qinfo->dqi_entry_size = sizeof(struct v2r1_disk_dqblk); 148498c6015SJan Kara qinfo->dqi_ops = &v2r1_qtree_ops; 149498c6015SJan Kara } 150884d179dSJan Kara return 0; 151884d179dSJan Kara } 152884d179dSJan Kara 153884d179dSJan Kara /* Write information header to quota file */ 154884d179dSJan Kara static int v2_write_file_info(struct super_block *sb, int type) 155884d179dSJan Kara { 156884d179dSJan Kara struct v2_disk_dqinfo dinfo; 157884d179dSJan Kara struct mem_dqinfo *info = sb_dqinfo(sb, type); 158884d179dSJan Kara struct qtree_mem_dqinfo *qinfo = info->dqi_priv; 159884d179dSJan Kara ssize_t size; 160884d179dSJan Kara 161884d179dSJan Kara spin_lock(&dq_data_lock); 162884d179dSJan Kara info->dqi_flags &= ~DQF_INFO_DIRTY; 163884d179dSJan Kara dinfo.dqi_bgrace = cpu_to_le32(info->dqi_bgrace); 164884d179dSJan Kara dinfo.dqi_igrace = cpu_to_le32(info->dqi_igrace); 165c119c5b9SJan Kara /* No flags currently supported */ 166c119c5b9SJan Kara dinfo.dqi_flags = cpu_to_le32(0); 167884d179dSJan Kara spin_unlock(&dq_data_lock); 168884d179dSJan Kara dinfo.dqi_blocks = cpu_to_le32(qinfo->dqi_blocks); 169884d179dSJan Kara dinfo.dqi_free_blk = cpu_to_le32(qinfo->dqi_free_blk); 170884d179dSJan Kara dinfo.dqi_free_entry = cpu_to_le32(qinfo->dqi_free_entry); 171884d179dSJan Kara size = sb->s_op->quota_write(sb, type, (char *)&dinfo, 172884d179dSJan Kara sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF); 173884d179dSJan Kara if (size != sizeof(struct v2_disk_dqinfo)) { 174fb5ffb0eSJiaying Zhang quota_error(sb, "Can't write info structure"); 175884d179dSJan Kara return -1; 176884d179dSJan Kara } 177884d179dSJan Kara return 0; 178884d179dSJan Kara } 179884d179dSJan Kara 180498c6015SJan Kara static void v2r0_disk2memdqb(struct dquot *dquot, void *dp) 181884d179dSJan Kara { 182498c6015SJan Kara struct v2r0_disk_dqblk *d = dp, empty; 183884d179dSJan Kara struct mem_dqblk *m = &dquot->dq_dqb; 184884d179dSJan Kara 185884d179dSJan Kara m->dqb_ihardlimit = le32_to_cpu(d->dqb_ihardlimit); 186884d179dSJan Kara m->dqb_isoftlimit = le32_to_cpu(d->dqb_isoftlimit); 187884d179dSJan Kara m->dqb_curinodes = le32_to_cpu(d->dqb_curinodes); 188884d179dSJan Kara m->dqb_itime = le64_to_cpu(d->dqb_itime); 189884d179dSJan Kara m->dqb_bhardlimit = v2_qbtos(le32_to_cpu(d->dqb_bhardlimit)); 190884d179dSJan Kara m->dqb_bsoftlimit = v2_qbtos(le32_to_cpu(d->dqb_bsoftlimit)); 191884d179dSJan Kara m->dqb_curspace = le64_to_cpu(d->dqb_curspace); 192884d179dSJan Kara m->dqb_btime = le64_to_cpu(d->dqb_btime); 193884d179dSJan Kara /* We need to escape back all-zero structure */ 194498c6015SJan Kara memset(&empty, 0, sizeof(struct v2r0_disk_dqblk)); 195884d179dSJan Kara empty.dqb_itime = cpu_to_le64(1); 196498c6015SJan Kara if (!memcmp(&empty, dp, sizeof(struct v2r0_disk_dqblk))) 197884d179dSJan Kara m->dqb_itime = 0; 198884d179dSJan Kara } 199884d179dSJan Kara 200498c6015SJan Kara static void v2r0_mem2diskdqb(void *dp, struct dquot *dquot) 201884d179dSJan Kara { 202498c6015SJan Kara struct v2r0_disk_dqblk *d = dp; 203884d179dSJan Kara struct mem_dqblk *m = &dquot->dq_dqb; 204884d179dSJan Kara struct qtree_mem_dqinfo *info = 2054c376dcaSEric W. Biederman sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; 206884d179dSJan Kara 207884d179dSJan Kara d->dqb_ihardlimit = cpu_to_le32(m->dqb_ihardlimit); 208884d179dSJan Kara d->dqb_isoftlimit = cpu_to_le32(m->dqb_isoftlimit); 209884d179dSJan Kara d->dqb_curinodes = cpu_to_le32(m->dqb_curinodes); 210884d179dSJan Kara d->dqb_itime = cpu_to_le64(m->dqb_itime); 211884d179dSJan Kara d->dqb_bhardlimit = cpu_to_le32(v2_stoqb(m->dqb_bhardlimit)); 212884d179dSJan Kara d->dqb_bsoftlimit = cpu_to_le32(v2_stoqb(m->dqb_bsoftlimit)); 213884d179dSJan Kara d->dqb_curspace = cpu_to_le64(m->dqb_curspace); 214884d179dSJan Kara d->dqb_btime = cpu_to_le64(m->dqb_btime); 2154c376dcaSEric W. Biederman d->dqb_id = cpu_to_le32(from_kqid(&init_user_ns, dquot->dq_id)); 216884d179dSJan Kara if (qtree_entry_unused(info, dp)) 217884d179dSJan Kara d->dqb_itime = cpu_to_le64(1); 218884d179dSJan Kara } 219884d179dSJan Kara 220498c6015SJan Kara static int v2r0_is_id(void *dp, struct dquot *dquot) 221884d179dSJan Kara { 222498c6015SJan Kara struct v2r0_disk_dqblk *d = dp; 223498c6015SJan Kara struct qtree_mem_dqinfo *info = 2244c376dcaSEric W. Biederman sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; 225498c6015SJan Kara 226498c6015SJan Kara if (qtree_entry_unused(info, dp)) 227498c6015SJan Kara return 0; 2284c376dcaSEric W. Biederman return qid_eq(make_kqid(&init_user_ns, dquot->dq_id.type, 2294c376dcaSEric W. Biederman le32_to_cpu(d->dqb_id)), 2304c376dcaSEric W. Biederman dquot->dq_id); 231498c6015SJan Kara } 232498c6015SJan Kara 233498c6015SJan Kara static void v2r1_disk2memdqb(struct dquot *dquot, void *dp) 234498c6015SJan Kara { 235498c6015SJan Kara struct v2r1_disk_dqblk *d = dp, empty; 236498c6015SJan Kara struct mem_dqblk *m = &dquot->dq_dqb; 237498c6015SJan Kara 238498c6015SJan Kara m->dqb_ihardlimit = le64_to_cpu(d->dqb_ihardlimit); 239498c6015SJan Kara m->dqb_isoftlimit = le64_to_cpu(d->dqb_isoftlimit); 240498c6015SJan Kara m->dqb_curinodes = le64_to_cpu(d->dqb_curinodes); 241498c6015SJan Kara m->dqb_itime = le64_to_cpu(d->dqb_itime); 242498c6015SJan Kara m->dqb_bhardlimit = v2_qbtos(le64_to_cpu(d->dqb_bhardlimit)); 243498c6015SJan Kara m->dqb_bsoftlimit = v2_qbtos(le64_to_cpu(d->dqb_bsoftlimit)); 244498c6015SJan Kara m->dqb_curspace = le64_to_cpu(d->dqb_curspace); 245498c6015SJan Kara m->dqb_btime = le64_to_cpu(d->dqb_btime); 246498c6015SJan Kara /* We need to escape back all-zero structure */ 247498c6015SJan Kara memset(&empty, 0, sizeof(struct v2r1_disk_dqblk)); 248498c6015SJan Kara empty.dqb_itime = cpu_to_le64(1); 249498c6015SJan Kara if (!memcmp(&empty, dp, sizeof(struct v2r1_disk_dqblk))) 250498c6015SJan Kara m->dqb_itime = 0; 251498c6015SJan Kara } 252498c6015SJan Kara 253498c6015SJan Kara static void v2r1_mem2diskdqb(void *dp, struct dquot *dquot) 254498c6015SJan Kara { 255498c6015SJan Kara struct v2r1_disk_dqblk *d = dp; 256498c6015SJan Kara struct mem_dqblk *m = &dquot->dq_dqb; 257498c6015SJan Kara struct qtree_mem_dqinfo *info = 2584c376dcaSEric W. Biederman sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; 259498c6015SJan Kara 260498c6015SJan Kara d->dqb_ihardlimit = cpu_to_le64(m->dqb_ihardlimit); 261498c6015SJan Kara d->dqb_isoftlimit = cpu_to_le64(m->dqb_isoftlimit); 262498c6015SJan Kara d->dqb_curinodes = cpu_to_le64(m->dqb_curinodes); 263498c6015SJan Kara d->dqb_itime = cpu_to_le64(m->dqb_itime); 264498c6015SJan Kara d->dqb_bhardlimit = cpu_to_le64(v2_stoqb(m->dqb_bhardlimit)); 265498c6015SJan Kara d->dqb_bsoftlimit = cpu_to_le64(v2_stoqb(m->dqb_bsoftlimit)); 266498c6015SJan Kara d->dqb_curspace = cpu_to_le64(m->dqb_curspace); 267498c6015SJan Kara d->dqb_btime = cpu_to_le64(m->dqb_btime); 2684c376dcaSEric W. Biederman d->dqb_id = cpu_to_le32(from_kqid(&init_user_ns, dquot->dq_id)); 269498c6015SJan Kara if (qtree_entry_unused(info, dp)) 270498c6015SJan Kara d->dqb_itime = cpu_to_le64(1); 271498c6015SJan Kara } 272498c6015SJan Kara 273498c6015SJan Kara static int v2r1_is_id(void *dp, struct dquot *dquot) 274498c6015SJan Kara { 275498c6015SJan Kara struct v2r1_disk_dqblk *d = dp; 276884d179dSJan Kara struct qtree_mem_dqinfo *info = 2774c376dcaSEric W. Biederman sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv; 278884d179dSJan Kara 279884d179dSJan Kara if (qtree_entry_unused(info, dp)) 280884d179dSJan Kara return 0; 2814c376dcaSEric W. Biederman return qid_eq(make_kqid(&init_user_ns, dquot->dq_id.type, 2824c376dcaSEric W. Biederman le32_to_cpu(d->dqb_id)), 2834c376dcaSEric W. Biederman dquot->dq_id); 284884d179dSJan Kara } 285884d179dSJan Kara 286884d179dSJan Kara static int v2_read_dquot(struct dquot *dquot) 287884d179dSJan Kara { 288e342e38dSJan Kara struct quota_info *dqopt = sb_dqopt(dquot->dq_sb); 289e342e38dSJan Kara int ret; 290e342e38dSJan Kara 291e342e38dSJan Kara down_read(&dqopt->dqio_sem); 292e342e38dSJan Kara ret = qtree_read_dquot( 293e342e38dSJan Kara sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv, 294e342e38dSJan Kara dquot); 295e342e38dSJan Kara up_read(&dqopt->dqio_sem); 296e342e38dSJan Kara return ret; 297884d179dSJan Kara } 298884d179dSJan Kara 299884d179dSJan Kara static int v2_write_dquot(struct dquot *dquot) 300884d179dSJan Kara { 3018fc32c2bSJan Kara struct quota_info *dqopt = sb_dqopt(dquot->dq_sb); 3028fc32c2bSJan Kara int ret; 303d2faa415SJan Kara bool alloc = false; 3048fc32c2bSJan Kara 305d2faa415SJan Kara /* 306d2faa415SJan Kara * If space for dquot is already allocated, we don't need any 307d2faa415SJan Kara * protection as we'll only overwrite the place of dquot. We are 308d2faa415SJan Kara * still protected by concurrent writes of the same dquot by 309d2faa415SJan Kara * dquot->dq_lock. 310d2faa415SJan Kara */ 311d2faa415SJan Kara if (!dquot->dq_off) { 312d2faa415SJan Kara alloc = true; 3138fc32c2bSJan Kara down_write(&dqopt->dqio_sem); 314d2faa415SJan Kara } 3158fc32c2bSJan Kara ret = qtree_write_dquot( 3168fc32c2bSJan Kara sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv, 3178fc32c2bSJan Kara dquot); 318d2faa415SJan Kara if (alloc) 3198fc32c2bSJan Kara up_write(&dqopt->dqio_sem); 3208fc32c2bSJan Kara return ret; 321884d179dSJan Kara } 322884d179dSJan Kara 323884d179dSJan Kara static int v2_release_dquot(struct dquot *dquot) 324884d179dSJan Kara { 3254c376dcaSEric W. Biederman return qtree_release_dquot(sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv, dquot); 326884d179dSJan Kara } 327884d179dSJan Kara 328884d179dSJan Kara static int v2_free_file_info(struct super_block *sb, int type) 329884d179dSJan Kara { 330884d179dSJan Kara kfree(sb_dqinfo(sb, type)->dqi_priv); 331884d179dSJan Kara return 0; 332884d179dSJan Kara } 333884d179dSJan Kara 3340066373dSJan Kara static int v2_get_next_id(struct super_block *sb, struct kqid *qid) 3350066373dSJan Kara { 3360066373dSJan Kara return qtree_get_next_id(sb_dqinfo(sb, qid->type)->dqi_priv, qid); 3370066373dSJan Kara } 3380066373dSJan Kara 3391472da5fSAlexey Dobriyan static const struct quota_format_ops v2_format_ops = { 340884d179dSJan Kara .check_quota_file = v2_check_quota_file, 341884d179dSJan Kara .read_file_info = v2_read_file_info, 342884d179dSJan Kara .write_file_info = v2_write_file_info, 343884d179dSJan Kara .free_file_info = v2_free_file_info, 344884d179dSJan Kara .read_dqblk = v2_read_dquot, 345884d179dSJan Kara .commit_dqblk = v2_write_dquot, 346884d179dSJan Kara .release_dqblk = v2_release_dquot, 3470066373dSJan Kara .get_next_id = v2_get_next_id, 348884d179dSJan Kara }; 349884d179dSJan Kara 350498c6015SJan Kara static struct quota_format_type v2r0_quota_format = { 351884d179dSJan Kara .qf_fmt_id = QFMT_VFS_V0, 352884d179dSJan Kara .qf_ops = &v2_format_ops, 353884d179dSJan Kara .qf_owner = THIS_MODULE 354884d179dSJan Kara }; 355884d179dSJan Kara 356498c6015SJan Kara static struct quota_format_type v2r1_quota_format = { 357498c6015SJan Kara .qf_fmt_id = QFMT_VFS_V1, 358498c6015SJan Kara .qf_ops = &v2_format_ops, 359498c6015SJan Kara .qf_owner = THIS_MODULE 360498c6015SJan Kara }; 361498c6015SJan Kara 362884d179dSJan Kara static int __init init_v2_quota_format(void) 363884d179dSJan Kara { 364498c6015SJan Kara int ret; 365498c6015SJan Kara 366498c6015SJan Kara ret = register_quota_format(&v2r0_quota_format); 367498c6015SJan Kara if (ret) 368498c6015SJan Kara return ret; 369498c6015SJan Kara return register_quota_format(&v2r1_quota_format); 370884d179dSJan Kara } 371884d179dSJan Kara 372884d179dSJan Kara static void __exit exit_v2_quota_format(void) 373884d179dSJan Kara { 374498c6015SJan Kara unregister_quota_format(&v2r0_quota_format); 375498c6015SJan Kara unregister_quota_format(&v2r1_quota_format); 376884d179dSJan Kara } 377884d179dSJan Kara 378884d179dSJan Kara module_init(init_v2_quota_format); 379884d179dSJan Kara module_exit(exit_v2_quota_format); 380