Re: 2.4.0-test6-pre2 has a (buffercache?) lockup

From: Alexander Viro (viro@math.psu.edu)
Date: Fri Aug 04 2000 - 21:23:33 EDT

  • Next message: Matthew Dillon: "Re: RFC: design for new VM"

    On Sat, 5 Aug 2000, Tigran Aivazian wrote:

    > Hi guys,
    >
    > It is very late and so the report is vague but simple.
    >
    > a) Boot 2.4.0-test6-pre2.
    >
    > b) take a DDS-2 tape with 4G of stuff tar'ed onto it
    >
    > c) start untarring the tape into ext2 filesystem. The drive is Seagate
    > DDS2 Model: Python 04687-XXX Rev: 6610.
    >
    > d) it will lockup. Alt-Sysrq works and shows lots of interesting stuff
    > (e.g. looping EIP but I was so busy that I didn't note this info down -
    > maybe tomorrow will retry the experiment)
    >
    > repeat the same procedure (after reboot and fsck) - it will lockup exactly
    > in the same place where it did before. Do it again - it will lockup in the
    > same place again.

    OK, folks, could those who had lockups on -pre2 try the following patch?
    Bug hits if you are adding a directly-addressed block (either data or
    indirect one; it must be addressed from i_data) to inode in the first
    cylinder group on a filesystem that has zero ->s_first_data_block.

    --- fs/ext2/inode.c Fri Aug 4 21:14:23 2000
    +++ fs/ext2/inode.c Fri Aug 4 21:16:27 2000
    @@ -348,10 +348,13 @@
     static inline unsigned long ext2_find_goal(struct inode *inode,
                                                long block,
                                                Indirect chain[4],
    - Indirect *partial)
    + Indirect *partial,
    + int *err)
     {
             unsigned long goal = 0;
     
    + *err = -EAGAIN;
    +
             /* Writer: ->i_next_alloc* */
             if (block == inode->u.ext2_i.i_next_alloc_block + 1) {
                     inode->u.ext2_i.i_next_alloc_block++;
    @@ -368,6 +371,7 @@
                             goal = inode->u.ext2_i.i_next_alloc_goal;
                     if (!goal)
                             goal = ext2_find_near(inode, partial);
    + *err = 0;
             }
             /* Reader: end */
             return goal;
    @@ -577,8 +581,8 @@
             if (err == -EAGAIN)
                     goto changed;
     
    - goal = ext2_find_goal(inode, iblock, chain, partial);
    - if (!goal)
    + goal = ext2_find_goal(inode, iblock, chain, partial, &err);
    + if (err)
                     goto changed;
     
             left = (chain + depth) - partial;

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



    This archive was generated by hypermail 2b29 : Fri Aug 04 2000 - 21:26:12 EDT