]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/filed/backup.c
Merge branch 'master' into basejobv3
[bacula/bacula] / bacula / src / filed / backup.c
index 0fb9494a0007eb31f02f54b5ab306d6ec8fef8b5..e92f880b4f7d7102f47ffd6629c70fbcfc3a51b6 100644 (file)
@@ -142,9 +142,11 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
 
    if (have_acl) {
       jcr->acl_data = get_pool_memory(PM_MESSAGE);
+      jcr->total_acl_errors = 0;
    }
    if (have_xattr) {
       jcr->xattr_data = get_pool_memory(PM_MESSAGE);
+      jcr->total_xattr_errors = 0;
    }
 
    /* Subroutine save_file() is called for each file */
@@ -153,7 +155,16 @@ bool blast_data_to_storage_daemon(JCR *jcr, char *addr)
       set_jcr_job_status(jcr, JS_ErrorTerminated);
    }
 
-   accurate_send_deleted_list(jcr);              /* send deleted list to SD  */
+   if (jcr->total_acl_errors > 0) {
+      Jmsg(jcr, M_ERROR, 0, _("Encountered %ld acl errors while doing backup\n"),
+           jcr->total_acl_errors);
+   }
+   if (jcr->total_xattr_errors > 0) {
+      Jmsg(jcr, M_ERROR, 0, _("Encountered %ld xattr errors while doing backup\n"),
+           jcr->total_xattr_errors);
+   }
+
+   accurate_finish(jcr);              /* send deleted or base file list to SD */
 
    stop_heartbeat_monitor(jcr);
 
@@ -598,19 +609,49 @@ int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level)
    /*
     * Save ACLs when requested and available for anything not being a symlink and not being a plugin.
     */
-   if (ff_pkt->flags & FO_ACL && have_acl &&
-       ff_pkt->type != FT_LNK && !ff_pkt->cmd_plugin) {
-      if (!build_acl_streams(jcr, ff_pkt))
-         goto bail_out;
+   if (have_acl) {
+      if (ff_pkt->flags & FO_ACL && ff_pkt->type != FT_LNK && !ff_pkt->cmd_plugin) {
+         switch (build_acl_streams(jcr, ff_pkt)) {
+         case bacl_exit_fatal:
+            goto bail_out;
+         case bacl_exit_error:
+            /*
+             * Non-fatal errors, count them and when the number is under ACL_REPORT_ERR_MAX_PER_JOB
+             * print the error message set by the lower level routine in jcr->errmsg.
+             */
+            if (jcr->total_acl_errors < ACL_REPORT_ERR_MAX_PER_JOB) {
+               Jmsg(jcr, M_ERROR, 0, "%s", jcr->errmsg);
+            }
+            jcr->total_acl_errors++;
+            break;
+         case bacl_exit_ok:
+            break;
+         }
+      }
    }
 
    /*
     * Save Extended Attributes when requested and available for all files not being a plugin.
     */
-   if (ff_pkt->flags & FO_XATTR && have_xattr &&
-       !ff_pkt->cmd_plugin) {
-      if (!build_xattr_streams(jcr, ff_pkt))
-         goto bail_out;
+   if (have_xattr) {
+      if (ff_pkt->flags & FO_XATTR && !ff_pkt->cmd_plugin) {
+         switch (build_xattr_streams(jcr, ff_pkt)) {
+         case bxattr_exit_fatal:
+            goto bail_out;
+         case bxattr_exit_error:
+            /*
+             * Non-fatal errors, count them and when the number is under XATTR_REPORT_ERR_MAX_PER_JOB
+             * print the error message set by the lower level routine in jcr->errmsg.
+             */
+            if (jcr->total_xattr_errors < XATTR_REPORT_ERR_MAX_PER_JOB) {
+               Jmsg(jcr, M_ERROR, 0, "%s", jcr->errmsg);
+            }
+            jcr->total_xattr_errors++;
+            break;
+         case bxattr_exit_ok:
+            break;
+         }
+      }
    }
 
    /* Terminate the signing digest and send it to the Storage daemon */