btrfs-progs: skip non-regular files while defragmenting
PATCH 1/1 btrfs-progs: skip non-regular files while defragmenting
Skip non-regular files to avoid ioctl errors while defragmenting.
They are silently ignored in recursive mode but reported as errors when used as command-line arguments.
Signed-off-by Pascal VITOUX <[email protected]>
--- cmds-filesystem.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-)
cmds-filesystem.c +16 -10
@@ -646,7 +646,7 @@ static int defrag_callback(const char *fpath, const struct stat *sb,int e =0 ;int fd =0 ; -if (typeflag ==FTW_F ) { +if ((typeflag ==FTW_F ) &&S_ISREG (sb->st_mode)) {if (defrag_global_verbose)printf ("%s\n" , fpath); fd =open (fpath,O_RDWR );
@@ -748,6 +748,7 @@ static int cmd_defrag(int argc, char **argv) defrag_global_range.flags |=BTRFS_DEFRAG_RANGE_START_IO ;for (i = optind; i < argc; i++) { +struct stat st; dirstream =NULL ; fd =open_file_or_dir (argv[i], &dirstream);if (fd <0 ) {
@@ -757,16 +758,21 @@ static int cmd_defrag(int argc, char **argv)close_file_or_dir (fd, dirstream);continue ; } +if (fstat (fd, &st)) { +fprintf (stderr,"ERROR: failed to stat %s - %s\n" , + argv[i],strerror (errno)); + defrag_global_errors++; +close_file_or_dir (fd, dirstream); +continue ; + } +if (!(S_ISDIR (st.st_mode) ||S_ISREG (st.st_mode))) { +fprintf (stderr,"ERROR: %s is not a directory or a regular " +"file.\n" , argv[i]); + defrag_global_errors++; +close_file_or_dir (fd, dirstream); +continue ; + }if (recursive) { -struct stat st; - -if (fstat (fd, &st)) { -fprintf (stderr,"ERROR: failed to stat %s - %s\n" , - argv[i],strerror (errno)); - defrag_global_errors++; -close_file_or_dir (fd, dirstream); -continue ; - }if (S_ISDIR (st.st_mode)) { ret =nftw (argv[i], defrag_callback,10 ,FTW_MOUNT |FTW_PHYS );
Signature · 1 line
1.8.5.2
Quoted 4 lines · Pascal VITOUX
Skip non-regular files to avoid ioctl errors while defragmenting.
They are silently ignored in recursive mode but reported as errors when used as command-line arguments.
Nice, thanks, added to integration.