Block layer patches for 2.10.0-rc3

-----BEGIN PGP SIGNATURE-----
 
 iQIcBAABAgAGBQJZjbkSAAoJEH8JsnLIjy/W+ToP/joNaKOL3cC4oLWA6EkE7exi
 PftHRGxGv9W56YZrfKrQ2eKr1uxWXh9mcvshhkerTEoppdZeNru/8OSoo+huYRqA
 7arH+gGMNCTa9kelSreiUfUTqc05cCBWsSatDAEbiCn6MeZQvRjP5t2YNcjdqjdh
 n2d7CB1hBXdYUH51SG/5EBpIHckBSE4cnbB/Cdq59AYISyqLqytaNAr94q9gikqC
 xd4CWOL4xnd9uI4csiNdkuU2Z3IgewJZctfZZuFXYGL48s4S02ba3SQ+vrLNVQb6
 xplKMPCfXKeNIeJLO1LVeb6io7Egws3wq6rivCbzBEoRDMHvnlH3+0Dc+cagRu1A
 Tn04fXZNxAwHYQD47Q+RSw6iaSpTBlWeedeclDxNt2uUBkybQxvzYuCt77JFH6VO
 4Ju1puIwpDxA5+34i4a0C/SKtpqnltNi8ET1JBoeLeoun+gaNQRDOIEHoqqNX/mO
 tF/ytyklEntBCQhgP0ZOLqfwJxhGPqD41u45suKI0bFh7D2GBVOxKKTmu7R+khGj
 Uhs56kN9bz4RQe6LTWA4DSeo6oqMHzRSozQg0uCV3yWN1UypPAf+O/tJMCp5Szkk
 JbbX483SZP4AQtN47OPyzMufkbXy0WM0MYW+dI4/5kTEQx4GKuTMy1Wix7zTmRRt
 1siqBWvFW9Ct6BRMoTND
 =FH4q
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging

Block layer patches for 2.10.0-rc3

# gpg: Signature made Fri 11 Aug 2017 15:02:58 BST
# gpg:                using RSA key 0x7F09B272C88F2FD6
# gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>"
# Primary key fingerprint: DC3D EB15 9A9A F95D 3D74  56FE 7F09 B272 C88F 2FD6

* remotes/kevin/tags/for-upstream:
  qemu-iotests: fix 185
  file-posix: Do runtime check for ofd lock API
  osdep: Add runtime OFD lock detection
  qcow2: Check failure of bdrv_getlength()
  qcow2: Drop debugging dump_refcounts()
  vpc: Check failure of bdrv_getlength()
  tests/multiboot: Fix whitespace failure

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2017-08-11 15:11:50 +01:00
commit 9db6ffc766
7 changed files with 82 additions and 45 deletions

View file

@ -457,22 +457,19 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
switch (locking) {
case ON_OFF_AUTO_ON:
s->use_lock = true;
#ifndef F_OFD_SETLK
fprintf(stderr,
"File lock requested but OFD locking syscall is unavailable, "
"falling back to POSIX file locks.\n"
"Due to the implementation, locks can be lost unexpectedly.\n");
#endif
if (!qemu_has_ofd_lock()) {
fprintf(stderr,
"File lock requested but OFD locking syscall is "
"unavailable, falling back to POSIX file locks.\n"
"Due to the implementation, locks can be lost "
"unexpectedly.\n");
}
break;
case ON_OFF_AUTO_OFF:
s->use_lock = false;
break;
case ON_OFF_AUTO_AUTO:
#ifdef F_OFD_SETLK
s->use_lock = true;
#else
s->use_lock = false;
#endif
s->use_lock = qemu_has_ofd_lock();
break;
default:
abort();

View file

@ -3282,12 +3282,15 @@ qcow2_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset,
z_stream strm;
int ret, out_len;
uint8_t *buf, *out_buf;
uint64_t cluster_offset;
int64_t cluster_offset;
if (bytes == 0) {
/* align end of file to a sector boundary to ease reading with
sector based I/Os */
cluster_offset = bdrv_getlength(bs->file->bs);
if (cluster_offset < 0) {
return cluster_offset;
}
return bdrv_truncate(bs->file, cluster_offset, PREALLOC_MODE_OFF, NULL);
}
@ -3798,27 +3801,6 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
return spec_info;
}
#if 0
static void dump_refcounts(BlockDriverState *bs)
{
BDRVQcow2State *s = bs->opaque;
int64_t nb_clusters, k, k1, size;
int refcount;
size = bdrv_getlength(bs->file->bs);
nb_clusters = size_to_clusters(s, size);
for(k = 0; k < nb_clusters;) {
k1 = k;
refcount = get_refcount(bs, k);
k++;
while (k < nb_clusters && get_refcount(bs, k) == refcount)
k++;
printf("%" PRId64 ": refcount=%d nb=%" PRId64 "\n", k, refcount,
k - k1);
}
}
#endif
static int qcow2_save_vmstate(BlockDriverState *bs, QEMUIOVector *qiov,
int64_t pos)
{

View file

@ -219,6 +219,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
uint64_t pagetable_size;
int disk_type = VHD_DYNAMIC;
int ret;
int64_t bs_size;
bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
false, errp);
@ -411,7 +412,13 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
}
}
if (s->free_data_block_offset > bdrv_getlength(bs->file->bs)) {
bs_size = bdrv_getlength(bs->file->bs);
if (bs_size < 0) {
error_setg_errno(errp, -bs_size, "Unable to learn image size");
ret = bs_size;
goto fail;
}
if (s->free_data_block_offset > bs_size) {
error_setg(errp, "block-vpc: free_data_block_offset points after "
"the end of file. The image has been truncated.");
ret = -EINVAL;

View file

@ -357,6 +357,7 @@ int qemu_dup(int fd);
int qemu_lock_fd(int fd, int64_t start, int64_t len, bool exclusive);
int qemu_unlock_fd(int fd, int64_t start, int64_t len);
int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive);
bool qemu_has_ofd_lock(void);
#if defined(__HAIKU__) && defined(__i386__)
#define FMT_pid "%ld"

View file

@ -26,7 +26,7 @@ run_qemu() {
local kernel=$1
shift
printf %b "\n\n=== Running test case: $kernel $@ ===\n\n" >> test.log
printf %b "\n\n=== Running test case: $kernel $* ===\n\n" >> test.log
$QEMU \
-kernel $kernel \

View file

@ -156,6 +156,10 @@ _send_qemu_cmd $h \
'speed': 65536 } }" \
"return"
# If we don't sleep here 'quit' command may be handled before
# the first mirror iteration is done
sleep 0.5
_send_qemu_cmd $h "{ 'execute': 'quit' }" "return"
wait=1 _cleanup_qemu

