1 // SPDX-License-Identifier: GPL-2.0-only
3 * vfsv0 quota IO operations on file
6 #include <linux/errno.h>
8 #include <linux/mount.h>
9 #include <linux/dqblk_v2.h>
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/quotaops.h>
16 #include <asm/byteorder.h>
18 #include "quota_tree.h"
19 #include "quotaio_v2.h"
21 MODULE_AUTHOR("Jan Kara");
22 MODULE_DESCRIPTION("Quota format v2 support");
23 MODULE_LICENSE("GPL");
25 static void v2r0_mem2diskdqb(void *dp
, struct dquot
*dquot
);
26 static void v2r0_disk2memdqb(struct dquot
*dquot
, void *dp
);
27 static int v2r0_is_id(void *dp
, struct dquot
*dquot
);
28 static void v2r1_mem2diskdqb(void *dp
, struct dquot
*dquot
);
29 static void v2r1_disk2memdqb(struct dquot
*dquot
, void *dp
);
30 static int v2r1_is_id(void *dp
, struct dquot
*dquot
);
32 static const struct qtree_fmt_operations v2r0_qtree_ops
= {
33 .mem2disk_dqblk
= v2r0_mem2diskdqb
,
34 .disk2mem_dqblk
= v2r0_disk2memdqb
,
38 static const struct qtree_fmt_operations v2r1_qtree_ops
= {
39 .mem2disk_dqblk
= v2r1_mem2diskdqb
,
40 .disk2mem_dqblk
= v2r1_disk2memdqb
,
44 #define QUOTABLOCK_BITS 10
45 #define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS)
47 static inline qsize_t
v2_stoqb(qsize_t space
)
49 return (space
+ QUOTABLOCK_SIZE
- 1) >> QUOTABLOCK_BITS
;
52 static inline qsize_t
v2_qbtos(qsize_t blocks
)
54 return blocks
<< QUOTABLOCK_BITS
;
57 static int v2_read_header(struct super_block
*sb
, int type
,
58 struct v2_disk_dqheader
*dqhead
)
62 size
= sb
->s_op
->quota_read(sb
, type
, (char *)dqhead
,
63 sizeof(struct v2_disk_dqheader
), 0);
64 if (size
!= sizeof(struct v2_disk_dqheader
)) {
65 quota_error(sb
, "Failed header read: expected=%zd got=%zd",
66 sizeof(struct v2_disk_dqheader
), size
);
74 /* Check whether given file is really vfsv0 quotafile */
75 static int v2_check_quota_file(struct super_block
*sb
, int type
)
77 struct v2_disk_dqheader dqhead
;
78 static const uint quota_magics
[] = V2_INITQMAGICS
;
79 static const uint quota_versions
[] = V2_INITQVERSIONS
;
81 if (v2_read_header(sb
, type
, &dqhead
))
83 if (le32_to_cpu(dqhead
.dqh_magic
) != quota_magics
[type
] ||
84 le32_to_cpu(dqhead
.dqh_version
) > quota_versions
[type
])
89 /* Read information header from quota file */
90 static int v2_read_file_info(struct super_block
*sb
, int type
)
92 struct v2_disk_dqinfo dinfo
;
93 struct v2_disk_dqheader dqhead
;
94 struct quota_info
*dqopt
= sb_dqopt(sb
);
95 struct mem_dqinfo
*info
= &dqopt
->info
[type
];
96 struct qtree_mem_dqinfo
*qinfo
;
99 unsigned int memalloc
;
102 down_read(&dqopt
->dqio_sem
);
103 memalloc
= memalloc_nofs_save();
104 ret
= v2_read_header(sb
, type
, &dqhead
);
107 version
= le32_to_cpu(dqhead
.dqh_version
);
108 if ((info
->dqi_fmt_id
== QFMT_VFS_V0
&& version
!= 0) ||
109 (info
->dqi_fmt_id
== QFMT_VFS_V1
&& version
!= 1)) {
114 size
= sb
->s_op
->quota_read(sb
, type
, (char *)&dinfo
,
115 sizeof(struct v2_disk_dqinfo
), V2_DQINFOOFF
);
116 if (size
!= sizeof(struct v2_disk_dqinfo
)) {
117 quota_error(sb
, "Can't read info structure");
124 info
->dqi_priv
= kmalloc(sizeof(struct qtree_mem_dqinfo
), GFP_KERNEL
);
125 if (!info
->dqi_priv
) {
129 qinfo
= info
->dqi_priv
;
131 /* limits are stored as unsigned 32-bit data */
132 info
->dqi_max_spc_limit
= 0xffffffffLL
<< QUOTABLOCK_BITS
;
133 info
->dqi_max_ino_limit
= 0xffffffff;
136 * Used space is stored as unsigned 64-bit value in bytes but
137 * quota core supports only signed 64-bit values so use that
140 info
->dqi_max_spc_limit
= 0x7fffffffffffffffLL
; /* 2^63-1 */
141 info
->dqi_max_ino_limit
= 0x7fffffffffffffffLL
;
143 info
->dqi_bgrace
= le32_to_cpu(dinfo
.dqi_bgrace
);
144 info
->dqi_igrace
= le32_to_cpu(dinfo
.dqi_igrace
);
145 /* No flags currently supported */
148 qinfo
->dqi_type
= type
;
149 qinfo
->dqi_blocks
= le32_to_cpu(dinfo
.dqi_blocks
);
150 qinfo
->dqi_free_blk
= le32_to_cpu(dinfo
.dqi_free_blk
);
151 qinfo
->dqi_free_entry
= le32_to_cpu(dinfo
.dqi_free_entry
);
152 qinfo
->dqi_blocksize_bits
= V2_DQBLKSIZE_BITS
;
153 qinfo
->dqi_usable_bs
= 1 << V2_DQBLKSIZE_BITS
;
154 qinfo
->dqi_qtree_depth
= qtree_depth(qinfo
);
156 qinfo
->dqi_entry_size
= sizeof(struct v2r0_disk_dqblk
);
157 qinfo
->dqi_ops
= &v2r0_qtree_ops
;
159 qinfo
->dqi_entry_size
= sizeof(struct v2r1_disk_dqblk
);
160 qinfo
->dqi_ops
= &v2r1_qtree_ops
;
163 /* Some sanity checks of the read headers... */
164 if ((loff_t
)qinfo
->dqi_blocks
<< qinfo
->dqi_blocksize_bits
>
165 i_size_read(sb_dqopt(sb
)->files
[type
])) {
166 quota_error(sb
, "Number of blocks too big for quota file size (%llu > %llu).",
167 (loff_t
)qinfo
->dqi_blocks
<< qinfo
->dqi_blocksize_bits
,
168 i_size_read(sb_dqopt(sb
)->files
[type
]));
171 if (qinfo
->dqi_free_blk
&& (qinfo
->dqi_free_blk
<= QT_TREEOFF
||
172 qinfo
->dqi_free_blk
>= qinfo
->dqi_blocks
)) {
173 quota_error(sb
, "Free block number %u out of range (%u, %u).",
174 qinfo
->dqi_free_blk
, QT_TREEOFF
, qinfo
->dqi_blocks
);
177 if (qinfo
->dqi_free_entry
&& (qinfo
->dqi_free_entry
<= QT_TREEOFF
||
178 qinfo
->dqi_free_entry
>= qinfo
->dqi_blocks
)) {
179 quota_error(sb
, "Block with free entry %u out of range (%u, %u).",
180 qinfo
->dqi_free_entry
, QT_TREEOFF
,
187 kfree(info
->dqi_priv
);
188 info
->dqi_priv
= NULL
;
191 memalloc_nofs_restore(memalloc
);
192 up_read(&dqopt
->dqio_sem
);
196 /* Write information header to quota file */
197 static int v2_write_file_info(struct super_block
*sb
, int type
)
199 struct v2_disk_dqinfo dinfo
;
200 struct quota_info
*dqopt
= sb_dqopt(sb
);
201 struct mem_dqinfo
*info
= &dqopt
->info
[type
];
202 struct qtree_mem_dqinfo
*qinfo
= info
->dqi_priv
;
204 unsigned int memalloc
;
206 down_write(&dqopt
->dqio_sem
);
207 memalloc
= memalloc_nofs_save();
208 spin_lock(&dq_data_lock
);
209 info
->dqi_flags
&= ~DQF_INFO_DIRTY
;
210 dinfo
.dqi_bgrace
= cpu_to_le32(info
->dqi_bgrace
);
211 dinfo
.dqi_igrace
= cpu_to_le32(info
->dqi_igrace
);
212 /* No flags currently supported */
213 dinfo
.dqi_flags
= cpu_to_le32(0);
214 spin_unlock(&dq_data_lock
);
215 dinfo
.dqi_blocks
= cpu_to_le32(qinfo
->dqi_blocks
);
216 dinfo
.dqi_free_blk
= cpu_to_le32(qinfo
->dqi_free_blk
);
217 dinfo
.dqi_free_entry
= cpu_to_le32(qinfo
->dqi_free_entry
);
218 size
= sb
->s_op
->quota_write(sb
, type
, (char *)&dinfo
,
219 sizeof(struct v2_disk_dqinfo
), V2_DQINFOOFF
);
220 memalloc_nofs_restore(memalloc
);
221 up_write(&dqopt
->dqio_sem
);
222 if (size
!= sizeof(struct v2_disk_dqinfo
)) {
223 quota_error(sb
, "Can't write info structure");
224 return size
< 0 ? size
: -EIO
;
229 static void v2r0_disk2memdqb(struct dquot
*dquot
, void *dp
)
231 struct v2r0_disk_dqblk
*d
= dp
, empty
;
232 struct mem_dqblk
*m
= &dquot
->dq_dqb
;
234 m
->dqb_ihardlimit
= le32_to_cpu(d
->dqb_ihardlimit
);
235 m
->dqb_isoftlimit
= le32_to_cpu(d
->dqb_isoftlimit
);
236 m
->dqb_curinodes
= le32_to_cpu(d
->dqb_curinodes
);
237 m
->dqb_itime
= le64_to_cpu(d
->dqb_itime
);
238 m
->dqb_bhardlimit
= v2_qbtos(le32_to_cpu(d
->dqb_bhardlimit
));
239 m
->dqb_bsoftlimit
= v2_qbtos(le32_to_cpu(d
->dqb_bsoftlimit
));
240 m
->dqb_curspace
= le64_to_cpu(d
->dqb_curspace
);
241 m
->dqb_btime
= le64_to_cpu(d
->dqb_btime
);
242 /* We need to escape back all-zero structure */
243 memset(&empty
, 0, sizeof(struct v2r0_disk_dqblk
));
244 empty
.dqb_itime
= cpu_to_le64(1);
245 if (!memcmp(&empty
, dp
, sizeof(struct v2r0_disk_dqblk
)))
249 static void v2r0_mem2diskdqb(void *dp
, struct dquot
*dquot
)
251 struct v2r0_disk_dqblk
*d
= dp
;
252 struct mem_dqblk
*m
= &dquot
->dq_dqb
;
253 struct qtree_mem_dqinfo
*info
=
254 sb_dqinfo(dquot
->dq_sb
, dquot
->dq_id
.type
)->dqi_priv
;
256 d
->dqb_ihardlimit
= cpu_to_le32(m
->dqb_ihardlimit
);
257 d
->dqb_isoftlimit
= cpu_to_le32(m
->dqb_isoftlimit
);
258 d
->dqb_curinodes
= cpu_to_le32(m
->dqb_curinodes
);
259 d
->dqb_itime
= cpu_to_le64(m
->dqb_itime
);
260 d
->dqb_bhardlimit
= cpu_to_le32(v2_stoqb(m
->dqb_bhardlimit
));
261 d
->dqb_bsoftlimit
= cpu_to_le32(v2_stoqb(m
->dqb_bsoftlimit
));
262 d
->dqb_curspace
= cpu_to_le64(m
->dqb_curspace
);
263 d
->dqb_btime
= cpu_to_le64(m
->dqb_btime
);
264 d
->dqb_id
= cpu_to_le32(from_kqid(&init_user_ns
, dquot
->dq_id
));
265 if (qtree_entry_unused(info
, dp
))
266 d
->dqb_itime
= cpu_to_le64(1);
269 static int v2r0_is_id(void *dp
, struct dquot
*dquot
)
271 struct v2r0_disk_dqblk
*d
= dp
;
272 struct qtree_mem_dqinfo
*info
=
273 sb_dqinfo(dquot
->dq_sb
, dquot
->dq_id
.type
)->dqi_priv
;
275 if (qtree_entry_unused(info
, dp
))
277 return qid_eq(make_kqid(&init_user_ns
, dquot
->dq_id
.type
,
278 le32_to_cpu(d
->dqb_id
)),
282 static void v2r1_disk2memdqb(struct dquot
*dquot
, void *dp
)
284 struct v2r1_disk_dqblk
*d
= dp
, empty
;
285 struct mem_dqblk
*m
= &dquot
->dq_dqb
;
287 m
->dqb_ihardlimit
= le64_to_cpu(d
->dqb_ihardlimit
);
288 m
->dqb_isoftlimit
= le64_to_cpu(d
->dqb_isoftlimit
);
289 m
->dqb_curinodes
= le64_to_cpu(d
->dqb_curinodes
);
290 m
->dqb_itime
= le64_to_cpu(d
->dqb_itime
);
291 m
->dqb_bhardlimit
= v2_qbtos(le64_to_cpu(d
->dqb_bhardlimit
));
292 m
->dqb_bsoftlimit
= v2_qbtos(le64_to_cpu(d
->dqb_bsoftlimit
));
293 m
->dqb_curspace
= le64_to_cpu(d
->dqb_curspace
);
294 m
->dqb_btime
= le64_to_cpu(d
->dqb_btime
);
295 /* We need to escape back all-zero structure */
296 memset(&empty
, 0, sizeof(struct v2r1_disk_dqblk
));
297 empty
.dqb_itime
= cpu_to_le64(1);
298 if (!memcmp(&empty
, dp
, sizeof(struct v2r1_disk_dqblk
)))
302 static void v2r1_mem2diskdqb(void *dp
, struct dquot
*dquot
)
304 struct v2r1_disk_dqblk
*d
= dp
;
305 struct mem_dqblk
*m
= &dquot
->dq_dqb
;
306 struct qtree_mem_dqinfo
*info
=
307 sb_dqinfo(dquot
->dq_sb
, dquot
->dq_id
.type
)->dqi_priv
;
309 d
->dqb_ihardlimit
= cpu_to_le64(m
->dqb_ihardlimit
);
310 d
->dqb_isoftlimit
= cpu_to_le64(m
->dqb_isoftlimit
);
311 d
->dqb_curinodes
= cpu_to_le64(m
->dqb_curinodes
);
312 d
->dqb_itime
= cpu_to_le64(m
->dqb_itime
);
313 d
->dqb_bhardlimit
= cpu_to_le64(v2_stoqb(m
->dqb_bhardlimit
));
314 d
->dqb_bsoftlimit
= cpu_to_le64(v2_stoqb(m
->dqb_bsoftlimit
));
315 d
->dqb_curspace
= cpu_to_le64(m
->dqb_curspace
);
316 d
->dqb_btime
= cpu_to_le64(m
->dqb_btime
);
317 d
->dqb_id
= cpu_to_le32(from_kqid(&init_user_ns
, dquot
->dq_id
));
319 if (qtree_entry_unused(info
, dp
))
320 d
->dqb_itime
= cpu_to_le64(1);
323 static int v2r1_is_id(void *dp
, struct dquot
*dquot
)
325 struct v2r1_disk_dqblk
*d
= dp
;
326 struct qtree_mem_dqinfo
*info
=
327 sb_dqinfo(dquot
->dq_sb
, dquot
->dq_id
.type
)->dqi_priv
;
329 if (qtree_entry_unused(info
, dp
))
331 return qid_eq(make_kqid(&init_user_ns
, dquot
->dq_id
.type
,
332 le32_to_cpu(d
->dqb_id
)),
336 static int v2_read_dquot(struct dquot
*dquot
)
338 struct quota_info
*dqopt
= sb_dqopt(dquot
->dq_sb
);
340 unsigned int memalloc
;
342 down_read(&dqopt
->dqio_sem
);
343 memalloc
= memalloc_nofs_save();
344 ret
= qtree_read_dquot(
345 sb_dqinfo(dquot
->dq_sb
, dquot
->dq_id
.type
)->dqi_priv
,
347 memalloc_nofs_restore(memalloc
);
348 up_read(&dqopt
->dqio_sem
);
352 static int v2_write_dquot(struct dquot
*dquot
)
354 struct quota_info
*dqopt
= sb_dqopt(dquot
->dq_sb
);
357 unsigned int memalloc
;
360 * If space for dquot is already allocated, we don't need any
361 * protection as we'll only overwrite the place of dquot. We are
362 * still protected by concurrent writes of the same dquot by
365 if (!dquot
->dq_off
) {
367 down_write(&dqopt
->dqio_sem
);
369 down_read(&dqopt
->dqio_sem
);
371 memalloc
= memalloc_nofs_save();
372 ret
= qtree_write_dquot(
373 sb_dqinfo(dquot
->dq_sb
, dquot
->dq_id
.type
)->dqi_priv
,
375 memalloc_nofs_restore(memalloc
);
377 up_write(&dqopt
->dqio_sem
);
379 up_read(&dqopt
->dqio_sem
);
383 static int v2_release_dquot(struct dquot
*dquot
)
385 struct quota_info
*dqopt
= sb_dqopt(dquot
->dq_sb
);
386 unsigned int memalloc
;
389 down_write(&dqopt
->dqio_sem
);
390 memalloc
= memalloc_nofs_save();
391 ret
= qtree_release_dquot(sb_dqinfo(dquot
->dq_sb
, dquot
->dq_id
.type
)->dqi_priv
, dquot
);
392 memalloc_nofs_restore(memalloc
);
393 up_write(&dqopt
->dqio_sem
);
398 static int v2_free_file_info(struct super_block
*sb
, int type
)
400 kfree(sb_dqinfo(sb
, type
)->dqi_priv
);
404 static int v2_get_next_id(struct super_block
*sb
, struct kqid
*qid
)
406 struct quota_info
*dqopt
= sb_dqopt(sb
);
407 unsigned int memalloc
;
410 down_read(&dqopt
->dqio_sem
);
411 memalloc
= memalloc_nofs_save();
412 ret
= qtree_get_next_id(sb_dqinfo(sb
, qid
->type
)->dqi_priv
, qid
);
413 memalloc_nofs_restore(memalloc
);
414 up_read(&dqopt
->dqio_sem
);
418 static const struct quota_format_ops v2_format_ops
= {
419 .check_quota_file
= v2_check_quota_file
,
420 .read_file_info
= v2_read_file_info
,
421 .write_file_info
= v2_write_file_info
,
422 .free_file_info
= v2_free_file_info
,
423 .read_dqblk
= v2_read_dquot
,
424 .commit_dqblk
= v2_write_dquot
,
425 .release_dqblk
= v2_release_dquot
,
426 .get_next_id
= v2_get_next_id
,
429 static struct quota_format_type v2r0_quota_format
= {
430 .qf_fmt_id
= QFMT_VFS_V0
,
431 .qf_ops
= &v2_format_ops
,
432 .qf_owner
= THIS_MODULE
435 static struct quota_format_type v2r1_quota_format
= {
436 .qf_fmt_id
= QFMT_VFS_V1
,
437 .qf_ops
= &v2_format_ops
,
438 .qf_owner
= THIS_MODULE
441 static int __init
init_v2_quota_format(void)
443 register_quota_format(&v2r0_quota_format
);
444 register_quota_format(&v2r1_quota_format
);
448 static void __exit
exit_v2_quota_format(void)
450 unregister_quota_format(&v2r0_quota_format
);
451 unregister_quota_format(&v2r1_quota_format
);
454 module_init(init_v2_quota_format
);
455 module_exit(exit_v2_quota_format
);