On Thursday 14 February 2008, Borislav Petkov wrote:
> On Wed, Feb 13, 2008 at 11:04:23PM +0100, Bartlomiej Zolnierkiewicz wrote:
> > On Wednesday 13 February 2008, Borislav Petkov wrote:
> > > commit d1f1f84f413ab00cb2fec48170d022fcd900e214
> > > Author: Borislav Petkov <[EMAIL PROTECTED]>
> > > Date:   Wed Feb 13 20:26:56 2008 +0100
> > > 
> > >     ide-floppy: merge callbacks
> > >     
> > >     The appropriate functionality of the callback is established through 
> > > querying
> > >     the ATAPI packet command in pc->c[0].
> > >     
> > >     While at it, simplify if (floppy->failed_pc)-branch to be found in 
> > > the original
> > >     idefloppy_request_sense_callback().
> > >     
> > >     Signed-off-by: Borislav Petkov <[EMAIL PROTECTED]>
> > > 
> > > diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
> > > index 5f133df..1365310 100644
> > > --- a/drivers/ide/ide-floppy.c
> > > +++ b/drivers/ide/ide-floppy.c
> > > @@ -313,50 +313,39 @@ static struct request 
> > > *idefloppy_next_rq_storage(ide_drive_t *drive)
> > >   return (&floppy->rq_stack[floppy->rq_stack_index++]);
> > >  }
> > >  
> > > -static void idefloppy_request_sense_callback(ide_drive_t *drive)
> > > +static void ide_floppy_callback(ide_drive_t *drive)
> > >  {
> > >   idefloppy_floppy_t *floppy = drive->driver_data;
> > > - u8 *buf = floppy->pc->buf;
> > >  
> > >   debug_log("Reached %s\n", __func__);
> > >  
> > > - if (!floppy->pc->error) {
> > > -         floppy->sense_key = buf[2] & 0x0F;
> > > -         floppy->asc = buf[12];
> > > -         floppy->ascq = buf[13];
> > > -         floppy->progress_indication = buf[15] & 0x80 ?
> > > -                 (u16)get_unaligned((u16 *)&buf[16]) : 0x10000;
> > > + if (floppy->pc->c[0] == GPCMD_REQUEST_SENSE) {
> > > +         u8 *buf = floppy->pc->buf;
> > >  
> > > -         if (floppy->failed_pc)
> > > -                 debug_log("pc = %x, sense key = %x, asc = %x,"
> > > -                                 " ascq = %x\n",
> > > -                                 floppy->failed_pc->c[0],
> > > -                                 floppy->sense_key,
> > > -                                 floppy->asc,
> > > -                                 floppy->ascq);
> > > -         else
> > > -                 debug_log("sense key = %x, asc = %x, ascq = %x\n",
> > > -                                 floppy->sense_key,
> > > -                                 floppy->asc,
> > > -                                 floppy->ascq);
> > > -
> > > -
> > > -         idefloppy_end_request(drive, 1, 0);
> > > - } else {
> > > -         printk(KERN_ERR "Error in REQUEST SENSE itself - Aborting"
> > > -                         " request!\n");
> > > -         idefloppy_end_request(drive, 0, 0);
> > > - }
> > > -}
> > > +         if (!floppy->pc->error) {
> > > +                 floppy->sense_key = buf[2] & 0x0F;
> > > +                 floppy->asc = buf[12];
> > > +                 floppy->ascq = buf[13];
> > > +                 floppy->progress_indication = buf[15] & 0x80 ?
> > > +                         (u16)get_unaligned((u16 *)&buf[16]) : 0x10000;
> > >  
> > > -/* General packet command callback function. */
> > > -static void idefloppy_pc_callback(ide_drive_t *drive)
> > > -{
> > > - idefloppy_floppy_t *floppy = drive->driver_data;
> > > +                 if (floppy->failed_pc)
> > > +                         debug_log("pc = %x, ", floppy->failed_pc->c[0]);
> > >  
> > > - debug_log("Reached %s\n", __func__);
> > > +                 debug_log("sense key = %x, asc = %x, ascq = %x\n",
> > > +                         floppy->sense_key, floppy->asc, floppy->ascq);
> > >  
> > > - idefloppy_end_request(drive, floppy->pc->error ? 0 : 1, 0);
> > > +                 idefloppy_end_request(drive, 1, 0);
> > > +         } else {
> > > +                 printk(KERN_ERR "Error in REQUEST SENSE itself - "
> > > +                                 "Aborting request!\n");
> > > +                 idefloppy_end_request(drive, 0, 0);
> > > +         }
> > > + } else if (floppy->pc->c[0] == GPCMD_READ_10 ||
> > > +         floppy->pc->c[0] == GPCMD_WRITE_10)
> > > +         idefloppy_end_request(drive, 1, 0);
> > > + else
> > > +         idefloppy_end_request(drive, floppy->pc->error ? 0 : 1, 0);
> > >  }
> > >  
> > >  static void idefloppy_init_pc(struct ide_atapi_pc *pc)
> > > @@ -367,7 +356,7 @@ static void idefloppy_init_pc(struct ide_atapi_pc *pc)
> > >   pc->req_xfer = 0;
> > >   pc->buf = pc->pc_buf;
> > >   pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE;
> > > - pc->idefloppy_callback = &idefloppy_pc_callback;
> > > + pc->idefloppy_callback = &ide_floppy_callback;
> > >  }
> > >  
> > >  static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
> > > @@ -376,7 +365,6 @@ static void idefloppy_create_request_sense_cmd(struct 
> > > ide_atapi_pc *pc)
> > >   pc->c[0] = GPCMD_REQUEST_SENSE;
> > >   pc->c[4] = 255;
> > >   pc->req_xfer = 18;
> > > - pc->idefloppy_callback = &idefloppy_request_sense_callback;
> > >  }
> > >  
> > >  /*
> > > @@ -697,14 +685,6 @@ static ide_startstop_t 
> > > idefloppy_issue_pc(ide_drive_t *drive,
> > >   }
> > >  }
> > >  
> > > -static void idefloppy_rw_callback(ide_drive_t *drive)
> > > -{
> > > - debug_log("Reached %s\n", __func__);
> > > -
> > > - idefloppy_end_request(drive, 1, 0);
> > > - return;
> > > -}
> > > -
> > >  static void idefloppy_create_prevent_cmd(struct ide_atapi_pc *pc, int 
> > > prevent)
> > >  {
> > >   debug_log("creating prevent removal command, prevent = %d\n", prevent);
> > > @@ -799,7 +779,6 @@ static void 
> > > idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy,
> > >   put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]);
> > >   put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]);
> > >  
> > > - pc->idefloppy_callback = &idefloppy_rw_callback;
> > >   pc->rq = rq;
> > >   pc->b_count = cmd == READ ? 0 : rq->bio->bi_size;
> > >   if (rq->cmd_flags & REQ_RW)
> > > @@ -813,7 +792,6 @@ static void idefloppy_blockpc_cmd(idefloppy_floppy_t 
> > > *floppy,
> > >           struct ide_atapi_pc *pc, struct request *rq)
> > >  {
> > >   idefloppy_init_pc(pc);
> > > - pc->idefloppy_callback = &idefloppy_rw_callback;
> > 
> > For unknown reasons blk_pc_request() requests were overriding the default
> > *_pc_callback and using *_rw_callback instead - the patch changes this
> > behavior silently.
> > 
> > [ When I suggest some changes I can be wrong as well (just like in this case
> >   because after closer look merging callbacks is not as simple as checking
> >   only pc->c[0]) so do not trust me automatically :) + please always try to
> >   fully read and understand the underlying code. ]
> 
> I did actually _read_ the code but probably the assumption i made was wrong (i
> tend to do that off and on.. :)), and didn't elaborate on that in my original
> mail. First of all, the *_pc_callback is overridden with in the *_rw_callback 
> in
> *_blockpc_cmd() not only for pc requests but also for fs requests in 
> *_create_rw_cmd
> in *_do_request(). The pc->c member is only memcopied in *_blockpc_cmd() from
> rq->cmd and i thought the command in pc->c[0] would be the sole criteria to
> decide upon how to end the request. And this is actually what it boils down
> to, the *_rw_callback() ends the request without error checking (i.e. calls
> idefloppy_end_request(?, 1, ?) with the second arg uptodate = 1 which turns 
> off
> the error local var in *_end_request, while the *_pc_callback() checks for 
> errors.
> 
> But shouldn't we do error checking for pc requests too? ide-cd does turn off
> error checking for fs requests but not for pc requests, so what do we want to 
> do
> here?

We probably should check for errors but again I don't know for sure
and if you are going to change it you should audit the code that the
change is correct change...

Thanks,
Bart
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to