[PATCH 1/2] rbd: allow importing from stdin

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



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

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

Signed-off-by: Christian Brunner <chb@xxxxxx>
---
 src/rbd.cc |   37 +++++++++++++++++++++++++------------
 1 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/src/rbd.cc b/src/rbd.cc
index 655d9a2..0476cc5 100644
--- a/src/rbd.cc
+++ b/src/rbd.cc
@@ -402,29 +402,37 @@ 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;
     return r;
   }
 
-  r = fstat(fd, &stat_buf);
-  if (r < 0) {
-    r = -errno;
-    cerr << "stat error " << path << std::endl;
-    return r;
+  if (fd > 0) {
+    r = fstat(fd, &stat_buf);
+    if (r < 0) {
+      r = -errno;
+      cerr << "stat error " << path << std::endl;
+      return r;
+    }
+    size = (uint64_t)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 +513,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 +1316,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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[CEPH Users]     [Information on CEPH]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Free Online Dating]     [Linux Kernel]     [Linux SCSI]     [XFree86]

Add to Google Powered by Linux