- /* If we've hit the max CNID allowed, we return an error. CNID
- * needs to be recycled before proceding. */
- if (++id == CNID_INVALID) {
- rply->result = CNID_DBD_RES_ERR_MAX;
- return -1;
+ cnid_t trycnid, tmp;
+
+ while (true) {
+ if (rply->cnid != CNID_INVALID) {
+ trycnid = ntohl(rply->cnid);
+ rply->cnid = CNID_INVALID;
+ } else {
+ if (++id == CNID_INVALID)
+ id = CNID_START;
+ trycnid = id;
+ }
+ tmp = htonl(trycnid);
+ key.data = &tmp;
+ key.size = sizeof(cnid_t);
+ rc = dbif_get(dbd, DBIF_CNID, &key, &data, 0);
+ if (rc == 0) {
+ break;
+ } else if (rc == -1) {
+ rply->result = CNID_DBD_RES_ERR_DB;
+ return -1;
+ }