Lines Matching full:info

26 static int __get_index(struct qtree_mem_dqinfo *info, qid_t id, int depth)  in __get_index()  argument
28 unsigned int epb = info->dqi_usable_bs >> 2; in __get_index()
30 depth = info->dqi_qtree_depth - depth - 1; in __get_index()
36 static int get_index(struct qtree_mem_dqinfo *info, struct kqid qid, int depth) in get_index() argument
40 return __get_index(info, id, depth); in get_index()
44 static int qtree_dqstr_in_blk(struct qtree_mem_dqinfo *info) in qtree_dqstr_in_blk() argument
46 return (info->dqi_usable_bs - sizeof(struct qt_disk_dqdbheader)) in qtree_dqstr_in_blk()
47 / info->dqi_entry_size; in qtree_dqstr_in_blk()
50 static ssize_t read_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf) in read_blk() argument
52 struct super_block *sb = info->dqi_sb; in read_blk()
54 memset(buf, 0, info->dqi_usable_bs); in read_blk()
55 return sb->s_op->quota_read(sb, info->dqi_type, buf, in read_blk()
56 info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits); in read_blk()
59 static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf) in write_blk() argument
61 struct super_block *sb = info->dqi_sb; in write_blk()
64 ret = sb->s_op->quota_write(sb, info->dqi_type, buf, in write_blk()
65 info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits); in write_blk()
66 if (ret != info->dqi_usable_bs) { in write_blk()
86 static int check_dquot_block_header(struct qtree_mem_dqinfo *info, in check_dquot_block_header() argument
91 err = do_check_range(info->dqi_sb, "dqdh_next_free", in check_dquot_block_header()
93 info->dqi_blocks - 1); in check_dquot_block_header()
96 err = do_check_range(info->dqi_sb, "dqdh_prev_free", in check_dquot_block_header()
98 info->dqi_blocks - 1); in check_dquot_block_header()
101 err = do_check_range(info->dqi_sb, "dqdh_entries", in check_dquot_block_header()
103 qtree_dqstr_in_blk(info)); in check_dquot_block_header()
109 static int get_free_dqblk(struct qtree_mem_dqinfo *info) in get_free_dqblk() argument
111 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in get_free_dqblk()
117 if (info->dqi_free_blk) { in get_free_dqblk()
118 blk = info->dqi_free_blk; in get_free_dqblk()
119 ret = read_blk(info, blk, buf); in get_free_dqblk()
122 ret = check_dquot_block_header(info, dh); in get_free_dqblk()
125 info->dqi_free_blk = le32_to_cpu(dh->dqdh_next_free); in get_free_dqblk()
128 memset(buf, 0, info->dqi_usable_bs); in get_free_dqblk()
130 ret = write_blk(info, info->dqi_blocks, buf); in get_free_dqblk()
133 blk = info->dqi_blocks++; in get_free_dqblk()
135 mark_info_dirty(info->dqi_sb, info->dqi_type); in get_free_dqblk()
143 static int put_free_dqblk(struct qtree_mem_dqinfo *info, char *buf, uint blk) in put_free_dqblk() argument
148 dh->dqdh_next_free = cpu_to_le32(info->dqi_free_blk); in put_free_dqblk()
151 err = write_blk(info, blk, buf); in put_free_dqblk()
154 info->dqi_free_blk = blk; in put_free_dqblk()
155 mark_info_dirty(info->dqi_sb, info->dqi_type); in put_free_dqblk()
160 static int remove_free_dqentry(struct qtree_mem_dqinfo *info, char *buf, in remove_free_dqentry() argument
163 char *tmpbuf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in remove_free_dqentry()
172 err = read_blk(info, nextblk, tmpbuf); in remove_free_dqentry()
177 err = write_blk(info, nextblk, tmpbuf); in remove_free_dqentry()
182 err = read_blk(info, prevblk, tmpbuf); in remove_free_dqentry()
187 err = write_blk(info, prevblk, tmpbuf); in remove_free_dqentry()
191 info->dqi_free_entry = nextblk; in remove_free_dqentry()
192 mark_info_dirty(info->dqi_sb, info->dqi_type); in remove_free_dqentry()
197 if (write_blk(info, blk, buf) < 0) in remove_free_dqentry()
198 quota_error(info->dqi_sb, "Can't write block (%u) " in remove_free_dqentry()
207 static int insert_free_dqentry(struct qtree_mem_dqinfo *info, char *buf, in insert_free_dqentry() argument
210 char *tmpbuf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in insert_free_dqentry()
216 dh->dqdh_next_free = cpu_to_le32(info->dqi_free_entry); in insert_free_dqentry()
218 err = write_blk(info, blk, buf); in insert_free_dqentry()
221 if (info->dqi_free_entry) { in insert_free_dqentry()
222 err = read_blk(info, info->dqi_free_entry, tmpbuf); in insert_free_dqentry()
227 err = write_blk(info, info->dqi_free_entry, tmpbuf); in insert_free_dqentry()
232 info->dqi_free_entry = blk; in insert_free_dqentry()
233 mark_info_dirty(info->dqi_sb, info->dqi_type); in insert_free_dqentry()
241 int qtree_entry_unused(struct qtree_mem_dqinfo *info, char *disk) in qtree_entry_unused() argument
245 for (i = 0; i < info->dqi_entry_size; i++) in qtree_entry_unused()
253 static uint find_free_dqentry(struct qtree_mem_dqinfo *info, in find_free_dqentry() argument
258 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in find_free_dqentry()
267 if (info->dqi_free_entry) { in find_free_dqentry()
268 blk = info->dqi_free_entry; in find_free_dqentry()
269 *err = read_blk(info, blk, buf); in find_free_dqentry()
272 *err = check_dquot_block_header(info, dh); in find_free_dqentry()
276 blk = get_free_dqblk(info); in find_free_dqentry()
282 memset(buf, 0, info->dqi_usable_bs); in find_free_dqentry()
285 info->dqi_free_entry = blk; in find_free_dqentry()
289 if (le16_to_cpu(dh->dqdh_entries) + 1 >= qtree_dqstr_in_blk(info)) { in find_free_dqentry()
290 *err = remove_free_dqentry(info, buf, blk); in find_free_dqentry()
300 for (i = 0; i < qtree_dqstr_in_blk(info); i++) { in find_free_dqentry()
301 if (qtree_entry_unused(info, ddquot)) in find_free_dqentry()
303 ddquot += info->dqi_entry_size; in find_free_dqentry()
306 if (i == qtree_dqstr_in_blk(info)) { in find_free_dqentry()
312 *err = write_blk(info, blk, buf); in find_free_dqentry()
318 dquot->dq_off = ((loff_t)blk << info->dqi_blocksize_bits) + in find_free_dqentry()
320 i * info->dqi_entry_size; in find_free_dqentry()
329 static int do_insert_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot, in do_insert_tree() argument
332 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in do_insert_tree()
340 ret = get_free_dqblk(info); in do_insert_tree()
344 memset(buf, 0, info->dqi_usable_bs); in do_insert_tree()
347 ret = read_blk(info, *treeblk, buf); in do_insert_tree()
355 newblk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]); in do_insert_tree()
357 info->dqi_blocks - 1); in do_insert_tree()
362 if (depth == info->dqi_qtree_depth - 1) { in do_insert_tree()
367 le32_to_cpu(ref[get_index(info, in do_insert_tree()
373 newblk = find_free_dqentry(info, dquot, &ret); in do_insert_tree()
375 ret = do_insert_tree(info, dquot, &newblk, depth+1); in do_insert_tree()
378 ref[get_index(info, dquot->dq_id, depth)] = in do_insert_tree()
380 ret = write_blk(info, *treeblk, buf); in do_insert_tree()
382 put_free_dqblk(info, buf, *treeblk); in do_insert_tree()
390 static inline int dq_insert_tree(struct qtree_mem_dqinfo *info, in dq_insert_tree() argument
396 if (info->dqi_blocks <= QT_TREEOFF) { in dq_insert_tree()
401 return do_insert_tree(info, dquot, &tmp, 0); in dq_insert_tree()
408 int qtree_write_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) in qtree_write_dquot() argument
413 char *ddquot = kmalloc(info->dqi_entry_size, GFP_NOFS); in qtree_write_dquot()
420 ret = dq_insert_tree(info, dquot); in qtree_write_dquot()
429 info->dqi_ops->mem2disk_dqblk(ddquot, dquot); in qtree_write_dquot()
431 ret = sb->s_op->quota_write(sb, type, ddquot, info->dqi_entry_size, in qtree_write_dquot()
433 if (ret != info->dqi_entry_size) { in qtree_write_dquot()
448 static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot, in free_dqentry() argument
452 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in free_dqentry()
457 if (dquot->dq_off >> info->dqi_blocksize_bits != blk) { in free_dqentry()
460 (uint)(dquot->dq_off >> info->dqi_blocksize_bits)); in free_dqentry()
464 ret = read_blk(info, blk, buf); in free_dqentry()
471 ret = check_dquot_block_header(info, dh); in free_dqentry()
476 ret = remove_free_dqentry(info, buf, blk); in free_dqentry()
478 ret = put_free_dqblk(info, buf, blk); in free_dqentry()
486 (dquot->dq_off & ((1 << info->dqi_blocksize_bits) - 1)), in free_dqentry()
487 0, info->dqi_entry_size); in free_dqentry()
489 qtree_dqstr_in_blk(info) - 1) { in free_dqentry()
491 ret = insert_free_dqentry(info, buf, blk); in free_dqentry()
498 ret = write_blk(info, blk, buf); in free_dqentry()
513 static int remove_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot, in remove_tree() argument
516 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in remove_tree()
523 ret = read_blk(info, *blk, buf); in remove_tree()
529 newblk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]); in remove_tree()
531 info->dqi_blocks - 1); in remove_tree()
535 if (depth == info->dqi_qtree_depth - 1) { in remove_tree()
536 ret = free_dqentry(info, dquot, newblk); in remove_tree()
539 ret = remove_tree(info, dquot, &newblk, depth+1); in remove_tree()
543 ref[get_index(info, dquot->dq_id, depth)] = cpu_to_le32(0); in remove_tree()
545 for (i = 0; i < (info->dqi_usable_bs >> 2) && !ref[i]; i++) in remove_tree()
548 if (i == (info->dqi_usable_bs >> 2) in remove_tree()
550 put_free_dqblk(info, buf, *blk); in remove_tree()
553 ret = write_blk(info, *blk, buf); in remove_tree()
566 int qtree_delete_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) in qtree_delete_dquot() argument
572 return remove_tree(info, dquot, &tmp, 0); in qtree_delete_dquot()
577 static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info, in find_block_dqentry() argument
580 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in find_block_dqentry()
587 ret = read_blk(info, blk, buf); in find_block_dqentry()
594 for (i = 0; i < qtree_dqstr_in_blk(info); i++) { in find_block_dqentry()
595 if (info->dqi_ops->is_id(ddquot, dquot)) in find_block_dqentry()
597 ddquot += info->dqi_entry_size; in find_block_dqentry()
599 if (i == qtree_dqstr_in_blk(info)) { in find_block_dqentry()
606 ret = ((loff_t)blk << info->dqi_blocksize_bits) + sizeof(struct in find_block_dqentry()
607 qt_disk_dqdbheader) + i * info->dqi_entry_size; in find_block_dqentry()
615 static loff_t find_tree_dqentry(struct qtree_mem_dqinfo *info, in find_tree_dqentry() argument
618 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in find_tree_dqentry()
624 ret = read_blk(info, blk, buf); in find_tree_dqentry()
631 blk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]); in find_tree_dqentry()
635 info->dqi_blocks - 1); in find_tree_dqentry()
639 if (depth < info->dqi_qtree_depth - 1) in find_tree_dqentry()
640 ret = find_tree_dqentry(info, dquot, blk, depth+1); in find_tree_dqentry()
642 ret = find_block_dqentry(info, dquot, blk); in find_tree_dqentry()
649 static inline loff_t find_dqentry(struct qtree_mem_dqinfo *info, in find_dqentry() argument
652 return find_tree_dqentry(info, dquot, QT_TREEOFF, 0); in find_dqentry()
655 int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) in qtree_read_dquot() argument
672 offset = find_dqentry(info, dquot); in qtree_read_dquot()
687 ddquot = kmalloc(info->dqi_entry_size, GFP_NOFS); in qtree_read_dquot()
690 ret = sb->s_op->quota_read(sb, type, ddquot, info->dqi_entry_size, in qtree_read_dquot()
692 if (ret != info->dqi_entry_size) { in qtree_read_dquot()
703 info->dqi_ops->disk2mem_dqblk(dquot, ddquot); in qtree_read_dquot()
719 int qtree_release_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot) in qtree_release_dquot() argument
723 return qtree_delete_dquot(info, dquot); in qtree_release_dquot()
728 static int find_next_id(struct qtree_mem_dqinfo *info, qid_t *id, in find_next_id() argument
731 char *buf = kmalloc(info->dqi_usable_bs, GFP_NOFS); in find_next_id()
734 unsigned int epb = info->dqi_usable_bs >> 2; in find_next_id()
741 for (i = depth; i < info->dqi_qtree_depth - 1; i++) in find_next_id()
744 ret = read_blk(info, blk, buf); in find_next_id()
746 quota_error(info->dqi_sb, in find_next_id()
750 for (i = __get_index(info, *id, depth); i < epb; i++) { in find_next_id()
757 ret = do_check_range(info->dqi_sb, "block", blk_no, 0, in find_next_id()
758 info->dqi_blocks - 1); in find_next_id()
761 if (depth == info->dqi_qtree_depth - 1) { in find_next_id()
765 ret = find_next_id(info, id, blk_no, depth + 1); in find_next_id()
778 int qtree_get_next_id(struct qtree_mem_dqinfo *info, struct kqid *qid) in qtree_get_next_id() argument
783 ret = find_next_id(info, &id, QT_TREEOFF, 0); in qtree_get_next_id()