Lines Matching refs:info

26 static int __get_index(struct qtree_mem_dqinfo *info, qid_t id, int depth)
28 unsigned int epb = info->dqi_usable_bs >> 2;
30 depth = info->dqi_qtree_depth - depth - 1;
36 static int get_index(struct qtree_mem_dqinfo *info, struct kqid qid, int depth)
40 return __get_index(info, id, depth);
44 static int qtree_dqstr_in_blk(struct qtree_mem_dqinfo *info)
46 return (info->dqi_usable_bs - sizeof(struct qt_disk_dqdbheader))
47 / info->dqi_entry_size;
59 static ssize_t read_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)
61 struct super_block *sb = info->dqi_sb;
63 memset(buf, 0, info->dqi_usable_bs);
64 return sb->s_op->quota_read(sb, info->dqi_type, buf,
65 info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits);
68 static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf)
70 struct super_block *sb = info->dqi_sb;
73 ret = sb->s_op->quota_write(sb, info->dqi_type, buf,
74 info->dqi_usable_bs, (loff_t)blk << info->dqi_blocksize_bits);
75 if (ret != info->dqi_usable_bs) {
95 static int check_dquot_block_header(struct qtree_mem_dqinfo *info,
100 err = do_check_range(info->dqi_sb, "dqdh_next_free",
102 info->dqi_blocks - 1);
105 err = do_check_range(info->dqi_sb, "dqdh_prev_free",
107 info->dqi_blocks - 1);
113 static int get_free_dqblk(struct qtree_mem_dqinfo *info)
115 char *buf = getdqbuf(info->dqi_usable_bs);
121 if (info->dqi_free_blk) {
122 blk = info->dqi_free_blk;
123 ret = read_blk(info, blk, buf);
126 ret = check_dquot_block_header(info, dh);
129 info->dqi_free_blk = le32_to_cpu(dh->dqdh_next_free);
132 memset(buf, 0, info->dqi_usable_bs);
134 ret = write_blk(info, info->dqi_blocks, buf);
137 blk = info->dqi_blocks++;
139 mark_info_dirty(info->dqi_sb, info->dqi_type);
147 static int put_free_dqblk(struct qtree_mem_dqinfo *info, char *buf, uint blk)
152 dh->dqdh_next_free = cpu_to_le32(info->dqi_free_blk);
155 err = write_blk(info, blk, buf);
158 info->dqi_free_blk = blk;
159 mark_info_dirty(info->dqi_sb, info->dqi_type);
164 static int remove_free_dqentry(struct qtree_mem_dqinfo *info, char *buf,
167 char *tmpbuf = getdqbuf(info->dqi_usable_bs);
176 err = read_blk(info, nextblk, tmpbuf);
181 err = write_blk(info, nextblk, tmpbuf);
186 err = read_blk(info, prevblk, tmpbuf);
191 err = write_blk(info, prevblk, tmpbuf);
195 info->dqi_free_entry = nextblk;
196 mark_info_dirty(info->dqi_sb, info->dqi_type);
201 if (write_blk(info, blk, buf) < 0)
202 quota_error(info->dqi_sb, "Can't write block (%u) "
211 static int insert_free_dqentry(struct qtree_mem_dqinfo *info, char *buf,
214 char *tmpbuf = getdqbuf(info->dqi_usable_bs);
220 dh->dqdh_next_free = cpu_to_le32(info->dqi_free_entry);
222 err = write_blk(info, blk, buf);
225 if (info->dqi_free_entry) {
226 err = read_blk(info, info->dqi_free_entry, tmpbuf);
231 err = write_blk(info, info->dqi_free_entry, tmpbuf);
236 info->dqi_free_entry = blk;
237 mark_info_dirty(info->dqi_sb, info->dqi_type);
245 int qtree_entry_unused(struct qtree_mem_dqinfo *info, char *disk)
249 for (i = 0; i < info->dqi_entry_size; i++)
257 static uint find_free_dqentry(struct qtree_mem_dqinfo *info,
262 char *buf = getdqbuf(info->dqi_usable_bs);
271 if (info->dqi_free_entry) {
272 blk = info->dqi_free_entry;
273 *err = read_blk(info, blk, buf);
276 *err = check_dquot_block_header(info, dh);
280 blk = get_free_dqblk(info);
286 memset(buf, 0, info->dqi_usable_bs);
289 info->dqi_free_entry = blk;
293 if (le16_to_cpu(dh->dqdh_entries) + 1 >= qtree_dqstr_in_blk(info)) {
294 *err = remove_free_dqentry(info, buf, blk);
304 for (i = 0; i < qtree_dqstr_in_blk(info); i++) {
305 if (qtree_entry_unused(info, ddquot))
307 ddquot += info->dqi_entry_size;
310 if (i == qtree_dqstr_in_blk(info)) {
316 *err = write_blk(info, blk, buf);
322 dquot->dq_off = ((loff_t)blk << info->dqi_blocksize_bits) +
324 i * info->dqi_entry_size;
333 static int do_insert_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot,
336 char *buf = getdqbuf(info->dqi_usable_bs);
344 ret = get_free_dqblk(info);
348 memset(buf, 0, info->dqi_usable_bs);
351 ret = read_blk(info, *treeblk, buf);
359 newblk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]);
362 if (depth == info->dqi_qtree_depth - 1) {
367 le32_to_cpu(ref[get_index(info,
373 newblk = find_free_dqentry(info, dquot, &ret);
375 ret = do_insert_tree(info, dquot, &newblk, depth+1);
378 ref[get_index(info, dquot->dq_id, depth)] =
380 ret = write_blk(info, *treeblk, buf);
382 put_free_dqblk(info, buf, *treeblk);
390 static inline int dq_insert_tree(struct qtree_mem_dqinfo *info,
396 if (info->dqi_blocks <= QT_TREEOFF) {
401 return do_insert_tree(info, dquot, &tmp, 0);
408 int qtree_write_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
413 char *ddquot = getdqbuf(info->dqi_entry_size);
420 ret = dq_insert_tree(info, dquot);
429 info->dqi_ops->mem2disk_dqblk(ddquot, dquot);
431 ret = sb->s_op->quota_write(sb, type, ddquot, info->dqi_entry_size,
433 if (ret != info->dqi_entry_size) {
448 static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot,
452 char *buf = getdqbuf(info->dqi_usable_bs);
457 if (dquot->dq_off >> info->dqi_blocksize_bits != blk) {
460 (uint)(dquot->dq_off >> info->dqi_blocksize_bits));
464 ret = read_blk(info, blk, buf);
471 ret = check_dquot_block_header(info, dh);
476 ret = remove_free_dqentry(info, buf, blk);
478 ret = put_free_dqblk(info, buf, blk);
486 (dquot->dq_off & ((1 << info->dqi_blocksize_bits) - 1)),
487 0, info->dqi_entry_size);
489 qtree_dqstr_in_blk(info) - 1) {
491 ret = insert_free_dqentry(info, buf, blk);
498 ret = write_blk(info, blk, buf);
513 static int remove_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot,
516 char *buf = getdqbuf(info->dqi_usable_bs);
523 ret = read_blk(info, *blk, buf);
529 newblk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]);
530 if (newblk < QT_TREEOFF || newblk >= info->dqi_blocks) {
532 newblk, info->dqi_blocks);
537 if (depth == info->dqi_qtree_depth - 1) {
538 ret = free_dqentry(info, dquot, newblk);
541 ret = remove_tree(info, dquot, &newblk, depth+1);
545 ref[get_index(info, dquot->dq_id, depth)] = cpu_to_le32(0);
547 for (i = 0; i < (info->dqi_usable_bs >> 2) && !ref[i]; i++)
550 if (i == (info->dqi_usable_bs >> 2)
552 put_free_dqblk(info, buf, *blk);
555 ret = write_blk(info, *blk, buf);
568 int qtree_delete_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
574 return remove_tree(info, dquot, &tmp, 0);
579 static loff_t find_block_dqentry(struct qtree_mem_dqinfo *info,
582 char *buf = getdqbuf(info->dqi_usable_bs);
589 ret = read_blk(info, blk, buf);
596 for (i = 0; i < qtree_dqstr_in_blk(info); i++) {
597 if (info->dqi_ops->is_id(ddquot, dquot))
599 ddquot += info->dqi_entry_size;
601 if (i == qtree_dqstr_in_blk(info)) {
608 ret = ((loff_t)blk << info->dqi_blocksize_bits) + sizeof(struct
609 qt_disk_dqdbheader) + i * info->dqi_entry_size;
617 static loff_t find_tree_dqentry(struct qtree_mem_dqinfo *info,
620 char *buf = getdqbuf(info->dqi_usable_bs);
626 ret = read_blk(info, blk, buf);
633 blk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]);
636 if (blk < QT_TREEOFF || blk >= info->dqi_blocks) {
638 blk, info->dqi_blocks);
643 if (depth < info->dqi_qtree_depth - 1)
644 ret = find_tree_dqentry(info, dquot, blk, depth+1);
646 ret = find_block_dqentry(info, dquot, blk);
653 static inline loff_t find_dqentry(struct qtree_mem_dqinfo *info,
656 return find_tree_dqentry(info, dquot, QT_TREEOFF, 0);
659 int qtree_read_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
676 offset = find_dqentry(info, dquot);
691 ddquot = getdqbuf(info->dqi_entry_size);
694 ret = sb->s_op->quota_read(sb, type, ddquot, info->dqi_entry_size,
696 if (ret != info->dqi_entry_size) {
707 info->dqi_ops->disk2mem_dqblk(dquot, ddquot);
723 int qtree_release_dquot(struct qtree_mem_dqinfo *info, struct dquot *dquot)
727 return qtree_delete_dquot(info, dquot);
732 static int find_next_id(struct qtree_mem_dqinfo *info, qid_t *id,
735 char *buf = getdqbuf(info->dqi_usable_bs);
738 unsigned int epb = info->dqi_usable_bs >> 2;
745 for (i = depth; i < info->dqi_qtree_depth - 1; i++)
748 ret = read_blk(info, blk, buf);
750 quota_error(info->dqi_sb,
754 for (i = __get_index(info, *id, depth); i < epb; i++) {
759 if (depth == info->dqi_qtree_depth - 1) {
763 ret = find_next_id(info, id, le32_to_cpu(ref[i]), depth + 1);
776 int qtree_get_next_id(struct qtree_mem_dqinfo *info, struct kqid *qid)
781 ret = find_next_id(info, &id, QT_TREEOFF, 0);