Module Name: src Committed By: reinoud Date: Sat Jun 27 13:42:06 UTC 2009
Modified Files: src/sys/fs/udf: udf_allocation.c Log Message: Fix corner-case in truncing files. It could forget to free the last block. This would result in a free-space map with one block orphaned. To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/sys/fs/udf/udf_allocation.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_allocation.c diff -u src/sys/fs/udf/udf_allocation.c:1.26 src/sys/fs/udf/udf_allocation.c:1.27 --- src/sys/fs/udf/udf_allocation.c:1.26 Wed Jun 24 17:09:13 2009 +++ src/sys/fs/udf/udf_allocation.c Sat Jun 27 13:42:06 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_allocation.c,v 1.26 2009/06/24 17:09:13 reinoud Exp $ */ +/* $NetBSD: udf_allocation.c,v 1.27 2009/06/27 13:42:06 reinoud Exp $ */ /* * Copyright (c) 2006, 2008 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: udf_allocation.c,v 1.26 2009/06/24 17:09:13 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_allocation.c,v 1.27 2009/06/27 13:42:06 reinoud Exp $"); #endif /* not lint */ @@ -2616,7 +2616,7 @@ uint64_t foffset, end_foffset; uint64_t orig_inflen, orig_lbrec, new_inflen, new_lbrec; uint32_t lb_size, dscr_size, crclen; - uint32_t slot_offset; + uint32_t slot_offset, slot_offset_lb; uint32_t len, flags, max_len; uint32_t num_lb, lb_num; uint32_t max_l_ad, l_ad, l_ea; @@ -2762,9 +2762,13 @@ vpart_num = udf_rw16(s_ad.loc.part_num); if (flags == UDF_EXT_ALLOCATED) { - /* note: round DOWN on num_lb */ - lb_num += (slot_offset + lb_size -1) / lb_size; - num_lb = (len - slot_offset) / lb_size; + /* calculate extent in lb, and offset in lb */ + num_lb = (len + lb_size -1) / lb_size; + slot_offset_lb = (slot_offset + lb_size -1) / lb_size; + + /* adjust our slot */ + lb_num += slot_offset_lb; + num_lb -= slot_offset_lb; udf_free_allocated_space(ump, lb_num, vpart_num, num_lb); }