Re: [PATCH 3/4] libxfs: return flush failures

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 06, 2020 at 12:38:06PM -0700, Allison Collins wrote:
> 
> On 2/4/20 5:47 PM, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
> > 
> > Modify platform_flush_device so that we can return error status when
> > device flushes fail.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
> I think there's one other place in init.c where platform_flush_device is
> called, but I suppose it didn't need the return code before?

I think the lack of error checking is/was just plain broken, seeing as
the current libxfs_close() code path just eats errors.

However, now that everyone calls libxfs_flush() to find out which
devices (if any) succeeded in flushing, I think there's less need to go
reworking that whole code path.

--D

> Other than that it looks ok.

> Reviewed-by: Allison Collins <allison.henderson@xxxxxxxxxx>
> 
> > ---
> >   libfrog/linux.c    |   25 +++++++++++++++++--------
> >   libfrog/platform.h |    2 +-
> >   2 files changed, 18 insertions(+), 9 deletions(-)
> > 
> > 
> > diff --git a/libfrog/linux.c b/libfrog/linux.c
> > index 41a168b4..60bc1dc4 100644
> > --- a/libfrog/linux.c
> > +++ b/libfrog/linux.c
> > @@ -140,20 +140,29 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata
> >   	return error;
> >   }
> > -void
> > -platform_flush_device(int fd, dev_t device)
> > +/*
> > + * Flush dirty pagecache and disk write cache to stable media.  Returns 0 for
> > + * success or -1 (with errno set) for failure.
> > + */
> > +int
> > +platform_flush_device(
> > +	int		fd,
> > +	dev_t		device)
> >   {
> >   	struct stat	st;
> > +	int		ret;
> > +
> >   	if (major(device) == RAMDISK_MAJOR)
> > -		return;
> > +		return 0;
> > -	if (fstat(fd, &st) < 0)
> > -		return;
> > +	ret = fstat(fd, &st);
> > +	if (ret)
> > +		return ret;
> >   	if (S_ISREG(st.st_mode))
> > -		fsync(fd);
> > -	else
> > -		ioctl(fd, BLKFLSBUF, 0);
> > +		return fsync(fd);
> > +
> > +	return ioctl(fd, BLKFLSBUF, 0);
> >   }
> >   void
> > diff --git a/libfrog/platform.h b/libfrog/platform.h
> > index 76887e5e..0aef318a 100644
> > --- a/libfrog/platform.h
> > +++ b/libfrog/platform.h
> > @@ -12,7 +12,7 @@ int platform_check_ismounted(char *path, char *block, struct stat *sptr,
> >   int platform_check_iswritable(char *path, char *block, struct stat *sptr);
> >   int platform_set_blocksize(int fd, char *path, dev_t device, int bsz,
> >   		int fatal);
> > -void platform_flush_device(int fd, dev_t device);
> > +int platform_flush_device(int fd, dev_t device);
> >   char *platform_findrawpath(char *path);
> >   char *platform_findblockpath(char *path);
> >   int platform_direct_blockdev(void);
> > 



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux