1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-27 18:04:20 +03:00

Detect stream write failure reliably; new fn: lvm_fclose; use dm_fclose

* lib/misc/lvm-file.c (lvm_fclose): New function.
* lib/misc/lvm-file.h (lvm_fclose): Declare it.
* lib/config/config.c (write_config_file): Use the new function to detect
and diagnose unlikely write failure.
* lib/filters/filter-persistent.c (persistent_filter_dump): Likewise.
* lib/format_text/archive.c (archive_vg): Likewise.
* lib/format_text/format-text.c (_vg_write_file): Likewise.
* lib/log/log.c (fin_log): Similar, but use dm_fclose directly.
Include "\n" at end of each fprintf format string.
This commit is contained in:
Jim Meyering 2007-07-24 17:48:08 +00:00
parent 756c6f8560
commit 5e84cb560d
8 changed files with 38 additions and 17 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.28 - Version 2.02.28 -
================================ ================================
Detect stream write failure reliably; new fn: lvm_fclose; use dm_fclose
Fix clvmd if compiled with gulm support. (2.02.26) Fix clvmd if compiled with gulm support. (2.02.26)
Trivial fix to lvdisplay man page. Trivial fix to lvdisplay man page.
Add vg_lock_and_read() external library function. Add vg_lock_and_read() external library function.

View File

@ -20,6 +20,7 @@
#include "str_list.h" #include "str_list.h"
#include "toolcontext.h" #include "toolcontext.h"
#include "lvm-string.h" #include "lvm-string.h"
#include "lvm-file.h"
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/mman.h> #include <sys/mman.h>
@ -520,8 +521,8 @@ int write_config_file(struct config_tree *cft, const char *file,
argv++; argv++;
} }
if (outline.fp && fclose(outline.fp)) { if (outline.fp && lvm_fclose(outline.fp, file)) {
log_sys_error("fclose", file); stack;
r = 0; r = 0;
} }

View File

@ -239,10 +239,8 @@ int persistent_filter_dump(struct dev_filter *f)
/* _write_array(pf, fp, "invalid_devices", PF_BAD_DEVICE); */ /* _write_array(pf, fp, "invalid_devices", PF_BAD_DEVICE); */
fprintf(fp, "}\n"); fprintf(fp, "}\n");
if (fclose(fp)) { if (lvm_fclose(fp, tmp_file))
log_sys_error("fclose", tmp_file); goto_out;
goto out;
}
if (rename(tmp_file, pf->file)) if (rename(tmp_file, pf->file))
log_error("%s: rename to %s failed: %s", tmp_file, pf->file, log_error("%s: rename to %s failed: %s", tmp_file, pf->file,

View File

@ -261,11 +261,8 @@ int archive_vg(struct volume_group *vg,
return 0; return 0;
} }
if (fclose(fp)) { if (lvm_fclose(fp, temp_file))
log_sys_error("fclose", temp_file); return_0; /* Leave file behind as evidence of failure */
/* Leave file behind as evidence of failure */
return 0;
}
/* /*
* Now we want to rename this file to <vg>_index.vg. * Now we want to rename this file to <vg>_index.vg.

View File

@ -892,10 +892,8 @@ static int _vg_write_file(struct format_instance *fid, struct volume_group *vg,
return 0; return 0;
} }
if (fclose(fp)) { if (lvm_fclose(fp, tc->path_edit))
log_sys_error("fclose", tc->path_edit); return_0;
return 0;
}
if (rename(temp_file, tc->path_edit)) { if (rename(temp_file, tc->path_edit)) {
log_debug("Renaming %s to %s", temp_file, tc->path_edit); log_debug("Renaming %s to %s", temp_file, tc->path_edit);

View File

@ -17,6 +17,7 @@
#include "device.h" #include "device.h"
#include "memlock.h" #include "memlock.h"
#include "lvm-string.h" #include "lvm-string.h"
#include "lvm-file.h"
#include "defaults.h" #include "defaults.h"
#include <stdarg.h> #include <stdarg.h>
@ -121,8 +122,14 @@ void fin_log(void)
} }
if (_log_to_file) { if (_log_to_file) {
if (fclose(_log_file)) if (dm_fclose(_log_file)) {
fprintf(stderr, "fclose() on log file failed: %s", strerror(errno)); if (errno)
fprintf(stderr, "failed to write log file: %s\n",
strerror(errno));
else
fprintf(stderr, "failed to write log file\n");
}
_log_to_file = 0; _log_to_file = 0;
} }
} }

View File

@ -321,3 +321,13 @@ void fcntl_unlock_file(int lockfd)
strerror(errno)); strerror(errno));
} }
int lvm_fclose(FILE *fp, const char *filename)
{
if (!dm_fclose(fp))
return 0;
if (errno == 0)
log_error("%s: write error", filename);
else
log_sys_error("write error", filename);
return EOF;
}

View File

@ -56,4 +56,13 @@ void fcntl_unlock_file(int lockfd);
((buf1).st_ino == (buf2).st_ino && \ ((buf1).st_ino == (buf2).st_ino && \
(buf1).st_dev == (buf2).st_dev) (buf1).st_dev == (buf2).st_dev)
/*
* Close the specified stream, taking care to detect and diagnose any write
* error. If there is an error, use the supplied file name in a diagnostic
* that is reported via log_error or log_sys_error, as appropriate.
* Use this function to close a stream when you've written data to it via
* unchecked fprintf, fputc, etc. calls. Return 0 on success, EOF on failure.
*/
int lvm_fclose(FILE *fp, const char *filename);
#endif #endif