1
0
mirror of https://github.com/facebook/zstd.git synced 2025-07-30 22:23:13 +03:00

Check regular file for sparse support after opening

A regular file may be created by the open call.
Checking after opening allows sparseFileSupport even
if dstFileName does not already exist.
This commit is contained in:
Li-Yu Yu
2025-03-28 21:16:29 +00:00
parent c5926fbab8
commit 3bd5aa3404
3 changed files with 22 additions and 12 deletions

View File

@ -585,8 +585,6 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs,
const char* srcFileName, const char* dstFileName,
const int mode)
{
int isDstRegFile;
if (prefs->testMode) return NULL; /* do not open file in test mode */
assert(dstFileName != NULL);
@ -606,16 +604,7 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs,
return NULL;
}
isDstRegFile = UTIL_isRegularFile(dstFileName); /* invoke once */
if (prefs->sparseFileSupport == 1) {
prefs->sparseFileSupport = ZSTD_SPARSE_DEFAULT;
if (!isDstRegFile) {
prefs->sparseFileSupport = 0;
DISPLAYLEVEL(4, "Sparse File Support is disabled when output is not a file \n");
}
}
if (isDstRegFile) {
if (UTIL_isRegularFile(dstFileName)) {
/* Check if destination file already exists */
#if !defined(_WIN32)
/* this test does not work on Windows :
@ -658,6 +647,16 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs,
f = fdopen(fd, "wb");
}
#endif
if (prefs->sparseFileSupport == 1) {
prefs->sparseFileSupport = ZSTD_SPARSE_DEFAULT;
/* Check regular file after opening with O_CREAT */
if (!UTIL_isFdRegularFile(fd)) {
prefs->sparseFileSupport = 0;
DISPLAYLEVEL(4, "Sparse File Support is disabled when output is not a file \n");
}
}
if (f == NULL) {
if (UTIL_isFileDescriptorPipe(dstFileName)) {
DISPLAYLEVEL(1, "zstd: error: no output specified (use -o or -c). \n");

View File

@ -197,6 +197,16 @@ int UTIL_stat(const char* filename, stat_t* statbuf)
return UTIL_fstat(-1, filename, statbuf);
}
int UTIL_isFdRegularFile(int fd)
{
stat_t statbuf;
int ret;
UTIL_TRACE_CALL("UTIL_isFdRegularFile(%d)", fd);
ret = UTIL_fstat(fd, "", &statbuf) && UTIL_isRegularFileStat(&statbuf);
UTIL_TRACE_RET(ret);
return ret;
}
int UTIL_isRegularFile(const char* infilename)
{
stat_t statbuf;

View File

@ -184,6 +184,7 @@ int UTIL_fchmod(const int fd, char const* filename, const stat_t* statbuf, mode_
* compute the needed information.
*/
int UTIL_isFdRegularFile(int fd);
int UTIL_isRegularFile(const char* infilename);
int UTIL_isDirectory(const char* infilename);
int UTIL_isSameFile(const char* file1, const char* file2);