Whamcloud - gitweb
LU-160 Split small/big file parts of test_155_load
[fs/lustre-release.git] / lustre / utils / lustre_rsync.c
index 5ef3297..a3c9029 100644 (file)
@@ -26,7 +26,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2009 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
@@ -708,6 +708,19 @@ int lr_rmfile(struct lr_info *info)
         return rc;
 }
 
+/* Recursively remove directory and its contents */
+int lr_rm_recursive(struct lr_info *info)
+{
+        int rc;
+
+        snprintf(info->cmd, PATH_MAX, "rm -rf %s", info->dest);
+        rc = system(info->cmd);
+        if (rc == -1)
+                rc = -errno;
+
+        return rc;
+}
+
 /* Remove a file under SPECIAL_DIR with its tfid as its name. */
 int lr_rm_special(struct lr_info *info)
 {
@@ -772,14 +785,14 @@ int lr_create(struct lr_info *info)
         /* Is f2p(pfid) present on the target? If not, the parent has
            moved */
         if (!mkspecial) {
-                snprintf(info->dest, PATH_MAX, "%s%s", status->ls_targets[0],
+                snprintf(info->dest, PATH_MAX, "%s/%s", status->ls_targets[0],
                         info->path);
                 if (access(info->dest, F_OK) != 0)
                         mkspecial = 1;
         }
         for (info->target_no = 0; info->target_no < status->ls_num_targets;
              info->target_no++) {
-                snprintf(info->dest, PATH_MAX, "%s%s",
+                snprintf(info->dest, PATH_MAX, "%s/%s",
                         status->ls_targets[info->target_no], info->savedpath);
                 lr_get_FID_PATH(status->ls_source, info->tfid, info->src,
                                     PATH_MAX);
@@ -818,13 +831,16 @@ int lr_remove(struct lr_info *info)
                         rc = rc1;
                         continue;
                 }
-                snprintf(info->dest, PATH_MAX, "%s%s/%s",
+                snprintf(info->dest, PATH_MAX, "%s/%s/%s",
                         status->ls_targets[info->target_no], info->path,
                         info->name);
 
                 rc1 = lr_rmfile(info);
                 lr_debug(DINFO, "remove: %s; rc1=%d, errno=%d\n",
                          info->dest, rc1, errno);
+                if (rc1 == -ENOTEMPTY)
+                        rc1 = lr_rm_recursive(info);
+
                 if (rc1) {
                         rc = rc1;
                         continue;
@@ -855,13 +871,13 @@ int lr_move(struct lr_info *info, struct lr_info *ext)
              info->target_no++) {
 
                 if (!rc_dest) {
-                        snprintf(info->dest, PATH_MAX, "%s%s",
+                        snprintf(info->dest, PATH_MAX, "%s/%s",
                                 status->ls_targets[info->target_no],
                                 ext->path);
                         if (access(info->dest, F_OK) != 0) {
                                 rc_dest = -errno;
                         } else {
-                                snprintf(info->dest, PATH_MAX, "%s%s/%s",
+                                snprintf(info->dest, PATH_MAX, "%s/%s/%s",
                                         status->ls_targets[info->target_no],
                                         ext->path, ext->name);
                         }
@@ -874,7 +890,7 @@ int lr_move(struct lr_info *info, struct lr_info *ext)
                 }
 
                 if (!rc_src)
-                        snprintf(info->src, PATH_MAX, "%s%s/%s",
+                        snprintf(info->src, PATH_MAX, "%s/%s/%s",
                                 status->ls_targets[info->target_no],
                                 info->path, info->name);
                 if (rc_src == -ENOENT || (access(info->src, F_OK) != 0 &&
@@ -941,11 +957,11 @@ int lr_link(struct lr_info *info)
                         len = strlen(info->path) - strlen(info->name);
                         if (len > 0 && strcmp(info->path + len,
                                               info->name) == 0)
-                                snprintf(info->dest, PATH_MAX, "%s%s",
+                                snprintf(info->dest, PATH_MAX, "%s/%s",
                                         status->ls_targets[info->target_no],
                                         info->path);
                         else if (info->src[0] == 0)
-                                snprintf(info->src, PATH_MAX, "%s%s",
+                                snprintf(info->src, PATH_MAX, "%s/%s",
                                         status->ls_targets[info->target_no],
                                         info->path);
                 }
@@ -998,7 +1014,7 @@ int lr_setattr(struct lr_info *info)
         for (info->target_no = 0; info->target_no < status->ls_num_targets;
              info->target_no++) {
 
-                snprintf(info->dest, PATH_MAX, "%s%s",
+                snprintf(info->dest, PATH_MAX, "%s/%s",
                          status->ls_targets[info->target_no], info->path);
                 lr_debug(DINFO, "setattr: %s %s %s", info->src, info->dest,
                          info->tfid);
@@ -1029,7 +1045,7 @@ int lr_setxattr(struct lr_info *info)
         for (info->target_no = 0; info->target_no < status->ls_num_targets;
              info->target_no++) {
 
-                snprintf(info->dest, PATH_MAX, "%s%s",
+                snprintf(info->dest, PATH_MAX, "%s/%s",
                         status->ls_targets[info->target_no], info->path);
                 lr_debug(DINFO, "setxattr: %s %s %s\n", info->src, info->dest,
                          info->tfid);
@@ -1319,7 +1335,7 @@ void lr_print_status(struct lr_info *info)
         if (statuslog != NULL)
                 printf("Statuslog: %s\n", statuslog);
         printf("Changelog registration: %s\n", status->ls_registration);
-        printf("Starting changelog record: %lld\n", status->ls_last_recno);
+        printf("Starting changelog record: "LPD64"\n", status->ls_last_recno);
         if (noxattr)
                 printf("Replicate xattrs: no\n");
         if (noclear)