Messages in this thread |  | | | Date | Wed, 18 Nov 2009 17:50:03 +0000 | | From | Jamie Lokier <> | | Subject | Re: [PATCH 1/2] BKL: Remove BKL from default_llseek() |
| |
Oliver Neukum wrote: > Am Mittwoch, 18. November 2009 18:27:30 schrieb Jamie Lokier: > > > No. Your logic is flawed > > > > > > The BKL is protected something here - it protects the change of offset > > > with respect to other BKL users within drivers. The question is what if > > > anything in any other driver code depends upon the BKL and uses it to > > > protect f_pos. Probably very little if anything but a grep for f_pos > > > through the drivers might not be a bad idea before assuming this. Very > > > few touch f_pos except in their own llseek method. > > > > Of course, drivers shouldn't be using f_pos outside their llseek > > method, as they should all behave the same with pread/pwrite as with > > llseek+read/write. > > Might not a driver update f_pos after read/write?
It could indirectly, through *ppos.
There should be no direct accesses to f_pos outseek llseek. If there are still, those might indicate driver bugs. (I'm not 100% sure about this - hence asking).
Drivers used to update f_pos indirectly through *ppos, and for this, Alan's observation about BKL protecting the value from changing does apply.
But nowadays, even that doesn't happen. sys_read() and sys_write() make a copy of f_pos using file_pos_read(), so drivers cannot see the value change during the call - except for their own change.
I find myself wondering why the VFS isn't responsible for the position update instead of the driver... Would it be a valid cleanup to move it from the driver to VFS?
-- Jamie
|  |