Module Name: src Committed By: martin Date: Sun Mar 13 09:44:33 UTC 2022
Modified Files: src/sys/fs/udf [netbsd-9]: udf_strat_sequential.c udf_subr.c Log Message: Pull up following revision(s) (requested by reinoud in ticket #1431): sys/fs/udf/udf_strat_sequential.c: revision 1.16 sys/fs/udf/udf_subr.c: revision 1.167 On switching from writing to reading explicitly synchronize the caches. It isn't strictly needed but some devices in the wild will otherwise bluntly ignore all reading commands resulting in a kernel and device lockup. For bug-compatibility with Windows, the last VAT sector must be a multiple of 16/32 from the start of the track. To allow for scratches, write out at least a 32 pieces. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.15.22.1 src/sys/fs/udf/udf_strat_sequential.c cvs rdiff -u -r1.146 -r1.146.2.1 src/sys/fs/udf/udf_subr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/fs/udf/udf_strat_sequential.c diff -u src/sys/fs/udf/udf_strat_sequential.c:1.15 src/sys/fs/udf/udf_strat_sequential.c:1.15.22.1 --- src/sys/fs/udf/udf_strat_sequential.c:1.15 Tue May 24 09:55:57 2016 +++ src/sys/fs/udf/udf_strat_sequential.c Sun Mar 13 09:44:33 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_strat_sequential.c,v 1.15 2016/05/24 09:55:57 reinoud Exp $ */ +/* $NetBSD: udf_strat_sequential.c,v 1.15.22.1 2022/03/13 09:44:33 martin Exp $ */ /* * Copyright (c) 2006, 2008 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: udf_strat_sequential.c,v 1.15 2016/05/24 09:55:57 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_strat_sequential.c,v 1.15.22.1 2022/03/13 09:44:33 martin Exp $"); #endif /* not lint */ @@ -549,6 +549,8 @@ udf_doshedule(struct udf_mount *ump) if (new_queue != priv->cur_queue) { DPRINTF(SHEDULE, ("switching from %d to %d\n", priv->cur_queue, new_queue)); + if (new_queue == UDF_SHED_READING) + udf_mmc_synchronise_caches(ump); } priv->cur_queue = new_queue; Index: src/sys/fs/udf/udf_subr.c diff -u src/sys/fs/udf/udf_subr.c:1.146 src/sys/fs/udf/udf_subr.c:1.146.2.1 --- src/sys/fs/udf/udf_subr.c:1.146 Mon Jun 3 06:04:20 2019 +++ src/sys/fs/udf/udf_subr.c Sun Mar 13 09:44:33 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_subr.c,v 1.146 2019/06/03 06:04:20 msaitoh Exp $ */ +/* $NetBSD: udf_subr.c,v 1.146.2.1 2022/03/13 09:44:33 martin Exp $ */ /* * Copyright (c) 2006, 2008 Reinoud Zandijk @@ -29,7 +29,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.146 2019/06/03 06:04:20 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.146.2.1 2022/03/13 09:44:33 martin Exp $"); #endif /* not lint */ @@ -3770,10 +3770,11 @@ udf_close_logvol(struct udf_mount *ump, { struct vnode *devvp = ump->devvp; struct mmc_op mmc_op; + uint32_t phys; int logvol_integrity; int error = 0, error1 = 0, error2 = 0; int tracknr; - int nvats, n, nok; + int nvats, n, relblk, wrtrack_skew, nok; /* already/still closed? */ logvol_integrity = udf_rw32(ump->logvol_integrity->integrity_type); @@ -3794,8 +3795,17 @@ udf_close_logvol(struct udf_mount *ump, DPRINTF(VOLUMES, ("writeout vat_node\n")); udf_writeout_vat(ump); - /* at least two DVD packets and 3 CD-R packets */ - nvats = 32; + /* + * For bug-compatibility with Windows, the last VAT sector + * must be a multiple of 16/32 from the start of the track. + * To allow for scratches, write out at least a 32 pieces. + */ + phys = ump->data_track.track_start; + wrtrack_skew = phys % 32; + + phys = ump->data_track.next_writable; + relblk = phys % 32; + nvats = 32 + 32 - (relblk - wrtrack_skew); #if notyet /*