block: Deprecate bdrv_set_read_only() and users
bdrv_set_read_only() is used by some block drivers to override the read-only option given by the user. This is not how read-only images generally work in QEMU: Instead of second guessing what the user really meant (which currently includes making an image read-only even if the user didn't only use the default, but explicitly said read-only=off), we should error out if we can't provide what the user requested. This adds deprecation warnings to all callers of bdrv_set_read_only() so that the behaviour can be corrected after the usual deprecation period. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									f66afbe26f
								
							
						
					
					
						commit
						398e6ad014
					
				
							
								
								
									
										5
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								block.c
									
									
									
									
									
								
							@ -261,6 +261,11 @@ int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TODO Remove (deprecated since 2.11)
 | 
				
			||||||
 | 
					 * Block drivers are not supposed to automatically change bs->read_only.
 | 
				
			||||||
 | 
					 * Instead, they should just check whether they can provide what the user
 | 
				
			||||||
 | 
					 * explicitly requested and error out if read-write is requested, but they can
 | 
				
			||||||
 | 
					 * only provide read-only access. */
 | 
				
			||||||
int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
 | 
					int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = 0;
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -28,6 +28,7 @@
 | 
				
			|||||||
#include "block/block_int.h"
 | 
					#include "block/block_int.h"
 | 
				
			||||||
#include "qemu/module.h"
 | 
					#include "qemu/module.h"
 | 
				
			||||||
#include "qemu/bswap.h"
 | 
					#include "qemu/bswap.h"
 | 
				
			||||||
 | 
					#include "qemu/error-report.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**************************************************************/
 | 
					/**************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -110,9 +111,15 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
 | 
				
			|||||||
        return -EINVAL;
 | 
					        return -EINVAL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = bdrv_set_read_only(bs, true, errp); /* no write support yet */
 | 
					    if (!bdrv_is_read_only(bs)) {
 | 
				
			||||||
    if (ret < 0) {
 | 
					        error_report("Opening bochs images without an explicit read-only=on "
 | 
				
			||||||
        return ret;
 | 
					                     "option is deprecated. Future versions will refuse to "
 | 
				
			||||||
 | 
					                     "open the image instead of automatically marking the "
 | 
				
			||||||
 | 
					                     "image read-only.");
 | 
				
			||||||
 | 
					        ret = bdrv_set_read_only(bs, true, errp); /* no write support yet */
 | 
				
			||||||
 | 
					        if (ret < 0) {
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
 | 
					    ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
#include "qemu/osdep.h"
 | 
					#include "qemu/osdep.h"
 | 
				
			||||||
#include "qapi/error.h"
 | 
					#include "qapi/error.h"
 | 
				
			||||||
 | 
					#include "qemu/error-report.h"
 | 
				
			||||||
#include "qemu-common.h"
 | 
					#include "qemu-common.h"
 | 
				
			||||||
#include "block/block_int.h"
 | 
					#include "block/block_int.h"
 | 
				
			||||||
#include "qemu/module.h"
 | 
					#include "qemu/module.h"
 | 
				
			||||||
@ -72,9 +73,15 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
 | 
				
			|||||||
        return -EINVAL;
 | 
					        return -EINVAL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = bdrv_set_read_only(bs, true, errp);
 | 
					    if (!bdrv_is_read_only(bs)) {
 | 
				
			||||||
    if (ret < 0) {
 | 
					        error_report("Opening cloop images without an explicit read-only=on "
 | 
				
			||||||
        return ret;
 | 
					                     "option is deprecated. Future versions will refuse to "
 | 
				
			||||||
 | 
					                     "open the image instead of automatically marking the "
 | 
				
			||||||
 | 
					                     "image read-only.");
 | 
				
			||||||
 | 
					        ret = bdrv_set_read_only(bs, true, errp);
 | 
				
			||||||
 | 
					        if (ret < 0) {
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* read header */
 | 
					    /* read header */
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								block/dmg.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								block/dmg.c
									
									
									
									
									
								
							@ -419,9 +419,15 @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
 | 
				
			|||||||
        return -EINVAL;
 | 
					        return -EINVAL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = bdrv_set_read_only(bs, true, errp);
 | 
					    if (!bdrv_is_read_only(bs)) {
 | 
				
			||||||
    if (ret < 0) {
 | 
					        error_report("Opening dmg images without an explicit read-only=on "
 | 
				
			||||||
        return ret;
 | 
					                     "option is deprecated. Future versions will refuse to "
 | 
				
			||||||
 | 
					                     "open the image instead of automatically marking the "
 | 
				
			||||||
 | 
					                     "image read-only.");
 | 
				
			||||||
 | 
					        ret = bdrv_set_read_only(bs, true, errp);
 | 
				
			||||||
 | 
					        if (ret < 0) {
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    block_module_load_one("dmg-bz2");
 | 
					    block_module_load_one("dmg-bz2");
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								block/rbd.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								block/rbd.c
									
									
									
									
									
								
							@ -665,10 +665,16 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
 | 
				
			|||||||
    /* If we are using an rbd snapshot, we must be r/o, otherwise
 | 
					    /* If we are using an rbd snapshot, we must be r/o, otherwise
 | 
				
			||||||
     * leave as-is */
 | 
					     * leave as-is */
 | 
				
			||||||
    if (s->snap != NULL) {
 | 
					    if (s->snap != NULL) {
 | 
				
			||||||
        r = bdrv_set_read_only(bs, true, &local_err);
 | 
					        if (!bdrv_is_read_only(bs)) {
 | 
				
			||||||
        if (r < 0) {
 | 
					            error_report("Opening rbd snapshots without an explicit "
 | 
				
			||||||
            error_propagate(errp, local_err);
 | 
					                         "read-only=on option is deprecated. Future versions "
 | 
				
			||||||
            goto failed_open;
 | 
					                         "will refuse to open the image instead of "
 | 
				
			||||||
 | 
					                         "automatically marking the image read-only.");
 | 
				
			||||||
 | 
					            r = bdrv_set_read_only(bs, true, &local_err);
 | 
				
			||||||
 | 
					            if (r < 0) {
 | 
				
			||||||
 | 
					                error_propagate(errp, local_err);
 | 
				
			||||||
 | 
					                goto failed_open;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1259,7 +1259,11 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
 | 
				
			|||||||
                       "Unable to set VVFAT to 'rw' when drive is read-only");
 | 
					                       "Unable to set VVFAT to 'rw' when drive is read-only");
 | 
				
			||||||
            goto fail;
 | 
					            goto fail;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else  {
 | 
					    } else  if (!bdrv_is_read_only(bs)) {
 | 
				
			||||||
 | 
					        error_report("Opening non-rw vvfat images without an explicit "
 | 
				
			||||||
 | 
					                     "read-only=on option is deprecated. Future versions "
 | 
				
			||||||
 | 
					                     "will refuse to open the image instead of "
 | 
				
			||||||
 | 
					                     "automatically marking the image read-only.");
 | 
				
			||||||
        /* read only is the default for safety */
 | 
					        /* read only is the default for safety */
 | 
				
			||||||
        ret = bdrv_set_read_only(bs, true, &local_err);
 | 
					        ret = bdrv_set_read_only(bs, true, &local_err);
 | 
				
			||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
 | 
				
			|||||||
@ -3134,8 +3134,11 @@
 | 
				
			|||||||
#                 This option is required on the top level of blockdev-add.
 | 
					#                 This option is required on the top level of blockdev-add.
 | 
				
			||||||
# @discard:       discard-related options (default: ignore)
 | 
					# @discard:       discard-related options (default: ignore)
 | 
				
			||||||
# @cache:         cache-related options
 | 
					# @cache:         cache-related options
 | 
				
			||||||
# @read-only:     whether the block device should be read-only
 | 
					# @read-only:     whether the block device should be read-only (default: false).
 | 
				
			||||||
#                 (default: false)
 | 
					#                 Note that some block drivers support only read-only access,
 | 
				
			||||||
 | 
					#                 either generally or in certain configurations. In this case,
 | 
				
			||||||
 | 
					#                 the default value does not work and the option must be
 | 
				
			||||||
 | 
					#                 specified explicitly.
 | 
				
			||||||
# @detect-zeroes: detect and optimize zero writes (Since 2.1)
 | 
					# @detect-zeroes: detect and optimize zero writes (Since 2.1)
 | 
				
			||||||
#                 (default: off)
 | 
					#                 (default: off)
 | 
				
			||||||
# @force-share:   force share all permission on added nodes.
 | 
					# @force-share:   force share all permission on added nodes.
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user