)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"5d1071f8b4e1d41c02497a151098054a1f6a0347","unresolved":false,"context_lines":[{"line_number":17,"context_line":"for the changed item.  The amount of metadata contained in the COW is"},{"line_number":18,"context_line":"variable based on I/O performed on the snapshot."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This does not change the behavior of secure deletes on normal LVs."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I20e02b6c20d5ac539b5b5469e665fc986180f2e9"},{"line_number":23,"context_line":"Closes-Bug: #1191812"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAASn%2F%2FbAI%3D","line":20,"updated":"2013-09-05 05:18:10.000000000","message":"\"normal LVs\" \u003d Cinder volumes, i.e. not snapshots?","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"45af402b0c727612074efe0a6f2b1ba22e07af53","unresolved":false,"context_lines":[{"line_number":17,"context_line":"for the changed item.  The amount of metadata contained in the COW is"},{"line_number":18,"context_line":"variable based on I/O performed on the snapshot."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This does not change the behavior of secure deletes on normal LVs."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I20e02b6c20d5ac539b5b5469e665fc986180f2e9"},{"line_number":23,"context_line":"Closes-Bug: #1191812"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAASn%2F%2FYC8%3D","line":20,"in_reply_to":"AAAASn%2F%2FYDU%3D","updated":"2013-09-05 14:13:10.000000000","message":"Ok, just want to make sure we have the message as clear as possible.","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":1475,"name":"Joe Breu","email":"breu@breu.org","username":"breu"},"change_message_id":"9a585e9e09e87a2320b432fedfea3c56476a72d3","unresolved":false,"context_lines":[{"line_number":17,"context_line":"for the changed item.  The amount of metadata contained in the COW is"},{"line_number":18,"context_line":"variable based on I/O performed on the snapshot."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This does not change the behavior of secure deletes on normal LVs."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I20e02b6c20d5ac539b5b5469e665fc986180f2e9"},{"line_number":23,"context_line":"Closes-Bug: #1191812"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAASn%2F%2FYDU%3D","line":20,"in_reply_to":"AAAASn%2F%2FbAI%3D","updated":"2013-09-05 14:12:00.000000000","message":"Yes, this does not not change the behavior of zero wiping or shredding normal cinder volumes, just snapshots.  I am going to push another patch set that excludes thin provisioned LVs from vol_path mungery.","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"607fcc76387ef4735c22c97e5803ca8096eebb78","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     rackerjoe \u003cbreu@breu.org\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-09-05 09:53:52 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix secure delete for LVM snapshots"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change modifies the behaviour of the secure delete for LVM"},{"line_number":10,"context_line":"snapshots to wipe the underlying COW of the snapshot LV instead of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAASn%2F%2FPZQ%3D","line":7,"updated":"2013-09-09 13:39:52.000000000","message":"Should indicate that it only fixes it for \"thick\" LVM.  I want to be somewhat picky about these things for this patch since it will likely get a fair amount of attention with backports, etc., and we want to be as clear as possible.","commit_id":"a03ffed1b998391b18d84fc1efad76ac11f4da69"}],"cinder/volume/drivers/lvm.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"ecbe18e6e915de012616c947d2687b1c032233d6","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            # we need to clear out the volume using the -cow instead of the"},{"line_number":200,"context_line":"            # directly volume path."},{"line_number":201,"context_line":"            # bug# lp1191812"},{"line_number":202,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FbVo%3D","line":202,"updated":"2013-09-04 21:09:03.000000000","message":"We\u0027ll need to add some checking here to make sure the cow file exists.  IIRC if there is no writes to the volume from the time the snap is created this won\u0027t exist.\n\nI\u0027ll have to spin up devstack and take another look.","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":1475,"name":"Joe Breu","email":"breu@breu.org","username":"breu"},"change_message_id":"cad101bcada9c3188ec1105cc29b69051ac31ac7","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            # we need to clear out the volume using the -cow instead of the"},{"line_number":200,"context_line":"            # directly volume path."},{"line_number":201,"context_line":"            # bug# lp1191812"},{"line_number":202,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FYhE%3D","line":202,"in_reply_to":"AAAASn%2F%2FZzs%3D","updated":"2013-09-05 12:40:09.000000000","message":"You are correct.  I will add a check for the lvm type and skip if using thin","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"f6162a5cd2ee8a56a6e2f824752329af56f10927","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            # we need to clear out the volume using the -cow instead of the"},{"line_number":200,"context_line":"            # directly volume path."},{"line_number":201,"context_line":"            # bug# lp1191812"},{"line_number":202,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FbLc%3D","line":202,"in_reply_to":"AAAASn%2F%2FbVo%3D","updated":"2013-09-04 21:42:27.000000000","message":"Ahh... nope you\u0027ve got it right (via /dev/mapper)","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"5d1071f8b4e1d41c02497a151098054a1f6a0347","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            # we need to clear out the volume using the -cow instead of the"},{"line_number":200,"context_line":"            # directly volume path."},{"line_number":201,"context_line":"            # bug# lp1191812"},{"line_number":202,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FZzs%3D","line":202,"in_reply_to":"AAAASn%2F%2FbVo%3D","updated":"2013-09-05 05:18:10.000000000","message":"This code assumes this will exist for both ThinLVM and regular LVM... is that correct?","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"5d1071f8b4e1d41c02497a151098054a1f6a0347","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        size_in_g \u003d volume.get(\u0027size\u0027, volume.get(\u0027volume_size\u0027, None))"},{"line_number":207,"context_line":"        if size_in_g is None:"},{"line_number":208,"context_line":"            LOG.warning(_(\"Size for volume: %s not found, \""},{"line_number":209,"context_line":"                          \"skipping secure delete.\") % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FZyU%3D","line":206,"updated":"2013-09-05 05:18:10.000000000","message":"Is it correct to write the original Cinder volume size if writing to the COW, or can we write less to it?  (Based on the size of the COW file or similar.)","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":2556,"name":"Evan Callicoat","email":"apsu@propter.net","username":"diopter"},"change_message_id":"93df4a7e42d59816b911265521f183f10ee4f7a4","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        size_in_g \u003d volume.get(\u0027size\u0027, volume.get(\u0027volume_size\u0027, None))"},{"line_number":207,"context_line":"        if size_in_g is None:"},{"line_number":208,"context_line":"            LOG.warning(_(\"Size for volume: %s not found, \""},{"line_number":209,"context_line":"                          \"skipping secure delete.\") % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FR9U%3D","line":206,"in_reply_to":"AAAASn%2F%2FXbE%3D","updated":"2013-09-07 16:10:48.000000000","message":"When I mentioned the header, I was simply illustrating that there\u0027s a x+(y[1..n]*n) sizing equation, where the fixed header is x. We have tested this all the way up to 100% snapshot used, and the simple fact is that how this works -- regardless of datastructure specifics -- is that no matter how much you write, the CoW device can\u0027t hold more chunks than it holds.\n\nWe can\u0027t easily know how many chunks are there, but we *do* know exactly where they could start and where they could stop at maximum. Start at 0, write to $size, done. This doesn\u0027t work when writing to the logical snapshot device, but does exactly what you would expect when writing to the backing CoW device.\n\nGiven this, I can\u0027t see any reason to -1 this patch. While there might be a more efficient way to discover exactly how many chunks of exactly what sizes there are in the sizing equation, that would be more of a code change than this, which uses the exact same strategy of dd\u0027ing, just to the correct device.\n\n+1 ahoy!","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"de2b21fcd2d377be379c55e211f6694ac2994e09","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        size_in_g \u003d volume.get(\u0027size\u0027, volume.get(\u0027volume_size\u0027, None))"},{"line_number":207,"context_line":"        if size_in_g is None:"},{"line_number":208,"context_line":"            LOG.warning(_(\"Size for volume: %s not found, \""},{"line_number":209,"context_line":"                          \"skipping secure delete.\") % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FXbE%3D","line":206,"in_reply_to":"AAAASn%2F%2FXkA%3D","updated":"2013-09-05 17:15:27.000000000","message":"\u003e ...\"it\u0027s not straightforward at all.\"\n\nI\u0027ve looked at this issue a few different ways for a while now, and if there\u0027s one thing that sums it up, it\u0027d be that line. :)  The concern about trying to guess at the internal workings of LVM is understood and appreciated.\n\n\u003e \"The COW device has a header up front, then COW data chunks\"\n\nSee, this already makes me worry that maybe if the user has somehow consumed 99+% of the snapshot with real data, wiping the original volume size may not be enough to actually zap all the user data... maybe we need the original volume size plus a little more to cover the header up front, etc.  An unlikely case, but still matters for security questions like this...\n\n\nThanks for the input... let\u0027s make sure we think through this thoroughly before making any changes too quickly.","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"69f9964e40ffc3c8dd4d4636611bd500e3836503","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        size_in_g \u003d volume.get(\u0027size\u0027, volume.get(\u0027volume_size\u0027, None))"},{"line_number":207,"context_line":"        if size_in_g is None:"},{"line_number":208,"context_line":"            LOG.warning(_(\"Size for volume: %s not found, \""},{"line_number":209,"context_line":"                          \"skipping secure delete.\") % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FZwA%3D","line":206,"in_reply_to":"AAAASn%2F%2FZxc%3D","updated":"2013-09-05 05:40:36.000000000","message":"+1","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":1475,"name":"Joe Breu","email":"breu@breu.org","username":"breu"},"change_message_id":"cad101bcada9c3188ec1105cc29b69051ac31ac7","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        size_in_g \u003d volume.get(\u0027size\u0027, volume.get(\u0027volume_size\u0027, None))"},{"line_number":207,"context_line":"        if size_in_g is None:"},{"line_number":208,"context_line":"            LOG.warning(_(\"Size for volume: %s not found, \""},{"line_number":209,"context_line":"                          \"skipping secure delete.\") % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FYeg%3D","line":206,"in_reply_to":"AAAASn%2F%2FZxc%3D","updated":"2013-09-05 12:40:09.000000000","message":"AFAIK we currently create the snapshot without specifying the size of the snapshot so it defaults to using the same size as the original.  Correct me if I am wrong.","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":2556,"name":"Evan Callicoat","email":"apsu@propter.net","username":"diopter"},"change_message_id":"e21afb8005368a8aafe21a7020c4c1b15e665682","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        size_in_g \u003d volume.get(\u0027size\u0027, volume.get(\u0027volume_size\u0027, None))"},{"line_number":207,"context_line":"        if size_in_g is None:"},{"line_number":208,"context_line":"            LOG.warning(_(\"Size for volume: %s not found, \""},{"line_number":209,"context_line":"                          \"skipping secure delete.\") % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FXkA%3D","line":206,"in_reply_to":"AAAASn%2F%2FZxc%3D","updated":"2013-09-05 16:10:28.000000000","message":"No. This is complex and difficult to extrapolate. I worked with Joe on this issue and this is by far the simplest way to tackle the problem.\n\nThe COW device doesn\u0027t have a usage associated with it that tells you exactly how many bytes to overwrite. It\u0027s not the % used, it\u0027s not the chunk size * extents, it\u0027s not straightforward at all.\n\nThe COW device has a header up front, then COW data chunks, which are written to the device itself whenever you write a block in the snapshot. The size of the chunks can change with different versions/revisions of lvm (kernels). The *only* index into these data chunks is the I/O exception list.\n\nIn normal transient snapshots, the exception list isn\u0027t stored on disk, it\u0027s purely in memory in the device-mapper kernel code. In persistent ones, it is stored in the -cow device, in chunk-sized metadata blocks. In either case, there\u0027s no good way to guess at chunks used nor is there a good interface to calculate it from userspace that I can find.","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"571d0eb6a40e64b09db895971fa82af1164a18f7","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        else:"},{"line_number":204,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        size_in_g \u003d volume.get(\u0027size\u0027, volume.get(\u0027volume_size\u0027, None))"},{"line_number":207,"context_line":"        if size_in_g is None:"},{"line_number":208,"context_line":"            LOG.warning(_(\"Size for volume: %s not found, \""},{"line_number":209,"context_line":"                          \"skipping secure delete.\") % volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2FZxc%3D","line":206,"in_reply_to":"AAAASn%2F%2FZyU%3D","updated":"2013-09-05 05:21:52.000000000","message":"Actually, it\u0027s a device and not a file, so replace \"size of the COW file\" with \"value \u003cx\u003e from lvdisplay \u003cdevice\u003e\".","commit_id":"a15ab0a33672dd85308379da7c47a401519b1a2a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"607fcc76387ef4735c22c97e5803ca8096eebb78","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if is_snapshot and not self.configuration.lvm_type \u003d\u003d \u0027thin\u0027:"},{"line_number":198,"context_line":"            # if the volume to be cleared is a snapshot of another volume"},{"line_number":199,"context_line":"            # we need to clear out the volume using the -cow instead of the"},{"line_number":200,"context_line":"            # directly volume path.  We need to skip this if we are using"},{"line_number":201,"context_line":"            # thin provisioned LVs."},{"line_number":202,"context_line":"            # bug# lp1191812"},{"line_number":203,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FPXY%3D","line":200,"updated":"2013-09-09 13:39:52.000000000","message":"s/directly/direct","commit_id":"a03ffed1b998391b18d84fc1efad76ac11f4da69"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"607fcc76387ef4735c22c97e5803ca8096eebb78","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            # we need to clear out the volume using the -cow instead of the"},{"line_number":200,"context_line":"            # directly volume path.  We need to skip this if we are using"},{"line_number":201,"context_line":"            # thin provisioned LVs."},{"line_number":202,"context_line":"            # bug# lp1191812"},{"line_number":203,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            vol_path \u003d self.local_path(volume)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FPZI%3D","line":202,"updated":"2013-09-09 13:39:52.000000000","message":"We usually avoid listing bug numbers in code, probably best to remove.","commit_id":"a03ffed1b998391b18d84fc1efad76ac11f4da69"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"592792248ebaa7627b14df23de5fd159d667784b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            # directly volume path.  We need to skip this if we are using"},{"line_number":201,"context_line":"            # thin provisioned LVs."},{"line_number":202,"context_line":"            # bug# lp1191812"},{"line_number":203,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAS3%2F%2F8jk%3D","line":203,"updated":"2013-09-16 19:49:28.000000000","message":"I think we need a check in here to ensure that the -cow device exists, so we don\u0027t write GBs of data to /dev/ if it is missing for whatever reason.  The caller does this [1] for self.local_path(volume) but not this device.\n\n[1]: ...in an unsafe manner.  I\u0027ll fix that in https://review.openstack.org/#/c/46572/ since I am already fixing a similar silent failure issue there.","commit_id":"421dd4d6c02533db761b3a28d9e08464e42c40b1"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"b1151d81e5e5d193f34889b95f93a4100ee46e9a","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            # directly volume path.  We need to skip this if we are using"},{"line_number":201,"context_line":"            # thin provisioned LVs."},{"line_number":202,"context_line":"            # bug# lp1191812"},{"line_number":203,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAS3%2F%2F310%3D","line":203,"in_reply_to":"AAAAS3%2F%2F4mc%3D","updated":"2013-09-17 21:20:44.000000000","message":"Yes, that would do it.  The warn is probably not required as the exception should be logged anyway.","commit_id":"421dd4d6c02533db761b3a28d9e08464e42c40b1"},{"author":{"_account_id":1475,"name":"Joe Breu","email":"breu@breu.org","username":"breu"},"change_message_id":"d9c0fcba79bf075265a0ced9a53dc785e901afa0","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            # directly volume path.  We need to skip this if we are using"},{"line_number":201,"context_line":"            # thin provisioned LVs."},{"line_number":202,"context_line":"            # bug# lp1191812"},{"line_number":203,"context_line":"            vol_path \u003d self.local_path(volume) + \"-cow\""},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            vol_path \u003d self.local_path(volume)"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAS3%2F%2F4mc%3D","line":203,"in_reply_to":"AAAAS3%2F%2F8jk%3D","updated":"2013-09-17 18:08:52.000000000","message":"Would something like the following be sufficient?\n\n       if not os.path.exists(vol_path):\n           msg \u003d (_(\"Volume path %s doesn\u0027t exist\") % vol_path)\n           LOG.warn(msg)\n           raise exception.VolumeBackendAPIException(data\u003dmsg)","commit_id":"421dd4d6c02533db761b3a28d9e08464e42c40b1"}]}
