@@ -728,6 +728,32 @@ finish_progress(char *done)
728
728
pt_header = NULL ;
729
729
}
730
730
731
+ /* This function checks if the passed fd refers to /dev/null or /dev/zero */
732
+ #ifdef __linux__
733
+ static boolean_t
734
+ is_dev_nullzero (int fd )
735
+ {
736
+ struct stat st ;
737
+ fstat (fd , & st );
738
+ return (major (st .st_rdev ) == 1 && (minor (st .st_rdev ) == 3 /* null */ ||
739
+ minor (st .st_rdev ) == 5 /* zero */ ));
740
+ }
741
+ #endif
742
+
743
+ static void
744
+ note_dev_error (int err , int fd )
745
+ {
746
+ #ifdef __linux__
747
+ if (err == EINVAL && is_dev_nullzero (fd )) {
748
+ (void ) fprintf (stderr ,
749
+ gettext ("Error: Writing directly to /dev/{null,zero} files"
750
+ " on certain kernels is not currently implemented.\n"
751
+ "(As a workaround, "
752
+ "try \"zfs send [...] | cat > /dev/null\")\n" ));
753
+ }
754
+ #endif
755
+ }
756
+
731
757
static int
732
758
zfs_mount_and_share (libzfs_handle_t * hdl , const char * dataset , zfs_type_t type )
733
759
{
@@ -4572,11 +4598,16 @@ zfs_do_send(int argc, char **argv)
4572
4598
4573
4599
err = zfs_send_saved (zhp , & flags , STDOUT_FILENO ,
4574
4600
resume_token );
4601
+ if (err != 0 )
4602
+ note_dev_error (errno , STDOUT_FILENO );
4575
4603
zfs_close (zhp );
4576
4604
return (err != 0 );
4577
4605
} else if (resume_token != NULL ) {
4578
- return (zfs_send_resume (g_zfs , & flags , STDOUT_FILENO ,
4579
- resume_token ));
4606
+ err = zfs_send_resume (g_zfs , & flags , STDOUT_FILENO ,
4607
+ resume_token );
4608
+ if (err != 0 )
4609
+ note_dev_error (errno , STDOUT_FILENO );
4610
+ return (err );
4580
4611
}
4581
4612
4582
4613
if (flags .skipmissing && !flags .replicate ) {
@@ -4627,6 +4658,8 @@ zfs_do_send(int argc, char **argv)
4627
4658
err = zfs_send_one (zhp , fromname , STDOUT_FILENO , & flags ,
4628
4659
redactbook );
4629
4660
zfs_close (zhp );
4661
+ if (err != 0 )
4662
+ note_dev_error (errno , STDOUT_FILENO );
4630
4663
return (err != 0 );
4631
4664
}
4632
4665
@@ -4703,6 +4736,7 @@ zfs_do_send(int argc, char **argv)
4703
4736
nvlist_free (dbgnv );
4704
4737
}
4705
4738
zfs_close (zhp );
4739
+ note_dev_error (errno , STDOUT_FILENO );
4706
4740
4707
4741
return (err != 0 );
4708
4742
}
0 commit comments