This patch allows importing images from stdin with the following command:

   rbd import --size=<size in MB> - [dest-image]

v1 -> v2: stat stdin as well

Signed-off-by: Christian Brunner <c...@muc.de>
---
 src/rbd.cc |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/rbd.cc b/src/rbd.cc
index 655d9a2..1a0c510 100644
--- a/src/rbd.cc
+++ b/src/rbd.cc
@@ -402,16 +402,21 @@ done_img:
 }
 
 static int do_import(librbd::RBD &rbd, librados::IoCtx& io_ctx,
-                    const char *imgname, int *order, const char *path)
+                    const char *imgname, int *order, const char *path,
+                    int64_t size)
 {
-  int fd = open(path, O_RDONLY);
-  int r;
-  int64_t size = 0;
+  int fd, r;
   struct stat stat_buf;
   string md_oid;
   struct fiemap *fiemap;
   MyProgressContext pc("Importing image");
 
+  if (! strcmp(path, "-")) {
+    fd = 0;
+  } else {
+    fd = open(path, O_RDONLY);
+  }
+
   if (fd < 0) {
     r = -errno;
     cerr << "error opening " << path << std::endl;
@@ -424,7 +429,9 @@ static int do_import(librbd::RBD &rbd, librados::IoCtx& 
io_ctx,
     cerr << "stat error " << path << std::endl;
     return r;
   }
-  size = (uint64_t)stat_buf.st_size;
+  if (stat_buf.st_size)
+    size = (uint64_t)stat_buf.st_size;
+
   if (!size) {
     r = get_block_device_size(fd, &size);
     if (r < 0) {
@@ -505,7 +512,12 @@ static int do_import(librbd::RBD &rbd, librados::IoCtx& 
io_ctx,
       while (cur_seg) {
         bufferptr p(cur_seg);
         //cerr << "reading " << cur_seg << " bytes at offset " << file_pos << 
std::endl;
-        ssize_t rval = TEMP_FAILURE_RETRY(::pread(fd, p.c_str(), cur_seg, 
file_pos));
+       ssize_t rval;
+       if(extent == 0 && fiemap->fm_extents[extent].fe_logical == 0) {
+         rval = TEMP_FAILURE_RETRY(::read(fd, p.c_str(), cur_seg));
+       } else {
+         rval = TEMP_FAILURE_RETRY(::pread(fd, p.c_str(), cur_seg, file_pos));
+       }
         if (rval < 0) {
           r = -errno;
           cerr << "error reading file: " << cpp_strerror(r) << std::endl;
@@ -1303,7 +1315,7 @@ int main(int argc, const char **argv)
       cerr << "pathname should be specified" << std::endl;
       exit(1);
     }
-    r = do_import(rbd, dest_io_ctx, destname, &order, path);
+    r = do_import(rbd, dest_io_ctx, destname, &order, path, size);
     if (r < 0) {
       cerr << "import failed: " << cpp_strerror(-r) << std::endl;
       exit(1);
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to