View file

@ -38,14 +38,6 @@ extern int madvise(caddr_t, size_t, int);
#include "qemu/error-report.h"
#include "monitor/monitor.h"
#ifdef F_OFD_SETLK
#define QEMU_SETLK F_OFD_SETLK
#define QEMU_GETLK F_OFD_GETLK
#else
#define QEMU_SETLK F_SETLK
#define QEMU_GETLK F_GETLK
#endif
static bool fips_enabled = false;
static const char *hw_version = QEMU_HW_VERSION;
@ -82,6 +74,10 @@ int qemu_madvise(void *addr, size_t len, int advice)
}
#ifndef _WIN32
static int fcntl_op_setlk = -1;
static int fcntl_op_getlk = -1;
/*
* Dups an fd and sets the flags
*/
@ -149,6 +145,54 @@ static int qemu_parse_fdset(const char *param)
return qemu_parse_fd(param);
}
static void qemu_probe_lock_ops(void)
{
if (fcntl_op_setlk == -1) {
#ifdef F_OFD_SETLK
int fd;
int ret;
struct flock fl = {
.l_whence = SEEK_SET,
.l_start = 0,
.l_len = 0,
.l_type = F_WRLCK,
};
fd = open("/dev/null", O_RDWR);
if (fd < 0) {
fprintf(stderr,
"Failed to open /dev/null for OFD lock probing: %s\n",
strerror(errno));
fcntl_op_setlk = F_SETLK;
fcntl_op_getlk = F_GETLK;
return;
}
ret = fcntl(fd, F_OFD_GETLK, &fl);
close(fd);
if (!ret) {
fcntl_op_setlk = F_OFD_SETLK;
fcntl_op_getlk = F_OFD_GETLK;
} else {
fcntl_op_setlk = F_SETLK;
fcntl_op_getlk = F_GETLK;
}
#else
fcntl_op_setlk = F_SETLK;
fcntl_op_getlk = F_GETLK;
#endif
}
}
bool qemu_has_ofd_lock(void)
{
qemu_probe_lock_ops();
#ifdef F_OFD_SETLK
return fcntl_op_setlk == F_OFD_SETLK;
#else
return false;
#endif
}
static int qemu_lock_fcntl(int fd, int64_t start, int64_t len, int fl_type)
{
int ret;
@ -158,7 +202,8 @@ static int qemu_lock_fcntl(int fd, int64_t start, int64_t len, int fl_type)
.l_len = len,
.l_type = fl_type,
};
ret = fcntl(fd, QEMU_SETLK, &fl);
qemu_probe_lock_ops();
ret = fcntl(fd, fcntl_op_setlk, &fl);
return ret == -1 ? -errno : 0;
}
@ -181,7 +226,8 @@ int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive)
.l_len = len,
.l_type = exclusive ? F_WRLCK : F_RDLCK,
};
ret = fcntl(fd, QEMU_GETLK, &fl);
qemu_probe_lock_ops();
ret = fcntl(fd, fcntl_op_getlk, &fl);
if (ret == -1) {
return -errno;
} else {