Lines Matching refs:root

24 	struct quota_root root;
41 struct maildir_quota_root *root;
125 maildir_list_init(struct maildir_quota_root *root, struct mailbox_list *list)
130 ctx->root = root;
170 rule = quota_root_rule_find(ctx->root->root.set,
215 maildirs_check_have_changed(struct maildir_quota_root *root,
223 ctx = maildir_list_init(root, ns->list);
235 static int maildirsize_write(struct maildir_quota_root *root, const char *path)
238 root->maildirsize_ns->mail_set;
239 struct quota_root *_root = &root->root;
247 i_assert(root->fd == -1);
254 namespaces = array_get(&root->root.quota->namespaces, &count);
305 root->total_bytes, root->total_count);
322 static void maildirsize_recalculate_init(struct maildir_quota_root *root)
324 root->total_bytes = root->total_count = 0;
325 root->recalc_last_stamp = 0;
328 static int maildirsize_recalculate_namespace(struct maildir_quota_root *root,
337 ctx = maildir_list_init(root, ns->list);
339 if (mtime > root->recalc_last_stamp)
340 root->recalc_last_stamp = mtime;
342 if (maildir_sum_dir(dir, &root->total_bytes,
343 &root->total_count, error_r) < 0)
352 static void maildirsize_rebuild_later(struct maildir_quota_root *root)
354 if (!root->root.set->force_default_rule) {
359 if (unlink(root->maildirsize_path) < 0 &&
361 i_error("unlink(%s) failed: %m", root->maildirsize_path);
364 static int maildirsize_recalculate_finish(struct maildir_quota_root *root,
369 if ((ret = maildirsize_write(root, root->maildirsize_path)) < 0)
373 maildirsize_rebuild_later(root);
378 static int maildirsize_recalculate(struct maildir_quota_root *root,
385 maildirsize_recalculate_init(root);
388 namespaces = array_get(&root->root.quota->namespaces, &count);
390 if (!quota_root_is_namespace_visible(&root->root, namespaces[i]))
393 if (maildirsize_recalculate_namespace(root, namespaces[i], error_r) < 0) {
402 if (!quota_root_is_namespace_visible(&root->root,
406 ret = maildirs_check_have_changed(root, namespaces[i],
407 root->recalc_last_stamp,
414 return maildirsize_recalculate_finish(root, ret, error_r);
455 static int maildirsize_parse(struct maildir_quota_root *root,
458 struct quota_root *_root = &root->root;
477 if (root->root.bytes_limit == (int64_t)message_bytes_limit &&
478 root->root.count_limit == (int64_t)message_count_limit) {
480 } else if (root->root.set->force_default_rule) {
486 root->root.bytes_limit = message_bytes_limit;
487 root->root.count_limit = message_count_limit;
488 quota_root_recalculate_relative_rules(root->root.set,
527 root->total_bytes = (uint64_t)total_bytes;
528 root->total_count = (uint64_t)total_count;
532 static int maildirsize_open(struct maildir_quota_root *root,
535 i_close_fd_path(&root->fd, root->maildirsize_path);
537 root->fd = nfs_safe_open(root->maildirsize_path, O_RDWR | O_APPEND);
538 if (root->fd == -1) {
542 "open(%s) failed: %m", root->maildirsize_path);
548 static bool maildirsize_has_changed(struct maildir_quota_root *root)
553 nfs_flush_file_handle_cache(root->maildirsize_path);
554 nfs_flush_attr_cache_unlocked(root->maildirsize_path);
557 if (root->fd == -1)
560 if (stat(root->maildirsize_path, &st1) < 0)
562 if (fstat(root->fd, &st2) < 0)
565 return root->last_size != st2.st_size || st1.st_ino != st2.st_ino ||
569 static int maildirsize_read(struct maildir_quota_root *root, bool *retry,
579 if (!maildirsize_has_changed(root))
582 if ((ret = maildirsize_open(root, error_r)) <= 0)
587 while ((ret = read(root->fd, buf + size, sizeof(buf)-1 - size)) != 0) {
594 "read(%s) failed: %m", root->maildirsize_path);
606 root->total_bytes = root->total_count = 0;
607 root->last_size = size;
617 i_close_fd(&root->fd);
628 maildirsize_parse(root, root->fd, t_strsplit(buf, "\n")) > 0 &&
633 i_close_fd(&root->fd);
639 static bool maildirquota_limits_init(struct maildir_quota_root *root)
645 if (root->limits_initialized)
646 return root->maildirsize_path != NULL;
647 root->limits_initialized = TRUE;
649 if (root->maildirsize_ns == NULL) {
650 i_assert(root->maildirsize_path == NULL);
654 list = root->maildirsize_ns->list;
662 root->maildirsize_ns->prefix);
664 root->maildirsize_path = NULL;
667 if (root->maildirsize_path == NULL) {
671 root->maildirsize_path =
672 p_strconcat(root->root.pool, control_dir,
678 static int maildirquota_read_limits(struct maildir_quota_root *root,
684 if (!maildirquota_limits_init(root))
690 ret = maildirsize_read(root, &retry, error_r);
697 maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r,
704 ret = maildirquota_read_limits(root, error_r);
706 if (root->root.bytes_limit == 0 &&
707 root->root.count_limit == 0 &&
708 root->root.set->default_rule.bytes_limit == 0 &&
709 root->root.set->default_rule.count_limit == 0) {
711 if (!root->root.set->force_default_rule)
717 ret = maildirsize_recalculate(root, error_r);
724 static int maildirsize_update(struct maildir_quota_root *root,
741 if (write_full(root->fd, str, strlen(str)) < 0) {
747 root->maildirsize_path);
751 if (close(root->fd) < 0) {
754 i_error("close(%s) failed: %m", root->maildirsize_path);
756 root->fd = -1;
763 struct maildir_quota_root *root;
765 root = i_new(struct maildir_quota_root, 1);
766 root->fd = -1;
767 return &root->root;
778 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
780 i_close_fd(&root->fd);
781 i_free(root);
809 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
812 if (maildirquota_read_limits(root, &error) < 0) {
824 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
826 if (root->maildirsize_ns == NULL)
827 root->maildirsize_ns = ns;
847 maildir_quota_root_get_resources(struct quota_root *root ATTR_UNUSED)
862 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
866 if (maildirquota_refresh(root, &recalculated, &error) < 0) {
872 *value_r = root->total_bytes;
874 *value_r = root->total_count;
887 struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
891 if (!maildirquota_limits_init(root)) {
900 if (maildirquota_refresh(root, &recalculated, &error) < 0) {
910 } else if (root->fd == -1) {
911 if (maildirsize_recalculate(root, &error) < 0)
914 i_close_fd(&root->fd);
915 if (maildirsize_recalculate(root, &error) < 0)
917 } else if (maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0) {
918 i_close_fd(&root->fd);
919 maildirsize_rebuild_later(root);