On Fri, Jun 06, 2014 at 04:06:47PM -0500, Eric Sandeen wrote:
> Test for lseek, ftruncate, and fsync failures in packfile()
>
> Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
> ---
Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx>
>
> diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c
> index 8b191e6..48629fd 100644
> --- a/fsr/xfs_fsr.c
> +++ b/fsr/xfs_fsr.c
> @@ -1325,7 +1325,11 @@ packfile(char *fname, char *tname, int fd,
> fsrprintf(_("could not trunc tmp %s\n"),
> tname);
> }
> - lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR);
> + if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) <
> 0) {
> + fsrprintf(_("could not lseek in tmpfile: %s :
> %s\n"),
> + tname, strerror(errno));
> + goto out;
> + }
> continue;
> } else if (outmap[extent].bmv_length == 0) {
> /* to catch holes at the beginning of the file */
> @@ -1341,7 +1345,11 @@ packfile(char *fname, char *tname, int fd,
> " %s\n"), tname);
> goto out;
> }
> - lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR);
> + if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) <
> 0) {
> + fsrprintf(_("could not lseek in tmpfile: %s :
> %s\n"),
> + tname, strerror(errno));
> + goto out;
> + }
> }
> } /* end of space allocation loop */
>
> @@ -1365,8 +1373,16 @@ packfile(char *fname, char *tname, int fd,
> for (extent = 0; extent < nextents; extent++) {
> pos = outmap[extent].bmv_offset;
> if (outmap[extent].bmv_block == -1) {
> - lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR);
> - lseek64(fd, outmap[extent].bmv_length, SEEK_CUR);
> + if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) <
> 0) {
> + fsrprintf(_("could not lseek in tmpfile: %s :
> %s\n"),
> + tname, strerror(errno));
> + goto out;
> + }
> + if (lseek64(fd, outmap[extent].bmv_length, SEEK_CUR) <
> 0) {
> + fsrprintf(_("could not lseek in file: %s :
> %s\n"),
> + fname, strerror(errno));
> + goto out;
> + }
> continue;
> } else if (outmap[extent].bmv_length == 0) {
> /* to catch holes at the beginning of the file */
> @@ -1442,8 +1458,16 @@ packfile(char *fname, char *tname, int fd,
> }
> }
> }
> - ftruncate64(tfd, statp->bs_size);
> - fsync(tfd);
> + if (ftruncate64(tfd, statp->bs_size) < 0) {
> + fsrprintf(_("could not truncate tmpfile: %s : %s\n"),
> + fname, strerror(errno));
> + goto out;
> + }
> + if (fsync(tfd) < 0) {
> + fsrprintf(_("could not fsync tmpfile: %s : %s\n"),
> + fname, strerror(errno));
> + goto out;
> + }
>
> sx.sx_stat = *statp; /* struct copy */
> sx.sx_version = XFS_SX_VERSION;
>
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs
|