block: Add bdrv_(p)write_sync
Add new functions that write and flush the written data to disk immediately. This is what needs to be used for image format metadata to maintain integrity for cache=... modes that don't use O_DSYNC. (Actually, we only need barriers, and therefore the functions are defined as such, but flushes is what is implemented in this patch - we can try to change that later) Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									3b5276b5ec
								
							
						
					
					
						commit
						f08145fe16
					
				
							
								
								
									
										37
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								block.c
									
									
									
									
									
								
							@ -1010,6 +1010,43 @@ int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
 | 
				
			|||||||
    return count1;
 | 
					    return count1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Writes to the file and ensures that no writes are reordered across this
 | 
				
			||||||
 | 
					 * request (acts as a barrier)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns 0 on success, -errno in error cases.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
 | 
				
			||||||
 | 
					    const void *buf, int count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = bdrv_pwrite(bs, offset, buf, count);
 | 
				
			||||||
 | 
					    if (ret < 0) {
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* No flush needed for cache=writethrough, it uses O_DSYNC */
 | 
				
			||||||
 | 
					    if ((bs->open_flags & BDRV_O_CACHE_MASK) != 0) {
 | 
				
			||||||
 | 
					        bdrv_flush(bs);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Writes to the file and ensures that no writes are reordered across this
 | 
				
			||||||
 | 
					 * request (acts as a barrier)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns 0 on success, -errno in error cases.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int bdrv_write_sync(BlockDriverState *bs, int64_t sector_num,
 | 
				
			||||||
 | 
					    const uint8_t *buf, int nb_sectors)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return bdrv_pwrite_sync(bs, BDRV_SECTOR_SIZE * sector_num,
 | 
				
			||||||
 | 
					        buf, BDRV_SECTOR_SIZE * nb_sectors);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Truncate file to 'offset' bytes (needed only for file protocols)
 | 
					 * Truncate file to 'offset' bytes (needed only for file protocols)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								block.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								block.h
									
									
									
									
									
								
							@ -80,6 +80,10 @@ int bdrv_pread(BlockDriverState *bs, int64_t offset,
 | 
				
			|||||||
               void *buf, int count);
 | 
					               void *buf, int count);
 | 
				
			||||||
int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
 | 
					int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
 | 
				
			||||||
                const void *buf, int count);
 | 
					                const void *buf, int count);
 | 
				
			||||||
 | 
					int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
 | 
				
			||||||
 | 
					    const void *buf, int count);
 | 
				
			||||||
 | 
					int bdrv_write_sync(BlockDriverState *bs, int64_t sector_num,
 | 
				
			||||||
 | 
					    const uint8_t *buf, int nb_sectors);
 | 
				
			||||||
int bdrv_truncate(BlockDriverState *bs, int64_t offset);
 | 
					int bdrv_truncate(BlockDriverState *bs, int64_t offset);
 | 
				
			||||||
int64_t bdrv_getlength(BlockDriverState *bs);
 | 
					int64_t bdrv_getlength(BlockDriverState *bs);
 | 
				
			||||||
void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
 | 
					void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user