* [PATCH] /proc/kcore: fix seeking @ 2011-01-10 14:42 Dave Anderson 2011-01-11 0:52 ` Frederic Weisbecker 2011-01-11 16:04 ` Américo Wang 0 siblings, 2 replies; 7+ messages in thread From: Dave Anderson @ 2011-01-10 14:42 UTC (permalink / raw) To: linux-kernel; +Cc: fweisbec [-- Attachment #1: Type: text/plain, Size: 646 bytes --] From: Dave Anderson <anderson@redhat.com> Commit 34aacb2920667d405a8df15968b7f71ba46c8f18 ("procfs: Use generic_file_llseek in /proc/kcore") broke seeking on /proc/kcore. This changes it back to use default_llseek in order to restore the original behavior. The problem with generic_file_llseek is that it only allows seeks up to inode->i_sb->s_maxbytes, which is 2GB-1 on procfs, where the memory file offset values in the /proc/kcore PT_LOAD segments may exceed or start beyond that offset value. A similar revert was made for /proc/vmcore. Signed-off-by: Dave Anderson <anderson@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> -- [-- Attachment #2: kcore.patch --] [-- Type: text/x-patch, Size: 340 bytes --] --- linux-2.6.37/fs/proc/kcore.c.orig +++ linux-2.6.37/fs/proc/kcore.c @@ -558,7 +558,7 @@ static int open_kcore(struct inode *inod static const struct file_operations proc_kcore_operations = { .read = read_kcore, .open = open_kcore, - .llseek = generic_file_llseek, + .llseek = default_llseek, }; #ifdef CONFIG_MEMORY_HOTPLUG ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] /proc/kcore: fix seeking 2011-01-10 14:42 [PATCH] /proc/kcore: fix seeking Dave Anderson @ 2011-01-11 0:52 ` Frederic Weisbecker 2011-01-11 16:04 ` Américo Wang 1 sibling, 0 replies; 7+ messages in thread From: Frederic Weisbecker @ 2011-01-11 0:52 UTC (permalink / raw) To: Dave Anderson, Andrew Morton; +Cc: linux-kernel, stable (Adding stable and Andrew in Cc) On Mon, Jan 10, 2011 at 09:42:29AM -0500, Dave Anderson wrote: > From: Dave Anderson <anderson@redhat.com> > > Commit 34aacb2920667d405a8df15968b7f71ba46c8f18 > ("procfs: Use generic_file_llseek in /proc/kcore") > broke seeking on /proc/kcore. This changes it back > to use default_llseek in order to restore the original > behavior. > > The problem with generic_file_llseek is that it only > allows seeks up to inode->i_sb->s_maxbytes, which is > 2GB-1 on procfs, where the memory file offset values in > the /proc/kcore PT_LOAD segments may exceed or start > beyond that offset value. > > A similar revert was made for /proc/vmcore. > > Signed-off-by: Dave Anderson <anderson@redhat.com> > Cc: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Frederic Weisbecker <fweisbec@gmail.com> In the longer term, I guess default_llseek should disappear and replaced with generic_file_llseek(), tweaking the sb->s_maxbytes with the appropriate values in each filesystems. Thanks for this fix! > --- linux-2.6.37/fs/proc/kcore.c.orig > +++ linux-2.6.37/fs/proc/kcore.c > @@ -558,7 +558,7 @@ static int open_kcore(struct inode *inod > static const struct file_operations proc_kcore_operations = { > .read = read_kcore, > .open = open_kcore, > - .llseek = generic_file_llseek, > + .llseek = default_llseek, > }; > > #ifdef CONFIG_MEMORY_HOTPLUG ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] /proc/kcore: fix seeking 2011-01-10 14:42 [PATCH] /proc/kcore: fix seeking Dave Anderson 2011-01-11 0:52 ` Frederic Weisbecker @ 2011-01-11 16:04 ` Américo Wang 2011-01-11 16:23 ` Frederic Weisbecker 1 sibling, 1 reply; 7+ messages in thread From: Américo Wang @ 2011-01-11 16:04 UTC (permalink / raw) To: Dave Anderson; +Cc: linux-kernel, fweisbec On Mon, Jan 10, 2011 at 09:42:29AM -0500, Dave Anderson wrote: >From: Dave Anderson <anderson@redhat.com> > >Commit 34aacb2920667d405a8df15968b7f71ba46c8f18 >("procfs: Use generic_file_llseek in /proc/kcore") >broke seeking on /proc/kcore. This changes it back >to use default_llseek in order to restore the original >behavior. > >The problem with generic_file_llseek is that it only >allows seeks up to inode->i_sb->s_maxbytes, which is >2GB-1 on procfs, where the memory file offset values in >the /proc/kcore PT_LOAD segments may exceed or start >beyond that offset value. > Is the race solved? Using default_llseek() still races with read_kcore() on fpos, AFAIK. -- Live like a child, think like the god. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] /proc/kcore: fix seeking 2011-01-11 16:04 ` Américo Wang @ 2011-01-11 16:23 ` Frederic Weisbecker 2011-01-14 9:44 ` Américo Wang 0 siblings, 1 reply; 7+ messages in thread From: Frederic Weisbecker @ 2011-01-11 16:23 UTC (permalink / raw) To: Américo Wang; +Cc: Dave Anderson, linux-kernel On Wed, Jan 12, 2011 at 12:04:37AM +0800, Américo Wang wrote: > On Mon, Jan 10, 2011 at 09:42:29AM -0500, Dave Anderson wrote: > >From: Dave Anderson <anderson@redhat.com> > > > >Commit 34aacb2920667d405a8df15968b7f71ba46c8f18 > >("procfs: Use generic_file_llseek in /proc/kcore") > >broke seeking on /proc/kcore. This changes it back > >to use default_llseek in order to restore the original > >behavior. > > > >The problem with generic_file_llseek is that it only > >allows seeks up to inode->i_sb->s_maxbytes, which is > >2GB-1 on procfs, where the memory file offset values in > >the /proc/kcore PT_LOAD segments may exceed or start > >beyond that offset value. > > > > Is the race solved? Using default_llseek() still races > with read_kcore() on fpos, AFAIK. Hmm, how does it race there? read_kcore() manipulates fpos, which can't be changed behind us inside the read callback as it's a snapshot. Also read_kcore() can change the value of fpos, which is writed back to file->fpos from sys_read(). So the last resulting race here the natural one between seeking and reading, which is up to the user to take care of. Or am I missing something? ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] /proc/kcore: fix seeking 2011-01-11 16:23 ` Frederic Weisbecker @ 2011-01-14 9:44 ` Américo Wang 2011-01-14 16:29 ` Frederic Weisbecker 0 siblings, 1 reply; 7+ messages in thread From: Américo Wang @ 2011-01-14 9:44 UTC (permalink / raw) To: Frederic Weisbecker; +Cc: Américo Wang, Dave Anderson, linux-kernel On Tue, Jan 11, 2011 at 05:23:23PM +0100, Frederic Weisbecker wrote: >On Wed, Jan 12, 2011 at 12:04:37AM +0800, Américo Wang wrote: >> On Mon, Jan 10, 2011 at 09:42:29AM -0500, Dave Anderson wrote: >> >From: Dave Anderson <anderson@redhat.com> >> > >> >Commit 34aacb2920667d405a8df15968b7f71ba46c8f18 >> >("procfs: Use generic_file_llseek in /proc/kcore") >> >broke seeking on /proc/kcore. This changes it back >> >to use default_llseek in order to restore the original >> >behavior. >> > >> >The problem with generic_file_llseek is that it only >> >allows seeks up to inode->i_sb->s_maxbytes, which is >> >2GB-1 on procfs, where the memory file offset values in >> >the /proc/kcore PT_LOAD segments may exceed or start >> >beyond that offset value. >> > >> >> Is the race solved? Using default_llseek() still races >> with read_kcore() on fpos, AFAIK. > >Hmm, how does it race there? > >read_kcore() manipulates fpos, which can't be changed behind >us inside the read callback as it's a snapshot. Also read_kcore() >can change the value of fpos, which is writed back to file->fpos >from sys_read(). > >So the last resulting race here the natural one between >seeking and reading, which is up to the user to take care >of. Hmm, I just read the changelog of commit 34aacb2920667d405a8df15968b7f71ba46c8f18, which claims to fix the race. So anything changed in vfs layer after that? Thanks. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] /proc/kcore: fix seeking 2011-01-14 9:44 ` Américo Wang @ 2011-01-14 16:29 ` Frederic Weisbecker 2011-01-17 8:06 ` Américo Wang 0 siblings, 1 reply; 7+ messages in thread From: Frederic Weisbecker @ 2011-01-14 16:29 UTC (permalink / raw) To: Américo Wang; +Cc: Dave Anderson, linux-kernel On Fri, Jan 14, 2011 at 05:44:42PM +0800, Américo Wang wrote: > On Tue, Jan 11, 2011 at 05:23:23PM +0100, Frederic Weisbecker wrote: > >On Wed, Jan 12, 2011 at 12:04:37AM +0800, Américo Wang wrote: > >> On Mon, Jan 10, 2011 at 09:42:29AM -0500, Dave Anderson wrote: > >> >From: Dave Anderson <anderson@redhat.com> > >> > > >> >Commit 34aacb2920667d405a8df15968b7f71ba46c8f18 > >> >("procfs: Use generic_file_llseek in /proc/kcore") > >> >broke seeking on /proc/kcore. This changes it back > >> >to use default_llseek in order to restore the original > >> >behavior. > >> > > >> >The problem with generic_file_llseek is that it only > >> >allows seeks up to inode->i_sb->s_maxbytes, which is > >> >2GB-1 on procfs, where the memory file offset values in > >> >the /proc/kcore PT_LOAD segments may exceed or start > >> >beyond that offset value. > >> > > >> > >> Is the race solved? Using default_llseek() still races > >> with read_kcore() on fpos, AFAIK. > > > >Hmm, how does it race there? > > > >read_kcore() manipulates fpos, which can't be changed behind > >us inside the read callback as it's a snapshot. Also read_kcore() > >can change the value of fpos, which is writed back to file->fpos > >from sys_read(). > > > >So the last resulting race here the natural one between > >seeking and reading, which is up to the user to take care > >of. > > Hmm, I just read the changelog of commit > 34aacb2920667d405a8df15968b7f71ba46c8f18, which claims to fix > the race. So anything changed in vfs layer after that? Ah it didn't fix any race, it just got rid of the bkl, OTOH I said in my changelog: "/proc/kcore has no llseek and then falls down to use default_llseek. This is racy against read_kcore() that directly manipulates fpos but it doesn't hold the bkl there so using it in llseek doesn't protect anything." So I think this just testifies my crude misunderstanding of the code when I wrote that changelog. I didn't realize fpos is a copy of the file offset that is writed back later. Hence my changelog was buggy. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] /proc/kcore: fix seeking 2011-01-14 16:29 ` Frederic Weisbecker @ 2011-01-17 8:06 ` Américo Wang 0 siblings, 0 replies; 7+ messages in thread From: Américo Wang @ 2011-01-17 8:06 UTC (permalink / raw) To: Frederic Weisbecker; +Cc: Américo Wang, Dave Anderson, linux-kernel On Fri, Jan 14, 2011 at 05:29:19PM +0100, Frederic Weisbecker wrote: >On Fri, Jan 14, 2011 at 05:44:42PM +0800, Américo Wang wrote: >> On Tue, Jan 11, 2011 at 05:23:23PM +0100, Frederic Weisbecker wrote: >> >On Wed, Jan 12, 2011 at 12:04:37AM +0800, Américo Wang wrote: >> >> On Mon, Jan 10, 2011 at 09:42:29AM -0500, Dave Anderson wrote: >> >> >From: Dave Anderson <anderson@redhat.com> >> >> > >> >> >Commit 34aacb2920667d405a8df15968b7f71ba46c8f18 >> >> >("procfs: Use generic_file_llseek in /proc/kcore") >> >> >broke seeking on /proc/kcore. This changes it back >> >> >to use default_llseek in order to restore the original >> >> >behavior. >> >> > >> >> >The problem with generic_file_llseek is that it only >> >> >allows seeks up to inode->i_sb->s_maxbytes, which is >> >> >2GB-1 on procfs, where the memory file offset values in >> >> >the /proc/kcore PT_LOAD segments may exceed or start >> >> >beyond that offset value. >> >> > >> >> >> >> Is the race solved? Using default_llseek() still races >> >> with read_kcore() on fpos, AFAIK. >> > >> >Hmm, how does it race there? >> > >> >read_kcore() manipulates fpos, which can't be changed behind >> >us inside the read callback as it's a snapshot. Also read_kcore() >> >can change the value of fpos, which is writed back to file->fpos >> >from sys_read(). >> > >> >So the last resulting race here the natural one between >> >seeking and reading, which is up to the user to take care >> >of. >> >> Hmm, I just read the changelog of commit >> 34aacb2920667d405a8df15968b7f71ba46c8f18, which claims to fix >> the race. So anything changed in vfs layer after that? > > >Ah it didn't fix any race, it just got rid of the bkl, OTOH >I said in my changelog: > > "/proc/kcore has no llseek and then falls down to use default_llseek. > This is racy against read_kcore() that directly manipulates fpos > but it doesn't hold the bkl there so using it in llseek doesn't > protect anything." > >So I think this just testifies my crude misunderstanding of the code when I wrote >that changelog. I didn't realize fpos is a copy of the file offset that is writed back >later. Hence my changelog was buggy. Ok, thanks for explaining this! Dave's patch should be alright. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-01-17 8:06 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-01-10 14:42 [PATCH] /proc/kcore: fix seeking Dave Anderson 2011-01-11 0:52 ` Frederic Weisbecker 2011-01-11 16:04 ` Américo Wang 2011-01-11 16:23 ` Frederic Weisbecker 2011-01-14 9:44 ` Américo Wang 2011-01-14 16:29 ` Frederic Weisbecker 2011-01-17 8:06 ` Américo Wang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).