From 4b2804b15b6c5e7263f5cabfc9151003193a4590 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Wed, 21 May 2008 13:05:15 +0000 Subject: [PATCH] kes Display open() errors except when polling. Previously too many were suppressed. This should fix bug #1070. kes Fix Win32 reparse points. Bacula will not recurse into any reparse point directory, including mount points, unless the directory is explicitly mentioned at the top level (same as with Unix). A file that is linked to another file will be backed up -- much as Unix does for hardlinked files. This fixes bug #1041. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7004 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/baconfig.h | 4 ++++ bacula/src/dird/autoprune.c | 2 +- bacula/src/findlib/find_one.c | 35 +++++++++++++++++++++-------------- bacula/src/stored/acquire.c | 10 ++++++++-- bacula/src/stored/dircmd.c | 8 ++++---- bacula/src/stored/label.c | 4 ++++ bacula/src/stored/mount.c | 2 +- bacula/src/version.h | 4 ++-- bacula/technotes-2.3 | 9 +++++++++ 9 files changed, 54 insertions(+), 24 deletions(-) diff --git a/bacula/src/baconfig.h b/bacula/src/baconfig.h index f965033d60..af2bf44e0b 100644 --- a/bacula/src/baconfig.h +++ b/bacula/src/baconfig.h @@ -79,6 +79,10 @@ #define NPRT(x) (x)?(x):_("*None*") #if defined(HAVE_WIN32) + +#define WIN32_REPARSE_POINT 1 +#define WIN32_MOUNT_POINT 2 + void InitWinAPIWrapper(); #define OSDependentInit() InitWinAPIWrapper() diff --git a/bacula/src/dird/autoprune.c b/bacula/src/dird/autoprune.c index 2b8e8cb91f..cc812c5cbb 100644 --- a/bacula/src/dird/autoprune.c +++ b/bacula/src/dird/autoprune.c @@ -96,7 +96,7 @@ bool prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr) POOL_MEM query(PM_MESSAGE); UAContext *ua; bool ok = false; - char ed1[50], ed2[100], ed3[50]; + char ed1[50], ed2[100]; POOL_DBR spr; Dmsg1(050, "Prune volumes PoolId=%d\n", jcr->jr.PoolId); diff --git a/bacula/src/findlib/find_one.c b/bacula/src/findlib/find_one.c index 7c22ee0a41..c27060ca5d 100644 --- a/bacula/src/findlib/find_one.c +++ b/bacula/src/findlib/find_one.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + Copyright (C) 2000-2008 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -518,21 +518,21 @@ find_one_file(JCR *jcr, FF_PKT *ff_pkt, * (or what is defined for IgnoreDir in this fileset) exists */ if (ff_pkt->ignoredir != NULL) { - struct stat sb; - char fname[MAXPATHLEN]; + struct stat sb; + char fname[MAXPATHLEN]; - if (strlen(ff_pkt->fname) + strlen("/") + - strlen(ff_pkt->ignoredir) + 1 > MAXPATHLEN) - return 1; /* Is this wisdom? */ + if (strlen(ff_pkt->fname) + strlen("/") + + strlen(ff_pkt->ignoredir) + 1 > MAXPATHLEN) + return 1; /* Is this wisdom? */ - strcpy(fname, ff_pkt->fname); - strcat(fname, "/"); - strcat(fname, ff_pkt->ignoredir); - if (stat(fname, &sb) == 0) { + strcpy(fname, ff_pkt->fname); + strcat(fname, "/"); + strcat(fname, ff_pkt->ignoredir); + if (stat(fname, &sb) == 0) { Dmsg2(100, "Directory '%s' ignored (found %s)\n", - ff_pkt->fname, ff_pkt->ignoredir); + ff_pkt->fname, ff_pkt->ignoredir); return 1; /* Just ignore this directory */ - } + } } /* Build a canonical directory name with a trailing slash in link var */ @@ -557,9 +557,11 @@ find_one_file(JCR *jcr, FF_PKT *ff_pkt, * We have set st_rdev to 1 if it is a reparse point, otherwise 0, * if st_rdev is 2, it is a mount point */ - if (have_win32_api() && ff_pkt->statp.st_rdev == 1) { +#if defined(HAVE_WIN32) + if (ff_pkt->statp.st_rdev == WIN32_REPARSE_POINT) { ff_pkt->type = FT_REPARSE; } +#endif /* * Note, we return the directory to the calling program (handle_file) * when we first see the directory (FT_DIRBEGIN. @@ -597,10 +599,15 @@ find_one_file(JCR *jcr, FF_PKT *ff_pkt, * to cross, or we may be restricted by a list of permitted * file systems. */ + bool is_win32_mount_point = false; +#if defined(HAVE_WIN32) + is_win32_mount_point = ff_pkt->statp.st_rdev == WIN32_MOUNT_POINT; +#endif if (!top_level && ff_pkt->flags & FO_NO_RECURSION) { ff_pkt->type = FT_NORECURSE; recurse = false; - } else if (!top_level && parent_device != ff_pkt->statp.st_dev) { + } else if (!top_level && (parent_device != ff_pkt->statp.st_dev || + is_win32_mount_point)) { if(!(ff_pkt->flags & FO_MULTIFS)) { ff_pkt->type = FT_NOFSCHG; recurse = false; diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index fc72f8a7c2..d670beba2c 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -219,8 +219,10 @@ bool acquire_device_for_read(DCR *dcr) */ Dmsg1(100, "bstored: open vol=%s\n", dcr->VolumeName); if (dev->open(dcr, OPEN_READ_ONLY) < 0) { - Jmsg3(jcr, M_WARNING, 0, _("Read open device %s Volume \"%s\" failed: ERR=%s\n"), - dev->print_name(), dcr->VolumeName, dev->bstrerror()); + if (!dev->poll) { + Jmsg3(jcr, M_WARNING, 0, _("Read open device %s Volume \"%s\" failed: ERR=%s\n"), + dev->print_name(), dcr->VolumeName, dev->bstrerror()); + } goto default_path; } Dmsg1(50, "opened dev %s OK\n", dev->print_name()); @@ -287,6 +289,10 @@ default_path: if (dev->open(dcr, OPEN_READ_ONLY) >= 0) { continue; } + if (!dev->poll) { + Jmsg3(jcr, M_WARNING, 0, _("Read open device %s Volume \"%s\" failed: ERR=%s\n"), + dev->print_name(), dcr->VolumeName, dev->bstrerror()); + } } /* Mount a specific volume and no other */ diff --git a/bacula/src/stored/dircmd.c b/bacula/src/stored/dircmd.c index b61e2e6630..a6208244e5 100644 --- a/bacula/src/stored/dircmd.c +++ b/bacula/src/stored/dircmd.c @@ -673,8 +673,8 @@ static bool mount_cmd(JCR *jcr) } /* We freed the device, so reopen it and wake any waiting threads */ if (dev->open(dcr, OPEN_READ_ONLY) < 0) { - dir->fsend(_("3901 open device failed: ERR=%s\n"), - dev->bstrerror()); + dir->fsend(_("3901 Unable to open device %s: ERR=%s\n"), + dev->print_name(), dev->bstrerror()); if (dev->blocked() == BST_UNMOUNTED) { /* We blocked the device, so unblock it */ Dmsg0(100, "Unmounted. Unblocking device\n"); @@ -730,8 +730,8 @@ static bool mount_cmd(JCR *jcr) } } else if (dev->is_tape()) { if (dev->open(dcr, OPEN_READ_ONLY) < 0) { - dir->fsend(_("3901 open device failed: ERR=%s\n"), - dev->bstrerror()); + dir->fsend(_("3901 Unable to open device %s: ERR=%s\n"), + dev->print_name(), dev->bstrerror()); break; } read_label(dcr); diff --git a/bacula/src/stored/label.c b/bacula/src/stored/label.c index 3d791f4fb0..db38527539 100644 --- a/bacula/src/stored/label.c +++ b/bacula/src/stored/label.c @@ -339,6 +339,8 @@ bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, if (dev->open(dcr, OPEN_READ_WRITE) < 0) { /* If device is not tape, attempt to create it */ if (dev->is_tape() || dev->open(dcr, CREATE_READ_WRITE) < 0) { + Jmsg3(dcr->jcr, M_WARNING, 0, _("Open device %s Volume \"%s\" failed: ERR=%s\n"), + dev->print_name(), dcr->VolumeName, dev->bstrerror()); goto bail_out; } } @@ -435,6 +437,8 @@ bool rewrite_volume_label(DCR *dcr, bool recycle) JCR *jcr = dcr->jcr; if (dev->open(dcr, OPEN_READ_WRITE) < 0) { + Jmsg3(jcr, M_WARNING, 0, _("Open device %s Volume \"%s\" failed: ERR=%s\n"), + dev->print_name(), dcr->VolumeName, dev->bstrerror()); return false; } Dmsg2(190, "set append found freshly labeled volume. fd=%d dev=%x\n", dev->fd(), dev); diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index 6e5e1ff3fa..2f292de209 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -227,7 +227,7 @@ mount_next_vol: } /* If DVD, ignore the error, very often you cannot open the device * (when there is no DVD, or when the one inserted is a wrong one) */ - if (dev->poll || dev->is_dvd() || dev->is_removable()) { + if (dev->poll || dev->is_dvd()) { goto mount_next_vol; } else { Jmsg(jcr, M_ERROR, 0, _("Could not open device %s: ERR=%s\n"), diff --git a/bacula/src/version.h b/bacula/src/version.h index 91ce8a93b0..9f4b0157ed 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -4,8 +4,8 @@ #undef VERSION #define VERSION "2.3.21" -#define BDATE "20 May 2008" -#define LSMDATE "20May08" +#define BDATE "21 May 2008" +#define LSMDATE "21May08" #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n" #define BYEAR "2008" /* year for copyright messages in progs */ diff --git a/bacula/technotes-2.3 b/bacula/technotes-2.3 index ce1cb87467..1272046672 100644 --- a/bacula/technotes-2.3 +++ b/bacula/technotes-2.3 @@ -24,6 +24,15 @@ Add long term statistics job table General: +21May08 +kes Display open() errors except when polling. Previously too + many were suppressed. This should fix bug #1070. +kes Fix Win32 reparse points. Bacula will not recurse into any + reparse point directory, including mount points, unless the + directory is explicitly mentioned at the top level (same as + with Unix). A file that is linked to another file will be + backed up -- much as Unix does for hardlinked files. + This fixes bug #1041. 20May08 kes Remove double quotes from ChangeLog and ReleaseNotes kes Remove StorageId test when pruning and recycling (Eric's changes). -- 2.39.5