From ad4e634051e18fa5bd07016b6405e53e236c2f45 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 14 Nov 2012 18:29:35 -0600 Subject: [PATCH] afs: Do not skip flushing pages for dv-0 files If the dv for a file is 0, we know the file is empty. Currently we skip flushing pages for such files, presumably the idea being there is no data in the file, so there should be no pages to flush. However, Linux seems to keep empty pages around for empty files. So, a future read can result in the application reading a page full of zeroes, unless we flush the page here. While this has only been found to happen on Linux 2.6.22 and later (and distribution-specific backports, like RHEL 2.6.18-128), other platforms could in theory also choose to do this. It would be difficult to find out when another platform started to behave like this, so just remove this skip for everyone so we never have to deal with this again. Replace this code with a comment with a quick explanation, in case anyone tries to add a similar optimization here in the future. Thanks to Richard Brittain. Change-Id: I68c51bb7612a98a5c75112bb8f4bb1edd949fda1 Reviewed-on: http://gerrit.openafs.org/8465 Reviewed-by: Jeffrey Altman Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/afs/afs_osi_vm.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/afs/afs_osi_vm.c b/src/afs/afs_osi_vm.c index 66071ac9ba..fa278cb40c 100644 --- a/src/afs/afs_osi_vm.c +++ b/src/afs/afs_osi_vm.c @@ -80,11 +80,12 @@ osi_FlushPages(struct vcache *avc, afs_ucred_t *credp) ReleaseWriteLock(&avc->lock); return; } - if (hiszero(avc->mapDV)) { - hset(avc->mapDV, avc->f.m.DataVersion); - ReleaseWriteLock(&avc->lock); - return; - } + + /* At this point, you might think that we can skip trying to flush pages + * if mapDV is zero, since a file with a zero DV will not have any data in + * it. However, some platforms (notably Linux 2.6.22+) will keep a page + * full of zeroes around for an empty file. So play it safe and always + * flush pages. */ AFS_STATCNT(osi_FlushPages); hset(origDV, avc->f.m.DataVersion);