]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
quota: Fixed NetBSD quota
authorTimo Sirainen <tss@iki.fi>
Fri, 24 Oct 2014 23:52:50 +0000 (02:52 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 24 Oct 2014 23:52:50 +0000 (02:52 +0300)
I guess it's because quota is refreshed only at quota_open() time.
Based on patch by Manuel Bouyer

src/plugins/quota/quota-fs.c

index f61d9b5c1e4c452ba29efd2b66c4a17dd9797ba2..8b0007096382ce81e9e9bb03f1106b3357fec3bc 100644 (file)
@@ -673,34 +673,35 @@ fs_quota_get_netbsd(struct fs_quota_root *root, bool group, bool bytes,
 {
        struct quotakey qk;
        struct quotaval qv;
+       struct quotahandle *qh;
+       int ret;
 
-       if (root->qh == NULL) {
-               if ((root->qh = quota_open(root->mount->mount_path)) == NULL) {
-                       i_error("cannot open quota for %s: %m",
-                               root->mount->mount_path);
-                       fs_quota_root_disable(root, group);
-                       return 0;
-               }
-       } 
+       if ((qh = quota_open(root->mount->mount_path)) == NULL) {
+               i_error("cannot open quota for %s: %m",
+                       root->mount->mount_path);
+               fs_quota_root_disable(root, group);
+               return 0;
+       }
 
        qk.qk_idtype = group ? QUOTA_IDTYPE_GROUP : QUOTA_IDTYPE_USER;
        qk.qk_id = group ? root->gid : root->uid;
        qk.qk_objtype = bytes ? QUOTA_OBJTYPE_BLOCKS : QUOTA_OBJTYPE_FILES;
 
-       if (quota_get(root->qh, &qk, &qv) != 0) {
+       if (quota_get(qh, &qk, &qv) != 0) {
                if (errno == ESRCH) {
                        fs_quota_root_disable(root, group);
                        return 0;
                }
                i_error("quotactl(Q_GETQUOTA, %s) failed: %m",
                        root->mount->mount_path);
-               return -1;
+               ret = -1;
+       } else {
+               *value_r = qv.qv_usage * DEV_BSIZE;
+               *limit_r = qv.qv_softlimit * DEV_BSIZE;
+               ret = 1;
        }
-
-       *value_r = qv.qv_usage * DEV_BSIZE;
-       *limit_r = qv.qv_softlimit * DEV_BSIZE;
-
-       return 1;
+       quota_close(qh);
+       return ret;
 }
 #endif