static void unplug_disk(int idx) { int i; /* * We need to keep last disk path to generate EIO when all disks are * broken */ for (i = idx; i < md_nr_disks - 1; i++) md_disks[i] = md_disks[i + 1]; md_nr_disks--; sys->disk_space = md_init_space(); if (md_nr_disks > 0) kick_recover(); }
int init_disk_space(const char *base_path) { int ret = SD_RES_SUCCESS; uint64_t space_size = 0, mds; struct statvfs fs; if (sys->gateway_only) goto out; /* We need to init md even we don't need to update sapce */ mds = md_init_space(); /* If it is restarted */ ret = get_node_space(&space_size); if (space_size != 0) { sys->disk_space = space_size; goto out; } /* User has specified the space at startup */ if (sys->disk_space) { ret = set_node_space(sys->disk_space); goto out; } if (mds) { sys->disk_space = mds; } else { ret = statvfs(base_path, &fs); if (ret < 0) { sd_dprintf("get disk space failed %m"); ret = SD_RES_EIO; goto out; } sys->disk_space = (uint64_t)fs.f_frsize * fs.f_bfree; } ret = set_node_space(sys->disk_space); out: sd_dprintf("disk free space is %" PRIu64, sys->disk_space); return ret; }