RE: [PATCH ] scsi-misc-2.6: File System going into read-only mode

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

 



On Wed, 2009-11-04 at 12:51 +0530, Penchala Narasimha Reddy Chilakala,
TLS-Chennai wrote:
> > This is all spurious bracket addition; it doesn't really have any place
> > in a code fix.
> >
> > <Narasimha Reddy>: As we know that if we do not keep bracket
> > appropriately, some times compilers will behave differently and it may
> > use different instructions and evaluate differently. So to avoid those
> > kinds of issues, we added those brackets. It is not a code fix, but it
> > is compiler fix (compilers should not interpret differently). If
> > compiler interprets differently then the logic may behave differently
> > as against to your intentional behavior.  I hope you agree with me.
> 
> Not really ... in principle we try to fix the compilers rather than work
> around their bugs.  Which compilers are exhibiting the problem? ...
> because they'll affect more than just aacraid.
> 
> <Narasimha Reddy>
> 
> I hope you agree with Stefen's explanation.

Yes ... rechecked the code I'd missed the operator precedence problem
with :?

>  Generally, gnu compilers are buggy so the expression after the patch
> is more transparent and right one.

Well, generally gnu compilers aren't buggy ... plus this is a red
herring.  The operator precedence is defined by standard to be the same
for all compilers, so they would all interpret the expressions you're
changing in the same way.

> That is how a good c-programmer has to do to avoid such kind of
> issues. That is what we have done in the patch.

The issue, surely, is a simple operator precedence related bug ... it's
nothing to do with programmer practice or compilers.

> > > @@ -842,13 +842,22 @@ static int aac_get_pci_info(struct aac_d
> > >  int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
> > >  {
> > >         int status;
> > > +       unsigned long mflags;
> > >
> > >         /*
> > >          *      HBA gets first crack
> > >          */
> > >
> > > +       spin_lock_irqsave(&dev->manage_lock, mflags);
> > > +       if (dev->management_fib_count > AAC_NUM_MGT_FIB) {
> > > +               printk(KERN_INFO "No management Fibs Available:%d\n",
> > > +                                               dev->management_fib_count);
> > > +               spin_unlock_irqrestore(&dev->manage_lock, mflags);
> > > +               return -EBUSY;
> > > +       }
> > > +       spin_unlock_irqrestore(&dev->manage_lock, mflags);
> > >         status = aac_dev_ioctl(dev, cmd, arg);
> >
> > I can see what you're trying to do: limit the number of ioctl created
> > fibs to prevent starvation, but this mechanism is completely racy.  The
> > check is too far away from the increment.  It looks fixable just by
> > doing the increment within the lock here and decrementing if something
> > fails.
> >
> >
> > <Narasimha Reddy>: My intention is not to prevent starvation, but my
> > intention is that management fibs should not cross more than
> > "AAC_NUM_MGT_FIB". During our testing, we have seen any racy
> > condition.
> 
> The race is pretty obvious.  You lock check and drop the lock.  Multiple
> threads can go through that code at the same time, pass and then take
> the count above AAC_NUM_MGT_FIB.
> 
> I think currently you may have a mediation on the BKL which will
> mitigate this race, but that would go when the BKL is removed, so you
> need to be ready for that.
> 
> 
> <Narasimha Reddy> we will keep this in mind and we watch it during our
> testing. If we see such kind of issue then we will do appropriate
> changes and give you a separate small patch.

Why not just fix it now rather than wait for problems to appear due to
an unrelated change at a later time.  To make this cast iron, you do:

       spin_lock_irqsave(&dev->manage_lock, mflags);
       if (dev->management_fib_count > AAC_NUM_MGT_FIB) {
               printk(KERN_INFO "No management Fibs Available:%d\n",
                                           dev->management_fib_count);
               spin_unlock_irqrestore(&dev->manage_lock, mflags);
               return -EBUSY;
       }
       dev->management_fib_count++;
       spin_unlock_irqrestore(&dev->manage_lock, mflags);

and decrement under lock on every exit path (or even and more simply use
a counting semaphore).

James


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux