Re: [Nbd] [PATCH] nbd: use loff_t for blocksize and nbd_set_size args
On 12/02/2016 02:19 PM, Josef Bacik wrote: > If we have large devices (say like the 40t drive I was trying to test with) we > will end up overflowing the int arguments to nbd_set_size and not get the > right > size for our device. Fix this by using loff_t everywhere so I don't have to > think about this again. Thanks, Added, thanks Josef. -- Jens Axboe -- Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot ___ Nbd-general mailing list Nbd-general@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/nbd-general
[Nbd] [PATCH] nbd: use loff_t for blocksize and nbd_set_size args
If we have large devices (say like the 40t drive I was trying to test with) we will end up overflowing the int arguments to nbd_set_size and not get the right size for our device. Fix this by using loff_t everywhere so I don't have to think about this again. Thanks, Signed-off-by: Josef Bacik--- drivers/block/nbd.c | 8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index dc722a7..92f5400 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -64,7 +64,7 @@ struct nbd_device { int num_connections; atomic_t recv_threads; wait_queue_head_t recv_wq; - int blksize; + loff_t blksize; loff_t bytesize; struct task_struct *task_recv; @@ -134,7 +134,7 @@ static void nbd_size_update(struct nbd_device *nbd, struct block_device *bdev) } static int nbd_size_set(struct nbd_device *nbd, struct block_device *bdev, - int blocksize, int nr_blocks) + loff_t blocksize, loff_t nr_blocks) { int ret; @@ -143,7 +143,7 @@ static int nbd_size_set(struct nbd_device *nbd, struct block_device *bdev, return ret; nbd->blksize = blocksize; - nbd->bytesize = (loff_t)blocksize * (loff_t)nr_blocks; + nbd->bytesize = blocksize * nr_blocks; nbd_size_update(nbd, bdev); @@ -930,7 +930,7 @@ static int nbd_dev_dbg_init(struct nbd_device *nbd) debugfs_create_file("tasks", 0444, dir, nbd, _dbg_tasks_ops); debugfs_create_u64("size_bytes", 0444, dir, >bytesize); debugfs_create_u32("timeout", 0444, dir, >tag_set.timeout); - debugfs_create_u32("blocksize", 0444, dir, >blksize); + debugfs_create_u64("blocksize", 0444, dir, >blksize); debugfs_create_file("flags", 0444, dir, nbd, _dbg_flags_ops); return 0; -- 2.5.5 -- Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot ___ Nbd-general mailing list Nbd-general@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/nbd-general
Re: [Nbd] [Qemu-devel] [PATCH v3] doc: Add NBD_CMD_BLOCK_STATUS extension
On 12/02/2016 01:45 PM, Alex Bligh wrote: > John, > >>> +Some storage formats and operations over such formats express a >>> +concept of data dirtiness. Whether the operation is block device >>> +mirroring, incremental block device backup or any other operation with >>> +a concept of data dirtiness, they all share a need to provide a list >>> +of ranges that this particular operation treats as dirty. >>> >>> How can data be 'dirty' if it is static and unchangeable? (I thought) >>> >> >> In a simple case, live IO goes to e.g. hda.qcow2. These writes come from >> the VM and cause the bitmap that QEMU manages to become dirty. >> >> We intend to expose the ability to fleece dirty blocks via NBD. What >> happens in this scenario would be that a snapshot of the data at the >> time of the request is exported over NBD in a read-only manner. >> >> In this way, the drive itself is R/W, but the "view" of it from NBD is >> RO. While a hypothetical backup client is busy copying data out of this >> temporary view, new writes are coming in to the drive, but are not being >> exposed through the NBD export. >> >> (This goes into QEMU-specifics, but those new writes are dirtying a >> version of the bitmap not intended to be exposed via the NBD channel. >> NBD gets effectively a snapshot of both the bitmap AND the data.) > > Thanks. That makes sense - or enough sense for me to carry on commenting! > Whew! I'm glad. >>> I now think what you are talking about backing up a *snapshot* of a disk >>> that's running, where the disk itself was not connected using NBD? IE it's >>> not being 'made dirty' by NBD_CMD_WRITE etc. Rather 'dirtiness' is >>> effectively >>> an opaque state represented in a bitmap, which is binary metadata >>> at some particular level of granularity. It might as well be 'happiness' >>> or 'is coloured blue'. The NBD server would (normally) have no way of >>> manipulating this bitmap. >>> >>> In previous comments, I said 'how come we can set the dirty bit through >>> writes but can't clear it?'. This (my statement) is now I think wrong, >>> as NBD_CMD_WRITE etc. is not defined to set the dirty bit. The >>> state of the bitmap comes from whatever sets the bitmap which is outside >>> the scope of this protocol to transmit it. >>> >> >> You know, this is a fair point. We have not (to my knowledge) yet >> carefully considered the exact bitmap management scenario when NBD is >> involved in retrieving dirty blocks. >> >> Humor me for a moment while I talk about a (completely hypothetical, not >> yet fully discussed) workflow for how I envision this feature. >> >> (1) User sets up a drive in QEMU, a bitmap is initialized, an initial >> backup is made, etc. >> >> (2) As writes come in, QEMU's bitmap is dirtied. >> >> (3) The user decides they want to root around to see what data has >> changed and would like to use NBD to do so, in contrast to QEMU's own >> facilities for dumping dirty blocks. >> >> (4) A command is issued that creates a temporary, lightweight snapshot >> ('fleecing') and exports this snapshot over NBD. The bitmap is >> associated with the NBD export at this point at NBD server startup. (For >> the sake of QEMU discussion, maybe this command is "blockdev-fleece") >> >> (5) At this moment, the snapshot is static and represents the data at >> the time the NBD server was started. The bitmap is also forked and >> represents only this snapshot. The live data and bitmap continue to change. >> >> (6) Dirty blocks are queried and copied out via NBD. >> >> (7) The user closes the NBD instance upon completion of their task, >> whatever it was. (Making a new incremental backup? Just taking a peek at >> some changed data? who knows.) >> >> The point that's interesting here is what do we do with the two bitmaps >> at this point? The data delta can be discarded (this was after all just >> a lightweight read-only point-in-time snapshot) but the bitmap data >> needs to be dealt with. >> >> (A) In the case of "User made a new incremental backup," the bitmap that >> got forked off to serve the NBD read should be discarded. >> >> (B) In the case of "User just wanted to look around," the bitmap should >> be merged back into the bitmap it was forked from. >> >> I don't advise a hybrid where "User copied some data, but not all" where >> we need to partially clear *and* merge, but conceivably this could >> happen, because the things we don't want to happen always will. >> >> At this point maybe it's becoming obvious that actually it would be very >> prudent to allow the NBD client itself to inform QEMU via the NBD >> protocol which extents/blocks/(etc) that it is "done" with. >> >> Maybe it *would* actually be useful if, in NBD allowing us to add a >> "dirty" bit to the specification, we allow users to clear those bits. >> >> Then, whether the user was trying to do (A) or (B) or the unspeakable >> amalgamation of both things, it's up to the user to clear the bits >> desired and QEMU can do the simple task of simply
Re: [Nbd] [Qemu-devel] [PATCH v3] doc: Add NBD_CMD_BLOCK_STATUS extension
John, >> +Some storage formats and operations over such formats express a >> +concept of data dirtiness. Whether the operation is block device >> +mirroring, incremental block device backup or any other operation with >> +a concept of data dirtiness, they all share a need to provide a list >> +of ranges that this particular operation treats as dirty. >> >> How can data be 'dirty' if it is static and unchangeable? (I thought) >> > > In a simple case, live IO goes to e.g. hda.qcow2. These writes come from > the VM and cause the bitmap that QEMU manages to become dirty. > > We intend to expose the ability to fleece dirty blocks via NBD. What > happens in this scenario would be that a snapshot of the data at the > time of the request is exported over NBD in a read-only manner. > > In this way, the drive itself is R/W, but the "view" of it from NBD is > RO. While a hypothetical backup client is busy copying data out of this > temporary view, new writes are coming in to the drive, but are not being > exposed through the NBD export. > > (This goes into QEMU-specifics, but those new writes are dirtying a > version of the bitmap not intended to be exposed via the NBD channel. > NBD gets effectively a snapshot of both the bitmap AND the data.) Thanks. That makes sense - or enough sense for me to carry on commenting! >> I now think what you are talking about backing up a *snapshot* of a disk >> that's running, where the disk itself was not connected using NBD? IE it's >> not being 'made dirty' by NBD_CMD_WRITE etc. Rather 'dirtiness' is >> effectively >> an opaque state represented in a bitmap, which is binary metadata >> at some particular level of granularity. It might as well be 'happiness' >> or 'is coloured blue'. The NBD server would (normally) have no way of >> manipulating this bitmap. >> >> In previous comments, I said 'how come we can set the dirty bit through >> writes but can't clear it?'. This (my statement) is now I think wrong, >> as NBD_CMD_WRITE etc. is not defined to set the dirty bit. The >> state of the bitmap comes from whatever sets the bitmap which is outside >> the scope of this protocol to transmit it. >> > > You know, this is a fair point. We have not (to my knowledge) yet > carefully considered the exact bitmap management scenario when NBD is > involved in retrieving dirty blocks. > > Humor me for a moment while I talk about a (completely hypothetical, not > yet fully discussed) workflow for how I envision this feature. > > (1) User sets up a drive in QEMU, a bitmap is initialized, an initial > backup is made, etc. > > (2) As writes come in, QEMU's bitmap is dirtied. > > (3) The user decides they want to root around to see what data has > changed and would like to use NBD to do so, in contrast to QEMU's own > facilities for dumping dirty blocks. > > (4) A command is issued that creates a temporary, lightweight snapshot > ('fleecing') and exports this snapshot over NBD. The bitmap is > associated with the NBD export at this point at NBD server startup. (For > the sake of QEMU discussion, maybe this command is "blockdev-fleece") > > (5) At this moment, the snapshot is static and represents the data at > the time the NBD server was started. The bitmap is also forked and > represents only this snapshot. The live data and bitmap continue to change. > > (6) Dirty blocks are queried and copied out via NBD. > > (7) The user closes the NBD instance upon completion of their task, > whatever it was. (Making a new incremental backup? Just taking a peek at > some changed data? who knows.) > > The point that's interesting here is what do we do with the two bitmaps > at this point? The data delta can be discarded (this was after all just > a lightweight read-only point-in-time snapshot) but the bitmap data > needs to be dealt with. > > (A) In the case of "User made a new incremental backup," the bitmap that > got forked off to serve the NBD read should be discarded. > > (B) In the case of "User just wanted to look around," the bitmap should > be merged back into the bitmap it was forked from. > > I don't advise a hybrid where "User copied some data, but not all" where > we need to partially clear *and* merge, but conceivably this could > happen, because the things we don't want to happen always will. > > At this point maybe it's becoming obvious that actually it would be very > prudent to allow the NBD client itself to inform QEMU via the NBD > protocol which extents/blocks/(etc) that it is "done" with. > > Maybe it *would* actually be useful if, in NBD allowing us to add a > "dirty" bit to the specification, we allow users to clear those bits. > > Then, whether the user was trying to do (A) or (B) or the unspeakable > amalgamation of both things, it's up to the user to clear the bits > desired and QEMU can do the simple task of simply always merging the > bitmap fork upon the conclusion of the NBD fleecing exercise. > > Maybe this would allow the dirty bit to have a bit more