qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] 9pfs: local: ignore O_NOATIME if we don't have permissions


From: Omar Sandoval
Subject: Re: [PATCH] 9pfs: local: ignore O_NOATIME if we don't have permissions
Date: Fri, 17 Apr 2020 11:36:01 -0700

On Fri, Apr 17, 2020 at 12:45:36PM +0200, Christian Schoenebeck wrote:
> On Donnerstag, 16. April 2020 20:47:11 CEST Omar Sandoval wrote:
> > > > Luckily, O_NOATIME is effectively a hint, and is often ignored by, e.g.,
> > > > network filesystems. open(2) notes that O_NOATIME "may not be effective
> > > > on all filesystems. One example is NFS, where the server maintains the
> > > > access time." This means that we can honor it when possible but fall
> > > > back to ignoring it.
> > > 
> > > I am not sure whether NFS would simply silently ignore O_NOATIME i.e.
> > > without returning EPERM. I don't read it that way.
> > 
> > As far as I can tell, the NFS protocol has nothing equivalent to
> > O_NOATIME and thus can't honor it. Feel free to test it:
> 
> I did not doubt that NFS does not support O_NOATIME, what I said was that I 
> thought using O_NOATIME on NFS would return EPERM, but ...
> 
> >   # mount -t nfs -o vers=4,rw 10.0.2.2:/ /mnt
> >   # echo foo > /mnt/foo
> >   # touch -d "1 hour ago" /mnt/foo
> >   # stat /mnt/foo | grep 'Access: [0-9]'
> >   Access: 2020-04-16 10:43:36.838952593 -0700
> >   # # Drop caches so we have to go to the NFS server.
> >   # echo 3 > /proc/sys/vm/drop_caches
> >   # strace -e openat dd if=/mnt/foo of=/dev/null iflag=noatime |& grep
> > /mnt/foo openat(AT_FDCWD, "/mnt/foo", O_RDONLY|O_NOATIME) = 3
> >   # stat /mnt/foo | grep 'Access: [0-9]'
> >   Access: 2020-04-16 11:43:36.906462928 -0700
> 
> ... I tried this as well, and you are right, O_NOATIME is indeed simply 
> *silently* dropped/ignored by NFS (i.e. without raising any error).
> 
> > > It would certainly fix the problem in your use case. But it would also
> > > unmask O_NOATIME for all other ones (i.e. regular users on guest).
> > 
> > The guest kernel will still check whether processes on the guest have
> > permission to use O_NOATIME. This only changes the behavior when the
> > guest kernel believes that the process has permission even though the
> > host QEMU process doesn't.
> 
> Good point!
> 
> > > I mean I understand your point, but I also have to take other use cases
> > > into account which might expect to receive EPERM if O_NOATIME cannot be
> > > granted.
> > If you'd still like to preserve this behavior, would it be acceptable to
> > make this a QEMU option? Maybe something like "-virtfs
> > honor_noatime=no": the default would be "yes", which is the current
> > behavior, and "no" would always mask out NOATIME.
> 
> That was my initial tendency yesterday, but your arguments now convinced me 
> that the implied re-run, in the way your provided patch already does, is in 
> this particular case the better choice.
> 
> Making that a configurable option would render this issue unnecessarily 
> complicated and probably even contra productive for other users which might 
> stumble over the same issue.
> 
> Just do me a favour: you already thoroughly explained the issue in the commit 
> log, that's good, but please also add a short comment in code why the rerun 
> is 
> required, because it is not obvious by just reading the code. Finding that 
> info from git log becomes tedious as soon as code is refactored there.
> 
> Aside of the missing comment in code:
> 
> Acked-by: Christian Schoenebeck <address@hidden>

Thank you! I'll add the comment and resend.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]