Re: 2.6.12-mm1 (kernel BUG at fs/open.c:935!)

From: Dipankar Sarma
Date: Mon Jun 20 2005 - 15:32:01 EST


On Mon, Jun 20, 2005 at 03:04:02PM +0200, jan malstrom wrote:
> right at booting:
>
>
> Jun 20 14:38:07 hades kernel: kernel BUG at fs/open.c:935!
> Jun 20 14:38:07 hades kernel: invalid operand: 0000 [#1]
> Jun 20 14:38:07 hades kernel: PREEMPT
> Jun 20 14:38:07 hades kernel: Modules linked in: ipw2100 i2c_i801
> Jun 20 14:38:07 hades kernel: CPU: 0
> Jun 20 14:38:07 hades kernel: EIP: 0060:[fd_install+309/400] Not
> tainted VLI

Can you try the following patch and let me know if it fixes any
of your problems ? I have only touch tested this patch on a P4 box.
Applies on top of 2.6.12-mm1.

Thanks
Dipankar



If expand_fdtable() sees that someone else expanded the fdtable
while it dropped the lock, it can return 0 which in turn
can be returned by expand_files() even though there has
been an expansion of the fdtable since expand_files()
was originally called. This could lead to locate_fd()
not repeating the fd search and returning a bogus fd.
This patch fixes this problem.

Signed-off-by: Dipankar Sarma <dipankar@xxxxxxxxxx>
---


fs/file.c | 15 +++++++--------
1 files changed, 7 insertions(+), 8 deletions(-)

diff -puN fs/file.c~fix-expand-files fs/file.c
--- linux-2.6.12-mm1-test/fs/file.c~fix-expand-files 2005-06-22 10:35:31.000000000 +0530
+++ linux-2.6.12-mm1-test-dipankar/fs/file.c 2005-06-22 10:44:56.000000000 +0530
@@ -304,13 +304,14 @@ out:
/*
* Expands the file descriptor table - it will allocate a new fdtable and
* both fd array and fdset. It is expected to be called with the
- * files_lock held.
+ * files_lock held. It returns 1 if fdtable expanded or -errno if
+ * expansion failed.
*/
static int expand_fdtable(struct files_struct *files, int nr)
__releases(files->file_lock)
__acquires(files->file_lock)
{
- int error = 0;
+ int error = 1;
struct fdtable *fdt;
struct fdtable *nfdt = NULL;

@@ -350,7 +351,7 @@ out:
*/
int expand_files(struct files_struct *files, int nr)
{
- int err, expand = 0;
+ int err;
struct fdtable *fdt;

fdt = files_fdtable(files);
@@ -360,11 +361,9 @@ int expand_files(struct files_struct *fi
err = -EMFILE;
goto out;
}
- expand = 1;
- if ((err = expand_fdtable(files, nr)))
- goto out;
- }
- err = expand;
+ err = expand_fdtable(files, nr);
+ } else
+ err = 0;
out:
return err;
}

_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/