]> git.sur5r.net Git - bacula/bacula/commitdiff
Fix bug #1811 Filed fails to backup more then one xattr. origin/Branch-5.0
authorMarco van Wieringen <mvw@planets.elm.net>
Fri, 6 Jan 2012 19:44:18 +0000 (20:44 +0100)
committerMarco van Wieringen <mvw@planets.elm.net>
Thu, 12 Jan 2012 10:20:55 +0000 (11:20 +0100)
On Solaris we fail to backup more then one xattr. There
are two serious wrong tests in the code that seem to predate
switch to the new bxattr_exit_* codes. Due to a side effect
the retval variable only gets set to a non 0 value
(bxattr_exit_ok) when the first xattr is saved as then the
hidden directory is saved and as such the retval
is set.

While scanning through the code for possible other retval
initialization errors and wrong code I fixed one other problem
in the Tru64 xattr code which we probably never encounter
as that platform is kind of dying.

bacula/src/filed/xattr.c

index a181d4123fad6d2ad7c09f3321a5508830aef3a4..d91b602fd2e382c5a4855a19ab02dfc2be8afc0b 100644 (file)
@@ -208,7 +208,6 @@ static bxattr_exit_code unserialize_xattr_stream(JCR *jcr, alist *xattr_value_li
 {
    unser_declare;
    xattr_t *current_xattr;
-   bxattr_exit_code retval = bxattr_exit_ok;
 
    /*
     * Parse the stream and call restore_xattr_on_file for each extended attribute.
@@ -277,7 +276,7 @@ static bxattr_exit_code unserialize_xattr_stream(JCR *jcr, alist *xattr_value_li
    }
 
    unser_end(jcr->xattr_data->content, jcr->xattr_data->content_length);
-   return retval;
+   return bxattr_exit_ok;
 }
 #endif
 
@@ -960,11 +959,9 @@ static bxattr_exit_code bsd_build_xattr_streams(JCR *jcr, FF_PKT *ff_pkt)
       /*
        * Send the datastream to the SD.
        */
-      return send_xattr_stream(jcr, os_default_xattr_streams[0]);
+      retval = send_xattr_stream(jcr, os_default_xattr_streams[0]);
    } else {
-      xattr_drop_internal_table(xattr_value_list);
-
-      return bxattr_exit_ok;
+      retval = bxattr_exit_ok;
    }
 
 bail_out:
@@ -1669,35 +1666,36 @@ static bxattr_exit_code solaris_save_xattr(JCR *jcr, int fd, const char *xattr_n
       break;
    }
 
-   if (retval) {
-      retval = send_xattr_stream(jcr, stream);
-      if (retval == bxattr_exit_ok) {
-         jcr->xattr_data->nr_saved++;
-      }
+   /*
+    * We build a new xattr stream send it to the SD.
+    */
+   retval = send_xattr_stream(jcr, stream);
+   if (retval != bxattr_exit_ok) {
+       goto bail_out;
    }
+   jcr->xattr_data->nr_saved++;
 
    /*
     * Recursivly call solaris_save_extended_attributes for archiving the attributes
     * available on this extended attribute.
     */
-   if (retval) {
-      retval = solaris_save_xattrs(jcr, xattr_namespace, attrname);
+   retval = solaris_save_xattrs(jcr, xattr_namespace, attrname);
       
-      /*
-       * The recursive call could change our working dir so change back to the wanted workdir.
-       */
-      if (fchdir(fd) < 0) {
-         switch (errno) {
-         case ENOENT:
-            retval = bxattr_exit_ok;
-            goto bail_out;
-         default:
-            Mmsg2(jcr->errmsg, _("Unable to chdir to xattr space of file \"%s\": ERR=%s\n"),
-                  jcr->last_fname, be.bstrerror());
-            Dmsg3(100, "Unable to fchdir to xattr space of file \"%s\" using fd %d: ERR=%s\n",
-                  jcr->last_fname, fd, be.bstrerror());
-            goto bail_out;
-         }
+   /*
+    * The recursive call could change our working dir so change back to the wanted workdir.
+    */
+   if (fchdir(fd) < 0) {
+      switch (errno) {
+      case ENOENT:
+         retval = bxattr_exit_ok;
+         goto bail_out;
+      default:
+         Mmsg2(jcr->errmsg,
+               _("Unable to chdir to xattr space of file \"%s\": ERR=%s\n"),
+               jcr->last_fname, be.bstrerror());
+         Dmsg3(100, "Unable to fchdir to xattr space of file \"%s\" using fd %d: ERR=%s\n",
+               jcr->last_fname, fd, be.bstrerror());
+         goto bail_out;
       }
    }