Commit 70240ca680aa7e9363ffbb784cf64907060f853e
1 parent
fc197934
Revert r6407
This series is broken by design as it requires expensive IO operations at open time causing very long delays when starting a virtual machine for the first time. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6813 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
10 additions
and
32 deletions
block-qcow2.c
| @@ -145,7 +145,6 @@ typedef struct BDRVQcowState { | @@ -145,7 +145,6 @@ typedef struct BDRVQcowState { | ||
| 145 | AES_KEY aes_decrypt_key; | 145 | AES_KEY aes_decrypt_key; |
| 146 | 146 | ||
| 147 | int64_t highest_alloc; /* highest cluester allocated (in clusters) */ | 147 | int64_t highest_alloc; /* highest cluester allocated (in clusters) */ |
| 148 | - int64_t nc_free; /* num of free clusters below highest_alloc */ | ||
| 149 | 148 | ||
| 150 | uint64_t snapshots_offset; | 149 | uint64_t snapshots_offset; |
| 151 | int snapshots_size; | 150 | int snapshots_size; |
| @@ -174,7 +173,7 @@ static void free_clusters(BlockDriverState *bs, | @@ -174,7 +173,7 @@ static void free_clusters(BlockDriverState *bs, | ||
| 174 | #ifdef DEBUG_ALLOC | 173 | #ifdef DEBUG_ALLOC |
| 175 | static void check_refcounts(BlockDriverState *bs); | 174 | static void check_refcounts(BlockDriverState *bs); |
| 176 | #endif | 175 | #endif |
| 177 | -static void scan_refcount(BlockDriverState *bs, int64_t *high, int64_t *free); | 176 | +static void scan_refcount(BlockDriverState *bs, int64_t *high); |
| 178 | 177 | ||
| 179 | 178 | ||
| 180 | static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename) | 179 | static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename) |
| @@ -276,7 +275,7 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags) | @@ -276,7 +275,7 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags) | ||
| 276 | if (refcount_init(bs) < 0) | 275 | if (refcount_init(bs) < 0) |
| 277 | goto fail; | 276 | goto fail; |
| 278 | 277 | ||
| 279 | - scan_refcount(bs, &s->highest_alloc, &s->nc_free); | 278 | + scan_refcount(bs, &s->highest_alloc); |
| 280 | 279 | ||
| 281 | /* read the backing file name */ | 280 | /* read the backing file name */ |
| 282 | if (header.backing_file_offset != 0) { | 281 | if (header.backing_file_offset != 0) { |
| @@ -1647,7 +1646,6 @@ static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) | @@ -1647,7 +1646,6 @@ static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi) | ||
| 1647 | bdi->vm_state_offset = (int64_t)s->l1_vm_state_index << | 1646 | bdi->vm_state_offset = (int64_t)s->l1_vm_state_index << |
| 1648 | (s->cluster_bits + s->l2_bits); | 1647 | (s->cluster_bits + s->l2_bits); |
| 1649 | bdi->highest_alloc = s->highest_alloc << s->cluster_bits; | 1648 | bdi->highest_alloc = s->highest_alloc << s->cluster_bits; |
| 1650 | - bdi->num_free_bytes = s->nc_free << s->cluster_bits; | ||
| 1651 | return 0; | 1649 | return 0; |
| 1652 | } | 1650 | } |
| 1653 | 1651 | ||
| @@ -2166,35 +2164,25 @@ static int load_refcount_block(BlockDriverState *bs, | @@ -2166,35 +2164,25 @@ static int load_refcount_block(BlockDriverState *bs, | ||
| 2166 | return 0; | 2164 | return 0; |
| 2167 | } | 2165 | } |
| 2168 | 2166 | ||
| 2169 | -static void scan_refcount(BlockDriverState *bs, int64_t *high, int64_t *free) | 2167 | +static void scan_refcount(BlockDriverState *bs, int64_t *high) |
| 2170 | { | 2168 | { |
| 2171 | BDRVQcowState *s = bs->opaque; | 2169 | BDRVQcowState *s = bs->opaque; |
| 2172 | - int64_t refcnt_index, cluster_index, cluster_end, h = 0, f = 0; | ||
| 2173 | - int64_t tail = 0; /* do not count last consecutive free entries */ | 2170 | + int64_t refcnt_index, cluster_index, cluster_end, h = 0; |
| 2174 | 2171 | ||
| 2175 | for (refcnt_index=0; refcnt_index < s->refcount_table_size; refcnt_index++){ | 2172 | for (refcnt_index=0; refcnt_index < s->refcount_table_size; refcnt_index++){ |
| 2176 | if (s->refcount_table[refcnt_index] == 0) { | 2173 | if (s->refcount_table[refcnt_index] == 0) { |
| 2177 | - f += 1 << (s->cluster_bits - REFCOUNT_SHIFT); | ||
| 2178 | - tail += 1 << (s->cluster_bits - REFCOUNT_SHIFT); | ||
| 2179 | continue; | 2174 | continue; |
| 2180 | } | 2175 | } |
| 2181 | cluster_index = refcnt_index << (s->cluster_bits - REFCOUNT_SHIFT); | 2176 | cluster_index = refcnt_index << (s->cluster_bits - REFCOUNT_SHIFT); |
| 2182 | cluster_end = (refcnt_index + 1) << (s->cluster_bits - REFCOUNT_SHIFT); | 2177 | cluster_end = (refcnt_index + 1) << (s->cluster_bits - REFCOUNT_SHIFT); |
| 2183 | for ( ; cluster_index < cluster_end; cluster_index++) { | 2178 | for ( ; cluster_index < cluster_end; cluster_index++) { |
| 2184 | - if (get_refcount(bs, cluster_index) == 0) { | ||
| 2185 | - f++; | ||
| 2186 | - tail++; | ||
| 2187 | - } | ||
| 2188 | - else { | 2179 | + if (get_refcount(bs, cluster_index) == 0) |
| 2180 | + /* do nothing -- reserved for free counting */; | ||
| 2181 | + else | ||
| 2189 | h = cluster_index; | 2182 | h = cluster_index; |
| 2190 | - tail = 0; | ||
| 2191 | - } | ||
| 2192 | } | 2183 | } |
| 2193 | } | 2184 | } |
| 2194 | 2185 | ||
| 2195 | - f -= tail; | ||
| 2196 | - if (free) | ||
| 2197 | - *free = f; | ||
| 2198 | if (high) | 2186 | if (high) |
| 2199 | *high = (h+1); | 2187 | *high = (h+1); |
| 2200 | } | 2188 | } |
| @@ -2240,10 +2228,8 @@ retry: | @@ -2240,10 +2228,8 @@ retry: | ||
| 2240 | (s->free_cluster_index - nb_clusters) << s->cluster_bits); | 2228 | (s->free_cluster_index - nb_clusters) << s->cluster_bits); |
| 2241 | #endif | 2229 | #endif |
| 2242 | 2230 | ||
| 2243 | - if (s->highest_alloc < s->free_cluster_index) { | ||
| 2244 | - s->nc_free += (s->free_cluster_index - s->highest_alloc); | 2231 | + if (s->highest_alloc < s->free_cluster_index) |
| 2245 | s->highest_alloc = s->free_cluster_index; | 2232 | s->highest_alloc = s->free_cluster_index; |
| 2246 | - } | ||
| 2247 | 2233 | ||
| 2248 | return (s->free_cluster_index - nb_clusters) << s->cluster_bits; | 2234 | return (s->free_cluster_index - nb_clusters) << s->cluster_bits; |
| 2249 | } | 2235 | } |
| @@ -2418,12 +2404,6 @@ static int update_cluster_refcount(BlockDriverState *bs, | @@ -2418,12 +2404,6 @@ static int update_cluster_refcount(BlockDriverState *bs, | ||
| 2418 | block_index = cluster_index & | 2404 | block_index = cluster_index & |
| 2419 | ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1); | 2405 | ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1); |
| 2420 | refcount = be16_to_cpu(s->refcount_block_cache[block_index]); | 2406 | refcount = be16_to_cpu(s->refcount_block_cache[block_index]); |
| 2421 | - | ||
| 2422 | - if (refcount == 1 && addend == -1) | ||
| 2423 | - s->nc_free += 1; | ||
| 2424 | - else if (refcount == 0 && addend == 1) | ||
| 2425 | - s->nc_free -= 1; | ||
| 2426 | - | ||
| 2427 | refcount += addend; | 2407 | refcount += addend; |
| 2428 | if (refcount < 0 || refcount > 0xffff) | 2408 | if (refcount < 0 || refcount > 0xffff) |
| 2429 | return -EINVAL; | 2409 | return -EINVAL; |
block.c
| @@ -1153,9 +1153,8 @@ void bdrv_info_stats(Monitor *mon) | @@ -1153,9 +1153,8 @@ void bdrv_info_stats(Monitor *mon) | ||
| 1153 | bs->rd_bytes, bs->wr_bytes, | 1153 | bs->rd_bytes, bs->wr_bytes, |
| 1154 | bs->rd_ops, bs->wr_ops); | 1154 | bs->rd_ops, bs->wr_ops); |
| 1155 | if (bdrv_get_info(bs, &bdi) == 0) | 1155 | if (bdrv_get_info(bs, &bdi) == 0) |
| 1156 | - monitor_printf(mon, " high=%" PRId64 | ||
| 1157 | - " bytes_free=%" PRId64, | ||
| 1158 | - bdi.highest_alloc, bdi.num_free_bytes); | 1156 | + monitor_printf(mon, " high=%" PRId64, |
| 1157 | + bdi.highest_alloc); | ||
| 1159 | monitor_printf(mon, "\n"); | 1158 | monitor_printf(mon, "\n"); |
| 1160 | } | 1159 | } |
| 1161 | } | 1160 | } |
block.h
| @@ -27,7 +27,6 @@ typedef struct BlockDriverInfo { | @@ -27,7 +27,6 @@ typedef struct BlockDriverInfo { | ||
| 27 | /* offset at which the VM state can be saved (0 if not possible) */ | 27 | /* offset at which the VM state can be saved (0 if not possible) */ |
| 28 | int64_t vm_state_offset; | 28 | int64_t vm_state_offset; |
| 29 | int64_t highest_alloc; /* highest allocated block offset (in bytes) */ | 29 | int64_t highest_alloc; /* highest allocated block offset (in bytes) */ |
| 30 | - int64_t num_free_bytes; /* below highest_alloc */ | ||
| 31 | } BlockDriverInfo; | 30 | } BlockDriverInfo; |
| 32 | 31 | ||
| 33 | typedef struct QEMUSnapshotInfo { | 32 | typedef struct QEMUSnapshotInfo { |