diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2023-07-06 01:51:07 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2023-07-18 05:46:13 +0000 |
commit | 868f3eadc5e0b50863c13457074ac1a0b03958dd (patch) | |
tree | 53c9441ae9b55d05e7c612396cad4ba49f72b0e5 | |
parent | 24f72101137d43bd0cf496dcc50b60f85ebbc26a (diff) | |
download | src-868f3eadc5e0b50863c13457074ac1a0b03958dd.tar.gz src-868f3eadc5e0b50863c13457074ac1a0b03958dd.zip |
msdosfs: zero partially valid extended cluster
(cherry picked from commit 7e4c6b2163fbed6be92b1e19f0eec4da973cfaec)
-rw-r--r-- | sys/fs/msdosfs/msdosfs_denode.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c index 59107a6ca2ea..0c58fb4396ce 100644 --- a/sys/fs/msdosfs/msdosfs_denode.c +++ b/sys/fs/msdosfs/msdosfs_denode.c @@ -496,6 +496,7 @@ deextend(struct denode *dep, u_long length, struct ucred *cred) struct msdosfsmount *pmp = dep->de_pmp; struct vnode *vp = DETOV(dep); struct buf *bp; + off_t eof_clusteroff; u_long count; int error; @@ -534,13 +535,19 @@ deextend(struct denode *dep, u_long length, struct ucred *cred) * B_CACHE | B_DELWRI but with invalid pages, and cannot be * neither written out nor validated. * - * Fix it by proactively clearing extended pages. + * Fix it by proactively clearing extended pages. Need to do + * both vfs_bio_clrbuf() to mark pages valid, and to zero + * actual buffer content which might exist in the tail of the + * already valid cluster. */ error = bread(vp, de_cluster(pmp, dep->de_FileSize), pmp->pm_bpcluster, NOCRED, &bp); if (error != 0) goto rewind; vfs_bio_clrbuf(bp); + eof_clusteroff = de_cn2off(pmp, de_cluster(pmp, dep->de_FileSize)); + vfs_bio_bzero_buf(bp, dep->de_FileSize - eof_clusteroff, + pmp->pm_bpcluster - dep->de_FileSize + eof_clusteroff); if (!DOINGASYNC(vp)) (void)bwrite(bp); else if (vm_page_count_severe() || buf_dirty_count_severe()) |