All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
To: petkovbb@gmail.com
Cc: linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org
Subject: Re: [PATCH] ide-floppy: merge callbacks
Date: Thu, 14 Feb 2008 13:28:17 +0100	[thread overview]
Message-ID: <200802141328.17922.bzolnier@gmail.com> (raw)
In-Reply-To: <20080214062759.GF13446@gollum.tnic>

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 <petkovbb@gmail.com>
> > > 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 <petkovbb@gmail.com>
> > > 
> > > 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

      reply	other threads:[~2008-02-14 12:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-13 20:57 [PATCH] ide-floppy: merge callbacks Borislav Petkov
2008-02-13 22:04 ` Bartlomiej Zolnierkiewicz
2008-02-14  6:27   ` Borislav Petkov
2008-02-14 12:28     ` Bartlomiej Zolnierkiewicz [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200802141328.17922.bzolnier@gmail.com \
    --to=bzolnier@gmail.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=petkovbb@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.