]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Add patch from Martin Schmid scm@apsag.com that checks to see if
authorKern Sibbald <kern@sibbald.com>
Fri, 22 Feb 2008 15:03:16 +0000 (15:03 +0000)
committerKern Sibbald <kern@sibbald.com>
Fri, 22 Feb 2008 15:03:16 +0000 (15:03 +0000)
     ftruncate() actually works. In the case of some (cheap) NAS devices,
     it does not, and so recycling NAS Volumes does not work. The code
     simply unlink()s the file, then recreates it.  This fixes bug #1011.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6463 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/AUTHORS
bacula/src/stored/dev.c
bacula/src/version.h
bacula/technotes-2.3

index 20218a0852adef16071917634ff8e3e0c6f37a6a..17bd5e0474b8c04eefb88a8839313a7b19152697 100644 (file)
@@ -61,6 +61,7 @@ Lucas Di Pentima
 Ludovic Strappazon
 Marc Cousin                       
 Marc Schiffbauer
+Martin Schmid
 Martin Simmons                       
 Meno Abels
 Michael Renner
index b8ef18713d61e17d1beccc9bbb2f64b9a6474364..030bb3adff241c4b2dfa7fd9076a33b41671a60b 100644 (file)
@@ -1917,6 +1917,8 @@ boffset_t DEVICE::lseek(DCR *dcr, boffset_t offset, int whence)
 
 bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
 {
+   struct stat st;
+
    Dmsg1(100, "truncate %s\n", print_name());
    switch (dev_type) {
    case B_TAPE_DEV:
@@ -1925,15 +1927,62 @@ bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
    case B_DVD_DEV:
       return truncate_dvd(dcr);
    case B_FILE_DEV:
-      /* ***FIXME*** we really need to unlink() the file so that
-       *  its name can be changed for a relabel.
-       */
       if (ftruncate(m_fd, 0) != 0) {
          berrno be;
          Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
                print_name(), be.bstrerror());
          return false;
       }
+          
+      /*
+       * Check for a successful ftruncate() and issue a work-around for devices 
+       * (mostly cheap NAS) that don't support truncation. 
+       * Workaround supplied by Martin Schmid as a solution to bug #1011.
+       * 1. close file
+       * 2. delete file
+       * 3. open new file with same mode
+       * 4. change ownership to original
+       */
+
+      if (fstat(m_fd, &st) != 0) {
+         berrno be;
+         Mmsg2(errmsg, _("Unable to stat device %s. ERR=%s\n"), 
+               print_name(), be.bstrerror());
+         return false;
+      }
+          
+      if (st.st_size != 0) {             /* ftruncate() didn't work */
+         POOL_MEM archive_name(PM_FNAME);
+                
+         pm_strcpy(archive_name, dev_name);
+         if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) {
+            pm_strcat(archive_name, "/");
+         }
+         pm_strcat(archive_name, dcr->VolumeName);
+                   
+         Mmsg2(errmsg, _("Device %s doesn't support ftruncate(). Recreating file %s.\n"), 
+               print_name(), archive_name.c_str());
+
+         /* Close file and blow it away */
+         ::close(m_fd);
+         ::unlink(archive_name.c_str());
+                   
+         /* Recreate the file -- of course, empty */
+         set_mode(CREATE_READ_WRITE);
+         if ((m_fd = ::open(archive_name.c_str(), mode, st.st_mode)) < 0) {
+            berrno be;
+            dev_errno = errno;
+            Mmsg2(errmsg, _("Could not reopen: %s, ERR=%s\n"), archive_name.c_str(), 
+                  be.bstrerror());
+            Dmsg1(100, "reopen failed: %s", errmsg);
+            Emsg0(M_FATAL, 0, errmsg);
+            return false;
+         }
+                   
+         /* Reset proper owner */
+         chown(archive_name.c_str(), st.st_uid, st.st_gid);  
+      }
+          
       return true;
    }
    return false;
index b905abc8105039d98b107d4b02df8a412cc84e2d..8aa124b18707ee66821ed9247e2ae158d10b07cc 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "2.3.10"
-#define BDATE   "16 February 2008"
-#define LSMDATE "16Feb08"
+#define BDATE   "22 February 2008"
+#define LSMDATE "22Feb08"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2008"       /* year for copyright messages in progs */
index 2a344b954b9ad556718eb6aa5b01140e9ffd9309..14712f05500804115b61c1b7656f931e3ee0fb7b 100644 (file)
@@ -1,6 +1,11 @@
               Technical notes on version 2.3
 
 General:
+22Feb08
+kes  Add patch from Martin Schmid scm@apsag.com that checks to see if
+     ftruncate() actually works. In the case of some (cheap) NAS devices,
+     it does not, and so recycling NAS Volumes does not work. The code
+     simply unlink()s the file, then recreates it.  This fixes bug #1011.
 21Feb08
 kes  First incomplete cut of big malloc blocks for htable.
 kes  Tweak plugin code.