Re: [PULL 00/11] Block layer patches
Am 15.11.2022 um 11:21 hat Hanna Reitz geschrieben: > On 15.11.22 11:14, Kevin Wolf wrote: > > Am 15.11.2022 um 00:58 hat John Snow geschrieben: > > > On Mon, Nov 14, 2022 at 5:56 AM Kevin Wolf wrote: > > > > Am 11.11.2022 um 20:20 hat Stefan Hajnoczi geschrieben: > > > > > > Hanna Reitz (9): > > > > > >block/mirror: Do not wait for active writes > > > > > >block/mirror: Drop mirror_wait_for_any_operation() > > > > > >block/mirror: Fix NULL s->job in active writes > > > > > >iotests/151: Test that active mirror progresses > > > > > >iotests/151: Test active requests on mirror start > > > > > >block: Make bdrv_child_get_parent_aio_context I/O > > > > > >block-backend: Update ctx immediately after root > > > > > >block: Start/end drain on correct AioContext > > > > > >tests/stream-under-throttle: New test > > > > > Hi Hanna, > > > > > This test is broken, probably due to the minimum Python version: > > > > > https://gitlab.com/qemu-project/qemu/-/jobs/3311521303 > > > > This is exactly the problem I saw with running linters in a gating CI, > > > > but not during 'make check'. And of course, we're hitting it during the > > > > -rc phase now. :-( > > > I mean. I'd love to have it run in make check too. The alternative was > > > never seeing this *anywhere* ... > > What is the problem with running it in 'make check'? The additional > > dependencies? If so, can we run it automatically if the dependencies > > happen to be fulfilled and just skip it otherwise? > > > > If I have to run 'make -C python check-pipenv' manually, I can guarantee > > you that I'll forget it more often than I'll run it. > > > > > ...but I'm sorry it's taken me so long to figure out how to get this > > > stuff to work in "make check" and also from manual iotests runs > > > without adding any kind of setup that you have to manage. It's just > > > fiddly, sorry :( > > > > > > > But yes, it seems that asyncio.TimeoutError should be used instead of > > > > asyncio.exceptions.TimeoutError, and Python 3.6 has only the former. > > > > I'll fix this up and send a v2 if it fixes check-python-pipenv. > > > Hopefully this goes away when we drop 3.6. I want to, but I recall > > > there was some question about some platforms that don't support 3.7+ > > > "by default" and how annoying that was or wasn't. We're almost a year > > > out from 3.6 being EOL, so maybe after this release it's worth a crack > > > to see how painful it is to move on. > > If I understand the documentation right, asyncio.TimeoutError is what > > you should be using either way. That it happens to be a re-export from > > the internal module asyncio.exceptions seems to be more of an > > implementation detail, not the official interface. > > Oh, so I understood > https://docs.python.org/3/library/asyncio-exceptions.html wrong. I took > that to mean that as of 3.11, `asyncio.TimeoutError` is a deprecated alias > for `asyncio.exceptions.TimeoutError`, but it’s actually become an alias for > the now-built-in `TimeoutError` exception. I think. Not just "now-built-in", it has been built in before (starting from 3.3). But AIUI, asyncio used to use its own separate exception class (asyncio.TimeoutError, in some versions re-exported from the exceptions submodule) instead of the built-in one, and in 3.11 it now reuses the built-in one instead of defining a separate custom one. Kevin
Re: [PULL 00/11] Block layer patches
On 15.11.22 11:14, Kevin Wolf wrote: Am 15.11.2022 um 00:58 hat John Snow geschrieben: On Mon, Nov 14, 2022 at 5:56 AM Kevin Wolf wrote: Am 11.11.2022 um 20:20 hat Stefan Hajnoczi geschrieben: Hanna Reitz (9): block/mirror: Do not wait for active writes block/mirror: Drop mirror_wait_for_any_operation() block/mirror: Fix NULL s->job in active writes iotests/151: Test that active mirror progresses iotests/151: Test active requests on mirror start block: Make bdrv_child_get_parent_aio_context I/O block-backend: Update ctx immediately after root block: Start/end drain on correct AioContext tests/stream-under-throttle: New test Hi Hanna, This test is broken, probably due to the minimum Python version: https://gitlab.com/qemu-project/qemu/-/jobs/3311521303 This is exactly the problem I saw with running linters in a gating CI, but not during 'make check'. And of course, we're hitting it during the -rc phase now. :-( I mean. I'd love to have it run in make check too. The alternative was never seeing this *anywhere* ... What is the problem with running it in 'make check'? The additional dependencies? If so, can we run it automatically if the dependencies happen to be fulfilled and just skip it otherwise? If I have to run 'make -C python check-pipenv' manually, I can guarantee you that I'll forget it more often than I'll run it. ...but I'm sorry it's taken me so long to figure out how to get this stuff to work in "make check" and also from manual iotests runs without adding any kind of setup that you have to manage. It's just fiddly, sorry :( But yes, it seems that asyncio.TimeoutError should be used instead of asyncio.exceptions.TimeoutError, and Python 3.6 has only the former. I'll fix this up and send a v2 if it fixes check-python-pipenv. Hopefully this goes away when we drop 3.6. I want to, but I recall there was some question about some platforms that don't support 3.7+ "by default" and how annoying that was or wasn't. We're almost a year out from 3.6 being EOL, so maybe after this release it's worth a crack to see how painful it is to move on. If I understand the documentation right, asyncio.TimeoutError is what you should be using either way. That it happens to be a re-export from the internal module asyncio.exceptions seems to be more of an implementation detail, not the official interface. Oh, so I understood https://docs.python.org/3/library/asyncio-exceptions.html wrong. I took that to mean that as of 3.11, `asyncio.TimeoutError` is a deprecated alias for `asyncio.exceptions.TimeoutError`, but it’s actually become an alias for the now-built-in `TimeoutError` exception. I think. Hanna
Re: [PULL 00/11] Block layer patches
Am 15.11.2022 um 00:58 hat John Snow geschrieben: > On Mon, Nov 14, 2022 at 5:56 AM Kevin Wolf wrote: > > > > Am 11.11.2022 um 20:20 hat Stefan Hajnoczi geschrieben: > > > > Hanna Reitz (9): > > > > block/mirror: Do not wait for active writes > > > > block/mirror: Drop mirror_wait_for_any_operation() > > > > block/mirror: Fix NULL s->job in active writes > > > > iotests/151: Test that active mirror progresses > > > > iotests/151: Test active requests on mirror start > > > > block: Make bdrv_child_get_parent_aio_context I/O > > > > block-backend: Update ctx immediately after root > > > > block: Start/end drain on correct AioContext > > > > tests/stream-under-throttle: New test > > > > > > Hi Hanna, > > > This test is broken, probably due to the minimum Python version: > > > https://gitlab.com/qemu-project/qemu/-/jobs/3311521303 > > > > This is exactly the problem I saw with running linters in a gating CI, > > but not during 'make check'. And of course, we're hitting it during the > > -rc phase now. :-( > > I mean. I'd love to have it run in make check too. The alternative was > never seeing this *anywhere* ... What is the problem with running it in 'make check'? The additional dependencies? If so, can we run it automatically if the dependencies happen to be fulfilled and just skip it otherwise? If I have to run 'make -C python check-pipenv' manually, I can guarantee you that I'll forget it more often than I'll run it. > ...but I'm sorry it's taken me so long to figure out how to get this > stuff to work in "make check" and also from manual iotests runs > without adding any kind of setup that you have to manage. It's just > fiddly, sorry :( > > > > > But yes, it seems that asyncio.TimeoutError should be used instead of > > asyncio.exceptions.TimeoutError, and Python 3.6 has only the former. > > I'll fix this up and send a v2 if it fixes check-python-pipenv. > > Hopefully this goes away when we drop 3.6. I want to, but I recall > there was some question about some platforms that don't support 3.7+ > "by default" and how annoying that was or wasn't. We're almost a year > out from 3.6 being EOL, so maybe after this release it's worth a crack > to see how painful it is to move on. If I understand the documentation right, asyncio.TimeoutError is what you should be using either way. That it happens to be a re-export from the internal module asyncio.exceptions seems to be more of an implementation detail, not the official interface. Kevin
Re: [PULL 00/11] Block layer patches
Am 11.11.2022 um 20:20 hat Stefan Hajnoczi geschrieben: > > Hanna Reitz (9): > > block/mirror: Do not wait for active writes > > block/mirror: Drop mirror_wait_for_any_operation() > > block/mirror: Fix NULL s->job in active writes > > iotests/151: Test that active mirror progresses > > iotests/151: Test active requests on mirror start > > block: Make bdrv_child_get_parent_aio_context I/O > > block-backend: Update ctx immediately after root > > block: Start/end drain on correct AioContext > > tests/stream-under-throttle: New test > > Hi Hanna, > This test is broken, probably due to the minimum Python version: > https://gitlab.com/qemu-project/qemu/-/jobs/3311521303 This is exactly the problem I saw with running linters in a gating CI, but not during 'make check'. And of course, we're hitting it during the -rc phase now. :-( But yes, it seems that asyncio.TimeoutError should be used instead of asyncio.exceptions.TimeoutError, and Python 3.6 has only the former. I'll fix this up and send a v2 if it fixes check-python-pipenv. Kevin
Re: [PULL 00/11] Block layer patches
On Mon, Nov 14, 2022 at 5:56 AM Kevin Wolf wrote: > > Am 11.11.2022 um 20:20 hat Stefan Hajnoczi geschrieben: > > > Hanna Reitz (9): > > > block/mirror: Do not wait for active writes > > > block/mirror: Drop mirror_wait_for_any_operation() > > > block/mirror: Fix NULL s->job in active writes > > > iotests/151: Test that active mirror progresses > > > iotests/151: Test active requests on mirror start > > > block: Make bdrv_child_get_parent_aio_context I/O > > > block-backend: Update ctx immediately after root > > > block: Start/end drain on correct AioContext > > > tests/stream-under-throttle: New test > > > > Hi Hanna, > > This test is broken, probably due to the minimum Python version: > > https://gitlab.com/qemu-project/qemu/-/jobs/3311521303 > > This is exactly the problem I saw with running linters in a gating CI, > but not during 'make check'. And of course, we're hitting it during the > -rc phase now. :-( I mean. I'd love to have it run in make check too. The alternative was never seeing this *anywhere* ... ...but I'm sorry it's taken me so long to figure out how to get this stuff to work in "make check" and also from manual iotests runs without adding any kind of setup that you have to manage. It's just fiddly, sorry :( > > But yes, it seems that asyncio.TimeoutError should be used instead of > asyncio.exceptions.TimeoutError, and Python 3.6 has only the former. > I'll fix this up and send a v2 if it fixes check-python-pipenv. Hopefully this goes away when we drop 3.6. I want to, but I recall there was some question about some platforms that don't support 3.7+ "by default" and how annoying that was or wasn't. We're almost a year out from 3.6 being EOL, so maybe after this release it's worth a crack to see how painful it is to move on. > > Kevin >
Re: [PULL 00/11] Block layer patches
On 11.11.22 20:20, Stefan Hajnoczi wrote: On Fri, 11 Nov 2022 at 10:29, Kevin Wolf wrote: The following changes since commit 2ccad61746ca7de5dd3e25146062264387e43bd4: Merge tag 'pull-tcg-20221109' of https://gitlab.com/rth7680/qemu into staging (2022-11-09 13:26:45 -0500) are available in the Git repository at: https://repo.or.cz/qemu/kevin.git tags/for-upstream for you to fetch changes up to b04af371af685c12970ea93027dc6d8bf86265aa: tests/stream-under-throttle: New test (2022-11-11 13:02:43 +0100) Block layer patches - Fix deadlock in graph modification with iothreads - mirror: Fix non-converging cases for active mirror - qapi: Fix BlockdevOptionsNvmeIoUring @path description - blkio: Set BlockDriver::has_variable_length to false Alberto Faria (2): qapi/block-core: Fix BlockdevOptionsNvmeIoUring @path description block/blkio: Set BlockDriver::has_variable_length to false Hanna Reitz (9): block/mirror: Do not wait for active writes block/mirror: Drop mirror_wait_for_any_operation() block/mirror: Fix NULL s->job in active writes iotests/151: Test that active mirror progresses iotests/151: Test active requests on mirror start block: Make bdrv_child_get_parent_aio_context I/O block-backend: Update ctx immediately after root block: Start/end drain on correct AioContext tests/stream-under-throttle: New test Hi Hanna, This test is broken, probably due to the minimum Python version: https://gitlab.com/qemu-project/qemu/-/jobs/3311521303 :( I just took the exception name (asyncio.exceptions.TimeoutError) from the test output when a timeout occurred, seems indeed like that’s too new. I’m not entirely sure when that was introduced, and what it’s relationship to asyncio.TimeoutError is – in 3.11, the latter is an alias for the former, but I have 3.10 myself, where the documentation says both are distinct. Anyway, using either works fine here, and the existing scripts in python/qemu use asyncio.TimeoutError, so I’ve sent a v2 of the patch to do the same. (For the record, this test isn’t vital for anything, so just dropping it from the pull request seems perfectly fine to me.) Hanna
Re: [PULL 00/11] Block layer patches
On Fri, 11 Nov 2022 at 10:29, Kevin Wolf wrote: > > The following changes since commit 2ccad61746ca7de5dd3e25146062264387e43bd4: > > Merge tag 'pull-tcg-20221109' of https://gitlab.com/rth7680/qemu into > staging (2022-11-09 13:26:45 -0500) > > are available in the Git repository at: > > https://repo.or.cz/qemu/kevin.git tags/for-upstream > > for you to fetch changes up to b04af371af685c12970ea93027dc6d8bf86265aa: > > tests/stream-under-throttle: New test (2022-11-11 13:02:43 +0100) > > > Block layer patches > > - Fix deadlock in graph modification with iothreads > - mirror: Fix non-converging cases for active mirror > - qapi: Fix BlockdevOptionsNvmeIoUring @path description > - blkio: Set BlockDriver::has_variable_length to false > > > Alberto Faria (2): > qapi/block-core: Fix BlockdevOptionsNvmeIoUring @path description > block/blkio: Set BlockDriver::has_variable_length to false > > Hanna Reitz (9): > block/mirror: Do not wait for active writes > block/mirror: Drop mirror_wait_for_any_operation() > block/mirror: Fix NULL s->job in active writes > iotests/151: Test that active mirror progresses > iotests/151: Test active requests on mirror start > block: Make bdrv_child_get_parent_aio_context I/O > block-backend: Update ctx immediately after root > block: Start/end drain on correct AioContext > tests/stream-under-throttle: New test Hi Hanna, This test is broken, probably due to the minimum Python version: https://gitlab.com/qemu-project/qemu/-/jobs/3311521303 Stefan
[PULL 00/11] Block layer patches
The following changes since commit 2ccad61746ca7de5dd3e25146062264387e43bd4: Merge tag 'pull-tcg-20221109' of https://gitlab.com/rth7680/qemu into staging (2022-11-09 13:26:45 -0500) are available in the Git repository at: https://repo.or.cz/qemu/kevin.git tags/for-upstream for you to fetch changes up to b04af371af685c12970ea93027dc6d8bf86265aa: tests/stream-under-throttle: New test (2022-11-11 13:02:43 +0100) Block layer patches - Fix deadlock in graph modification with iothreads - mirror: Fix non-converging cases for active mirror - qapi: Fix BlockdevOptionsNvmeIoUring @path description - blkio: Set BlockDriver::has_variable_length to false Alberto Faria (2): qapi/block-core: Fix BlockdevOptionsNvmeIoUring @path description block/blkio: Set BlockDriver::has_variable_length to false Hanna Reitz (9): block/mirror: Do not wait for active writes block/mirror: Drop mirror_wait_for_any_operation() block/mirror: Fix NULL s->job in active writes iotests/151: Test that active mirror progresses iotests/151: Test active requests on mirror start block: Make bdrv_child_get_parent_aio_context I/O block-backend: Update ctx immediately after root block: Start/end drain on correct AioContext tests/stream-under-throttle: New test qapi/block-core.json | 2 +- include/block/block-global-state.h | 1 - include/block/block-io.h | 2 + include/block/block_int-common.h | 4 +- block.c| 2 +- block/blkio.c | 1 - block/block-backend.c | 9 +- block/io.c | 6 +- block/mirror.c | 78 --- blockjob.c | 3 +- tests/qemu-iotests/151 | 227 - tests/qemu-iotests/151.out | 4 +- tests/qemu-iotests/tests/stream-under-throttle | 121 +++ tests/qemu-iotests/tests/stream-under-throttle.out | 5 + 14 files changed, 424 insertions(+), 41 deletions(-) create mode 100755 tests/qemu-iotests/tests/stream-under-throttle create mode 100644 tests/qemu-iotests/tests/stream-under-throttle.out
Re: [PULL 00/11] Block layer patches
On Tue, 20 Jul 2021 at 16:11, Kevin Wolf wrote: > > The following changes since commit 143c2e0432859826c9e8d5b2baa307355f1a5332: > > Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2021-07-19' > into staging (2021-07-19 19:06:05 +0100) > > are available in the Git repository at: > > git://repo.or.cz/qemu/kevin.git tags/for-upstream > > for you to fetch changes up to d21471696b07f30cb00453709d055a25c1afde85: > > iotests/307: Test iothread conflict for exports (2021-07-20 16:49:50 +0200) > > > Block layer patches > > - mirror: Fix active mirror deadlock > - replication: Fix crashes due to operations on wrong BdrvChild > - configure: Add option to use driver whitelist even in tools > - vvfat: Fix crash when opening image read-write > - export: Fix crash in error path with fixed-iothread=false > > Applied, thanks. Please update the changelog at https://wiki.qemu.org/ChangeLog/6.1 for any user-visible changes. -- PMM
[PULL 00/11] Block layer patches
The following changes since commit 143c2e0432859826c9e8d5b2baa307355f1a5332: Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2021-07-19' into staging (2021-07-19 19:06:05 +0100) are available in the Git repository at: git://repo.or.cz/qemu/kevin.git tags/for-upstream for you to fetch changes up to d21471696b07f30cb00453709d055a25c1afde85: iotests/307: Test iothread conflict for exports (2021-07-20 16:49:50 +0200) Block layer patches - mirror: Fix active mirror deadlock - replication: Fix crashes due to operations on wrong BdrvChild - configure: Add option to use driver whitelist even in tools - vvfat: Fix crash when opening image read-write - export: Fix crash in error path with fixed-iothread=false Kevin Wolf (1): block: Add option to use driver whitelist even in tools Lukas Straub (4): replication: Remove s->active_disk replication: Reduce usage of s->hidden_disk and s->secondary_disk replication: Properly attach children replication: Remove workaround Max Reitz (2): block/export: Conditionally ignore set-context error iotests/307: Test iothread conflict for exports Vladimir Sementsov-Ogievskiy (4): block/mirror: set .co for active-write MirrorOp objects iotest 151: add test-case that shows active mirror dead-lock block/mirror: fix active mirror dead-lock in mirror_wait_on_conflicts block/vvfat: fix: drop backing configure | 14 +- block.c| 3 ++ block/export/export.c | 5 +- block/mirror.c | 13 ++ block/replication.c| 111 +++-- block/vvfat.c | 43 ++ meson.build| 1 + tests/qemu-iotests/151 | 54 +- tests/qemu-iotests/151.out | 4 +- tests/qemu-iotests/307 | 15 ++ tests/qemu-iotests/307.out | 8 11 files changed, 182 insertions(+), 89 deletions(-)
Re: [PULL 00/11] Block layer patches
On Mon, 15 Feb 2021 at 15:01, Kevin Wolf wrote: > > The following changes since commit 0280396a33c7210c4df5306afeab63411a41535a: > > Merge remote-tracking branch > 'remotes/stsquad/tags/pull-testing-gdbstub-150221-1' into staging (2021-02-15 > 10:13:13 +) > > are available in the Git repository at: > > git://repo.or.cz/qemu/kevin.git tags/for-upstream > > for you to fetch changes up to b248e61652e20c3353af4b0ccb90f17d76f4db21: > > monitor/qmp: Stop processing requests when shutdown is requested > (2021-02-15 15:10:14 +0100) > > > Block layer patches: > > - qemu-storage-daemon: Enable object-add > - blockjob: Fix crash with IOthread when block commit after snapshot > - monitor: Shutdown fixes > - xen-block: fix reporting of discard feature > - qcow2: Remove half-initialised image file after failed image creation > - ahci: Fix DMA direction > - iotests fixes > Applied, thanks. Please update the changelog at https://wiki.qemu.org/ChangeLog/6.0 for any user-visible changes. -- PMM
[PULL 00/11] Block layer patches
The following changes since commit 0280396a33c7210c4df5306afeab63411a41535a: Merge remote-tracking branch 'remotes/stsquad/tags/pull-testing-gdbstub-150221-1' into staging (2021-02-15 10:13:13 +) are available in the Git repository at: git://repo.or.cz/qemu/kevin.git tags/for-upstream for you to fetch changes up to b248e61652e20c3353af4b0ccb90f17d76f4db21: monitor/qmp: Stop processing requests when shutdown is requested (2021-02-15 15:10:14 +0100) Block layer patches: - qemu-storage-daemon: Enable object-add - blockjob: Fix crash with IOthread when block commit after snapshot - monitor: Shutdown fixes - xen-block: fix reporting of discard feature - qcow2: Remove half-initialised image file after failed image creation - ahci: Fix DMA direction - iotests fixes Alexander Bulekov (1): hw/ide/ahci: map cmd_fis as DMA_DIRECTION_TO_DEVICE Kevin Wolf (3): qemu-storage-daemon: Enable object-add monitor: Fix assertion failure on shutdown monitor/qmp: Stop processing requests when shutdown is requested Max Reitz (1): iotests: Consistent $IMGOPTS boundary matching Maxim Levitsky (3): crypto: luks: Fix tiny memory leak block: add bdrv_co_delete_file_noerr block: qcow2: remove the created file on initialization error Michael Qiu (1): blockjob: Fix crash with IOthread when block commit after snapshot Roger Pau Monné (1): xen-block: fix reporting of discard feature Thomas Huth (1): tests/qemu-iotests: Remove test 259 from the "auto" group include/block/block.h| 1 + block.c | 22 ++ block/crypto.c | 13 ++--- block/qcow2.c| 8 +--- blockjob.c | 8 ++-- hw/block/xen-block.c | 1 + hw/ide/ahci.c| 12 ++-- monitor/monitor.c| 25 +++-- monitor/qmp.c| 5 + storage-daemon/qemu-storage-daemon.c | 2 ++ tests/qemu-iotests/259 | 2 +- tests/qemu-iotests/common.rc | 4 +++- 12 files changed, 69 insertions(+), 34 deletions(-)
[Qemu-devel] [PULL 00/11] Block layer patches for 2.4.0-rc1
The following changes since commit f3a1b5068cea303a55e2a21a97e66d057eaae638: Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2015-07-13 13:35:51 +0100) are available in the git repository at: git://repo.or.cz/qemu/kevin.git tags/for-upstream for you to fetch changes up to e34d8f297d51b7ffa5dce72df1e45fa94cff989c: rbd: fix ceph settings precedence (2015-07-14 17:15:23 +0200) Block layer patches for 2.4.0-rc1 Christoph Hellwig (2): nvme: implement the Flush command nvme: properly report volatile write caches Josh Durgin (4): rbd: remove unused constants and fields MAINTAINERS: update email address rbd: make qemu's cache setting override any ceph setting rbd: fix ceph settings precedence Kevin Wolf (5): block: Move bdrv_attach_child() calls up the call chain block: Introduce bdrv_open_child() block: Introduce bdrv_unref_child() block: Reorder cleanups in bdrv_close() block: Fix backing file child when modifying graph MAINTAINERS | 2 +- block.c | 144 -- block/rbd.c | 64 +++-- hw/block/nvme.c | 38 +--- hw/block/nvme.h | 1 + include/block/block.h | 7 +++ include/block/block_int.h | 5 +- 7 files changed, 177 insertions(+), 84 deletions(-)
Re: [Qemu-devel] [PULL 00/11] Block layer patches for 2.4.0-rc1
On 14 July 2015 at 16:39, Kevin Wolf kw...@redhat.com wrote: The following changes since commit f3a1b5068cea303a55e2a21a97e66d057eaae638: Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2015-07-13 13:35:51 +0100) are available in the git repository at: git://repo.or.cz/qemu/kevin.git tags/for-upstream for you to fetch changes up to e34d8f297d51b7ffa5dce72df1e45fa94cff989c: rbd: fix ceph settings precedence (2015-07-14 17:15:23 +0200) Block layer patches for 2.4.0-rc1 Applied, thanks. -- PMM