On Tue, 25 Oct 2022 14:33:15 +0200
Greg Kurz <gr...@kaod.org> wrote:

> On Tue, 25 Oct 2022 11:21:19 +0200
> Paolo Bonzini <pbonz...@redhat.com> wrote:
> 
> > log_append makes sure that if you turn off the logging (which clears
> > log_flags and makes need_to_open_file false) the old log is not
> > overwritten.  The usecase is that if you remove or move the file
> > QEMU will not keep writing to the old file.  However, this is
> > not always the desited behavior, in particular having log_append==1
> > after changing the file name makes little sense.
> > 
> > When qemu_set_log_internal is called from the logfile monitor
> > command, filename must be non-NULL and therefore changed_name must
> > be true.  Therefore, the only case where the file is closed and
> > need_to_open_file == false is indeed when log_flags becomes
> > zero.  In this case, just flush the file and do not bother
> > closing it, thus faking the same append behavior as previously.
> > 
> > The behavioral change is that changing the logfile twice, for
> > example log1 -> log2 -> log1, will cause log1 to be overwritten.
> > This can simply be documented, since it is not a particularly
> > surprising behavior.
> > 
> > Suggested-by: Alex Bennée <alex.ben...@linaro.org>
> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
> > ---
> 
> Heh I currently have a very similar patch in my tree :-)
> 
> Reviewed-by: Greg Kurz <gr...@kaod.org>
> 
> I'll include this and other bug fixes as prerequisites for my
> on-going work on logging when daemonized.
> 
> >  util/log.c | 13 +++++--------
> >  1 file changed, 5 insertions(+), 8 deletions(-)
> > 
> > diff --git a/util/log.c b/util/log.c
> > index d6eb0378c3a3..06d0173788dc 100644
> > --- a/util/log.c
> > +++ b/util/log.c
> > @@ -44,7 +44,6 @@ static FILE *global_file;
> >  static __thread FILE *thread_file;
> >  
> >  int qemu_loglevel;
> > -static bool log_append;
> >  static bool log_per_thread;
> >  static GArray *debug_regions;
> >  
> > @@ -259,19 +258,19 @@ static bool qemu_set_log_internal(const char 
> > *filename, bool changed_name,
> >      daemonized = is_daemonized();
> >      need_to_open_file = log_flags && !per_thread && (!daemonized || 
> > filename);
> >  
> > -    if (logfile && (!need_to_open_file || changed_name)) {
> > -        qatomic_rcu_set(&global_file, NULL);

Hmm... wait, shouldn't this NULLifying be performed...

> > -        if (logfile != stderr) {
> > +    if (logfile) {
> > +        fflush(logfile);
> > +        if (changed_name && logfile != stderr) {
> >              RCUCloseFILE *r = g_new0(RCUCloseFILE, 1);
> >              r->fd = logfile;


... here since we the following closes the global_file ?

> >              call_rcu(r, rcu_close_file, rcu);
> > +            logfile = NULL;
> >          }
> > -        logfile = NULL;
> >      }
> >  
> >      if (!logfile && need_to_open_file) {
> >          if (filename) {
> > -            logfile = fopen(filename, log_append ? "a" : "w");
> > +            logfile = fopen(filename, "w");
> >              if (!logfile) {
> >                  error_setg_errno(errp, errno, "Error opening logfile %s",
> >                                   filename);
> > @@ -290,8 +289,6 @@ static bool qemu_set_log_internal(const char *filename, 
> > bool changed_name,
> >              logfile = stderr;
> >          }
> >  
> > -        log_append = 1;
> > -
> >          qatomic_rcu_set(&global_file, logfile);
> >      }
> >      return true;
> 
> 


Reply via email to