Message ID | 20250325-scsi-sync-on-write-v1-2-3575aa1342e0@linaro.org |
---|---|
State | New |
Headers | show |
Series | scsi: ensure writes are flushed to disk | expand |
On 25/03/2025 14:02, Caleb Connolly wrote: > This gets called with the same parameter in two paths in scsi_write(), > de-dup them to prepare for additional logic after the write. > > Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org> > --- > drivers/scsi/scsi.c | 17 +++++++++++------ > 1 file changed, 11 insertions(+), 6 deletions(-) > > diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c > index 34ac47c03ab397ca999abf130d84ccbd3be4c419..1aa7fbdbb5278e387de72a3c3e73d19ea0342fff 100644 > --- a/drivers/scsi/scsi.c > +++ b/drivers/scsi/scsi.c > @@ -220,25 +220,30 @@ static ulong scsi_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, > pccb->dma_dir = DMA_TO_DEVICE; > if (blks > max_blks) { > pccb->datalen = block_dev->blksz * max_blks; > smallblks = max_blks; > - scsi_setup_write_ext(pccb, start, smallblks); > - start += max_blks; > - blks -= max_blks; > } else { > pccb->datalen = block_dev->blksz * blks; > smallblks = (unsigned short)blks; > - scsi_setup_write_ext(pccb, start, smallblks); > - start += blks; > - blks = 0; > } > + > debug("%s: startblk " LBAF ", blccnt %x buffer %lx\n", > __func__, start, smallblks, buf_addr); > + scsi_setup_write_ext(pccb, start, smallblks); > + > if (scsi_exec(bdev, pccb)) { > scsi_print_error(pccb); > blkcnt -= blks; > break; > } > + > + if (blks > max_blks) { > + start += max_blks; > + blks -= max_blks; > + } else { > + start += blks; > + blks = 0; > + } Ok this changes the logic and the result of blkcnt on error, before is accounted the current command in the blkcnt but now it doesn't. Weird we do not return any errors > buf_addr += pccb->datalen; > } while (blks != 0); > debug("%s: end startblk " LBAF ", blccnt %x buffer %lX\n", > __func__, start, smallblks, buf_addr); >
On 3/25/25 14:38, Neil Armstrong wrote: > On 25/03/2025 14:02, Caleb Connolly wrote: >> This gets called with the same parameter in two paths in scsi_write(), >> de-dup them to prepare for additional logic after the write. >> >> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org> >> --- >> drivers/scsi/scsi.c | 17 +++++++++++------ >> 1 file changed, 11 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c >> index >> 34ac47c03ab397ca999abf130d84ccbd3be4c419..1aa7fbdbb5278e387de72a3c3e73d19ea0342fff 100644 >> --- a/drivers/scsi/scsi.c >> +++ b/drivers/scsi/scsi.c >> @@ -220,25 +220,30 @@ static ulong scsi_write(struct udevice *dev, >> lbaint_t blknr, lbaint_t blkcnt, >> pccb->dma_dir = DMA_TO_DEVICE; >> if (blks > max_blks) { >> pccb->datalen = block_dev->blksz * max_blks; >> smallblks = max_blks; >> - scsi_setup_write_ext(pccb, start, smallblks); >> - start += max_blks; >> - blks -= max_blks; >> } else { >> pccb->datalen = block_dev->blksz * blks; >> smallblks = (unsigned short)blks; >> - scsi_setup_write_ext(pccb, start, smallblks); >> - start += blks; >> - blks = 0; >> } >> + >> debug("%s: startblk " LBAF ", blccnt %x buffer %lx\n", >> __func__, start, smallblks, buf_addr); >> + scsi_setup_write_ext(pccb, start, smallblks); >> + >> if (scsi_exec(bdev, pccb)) { >> scsi_print_error(pccb); >> blkcnt -= blks; >> break; >> } >> + >> + if (blks > max_blks) { >> + start += max_blks; >> + blks -= max_blks; >> + } else { >> + start += blks; >> + blks = 0; >> + } > > Ok this changes the logic and the result of blkcnt on error, before > is accounted the current command in the blkcnt but now it doesn't. Ooh good point, will fix that in v2. > > Weird we do not return any errors Yeahh and scsi_print_error() is just a stub... This is probably something worth looking at in the future. > >> buf_addr += pccb->datalen; >> } while (blks != 0); >> debug("%s: end startblk " LBAF ", blccnt %x buffer %lX\n", >> __func__, start, smallblks, buf_addr); >> >
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 34ac47c03ab397ca999abf130d84ccbd3be4c419..1aa7fbdbb5278e387de72a3c3e73d19ea0342fff 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -220,25 +220,30 @@ static ulong scsi_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, pccb->dma_dir = DMA_TO_DEVICE; if (blks > max_blks) { pccb->datalen = block_dev->blksz * max_blks; smallblks = max_blks; - scsi_setup_write_ext(pccb, start, smallblks); - start += max_blks; - blks -= max_blks; } else { pccb->datalen = block_dev->blksz * blks; smallblks = (unsigned short)blks; - scsi_setup_write_ext(pccb, start, smallblks); - start += blks; - blks = 0; } + debug("%s: startblk " LBAF ", blccnt %x buffer %lx\n", __func__, start, smallblks, buf_addr); + scsi_setup_write_ext(pccb, start, smallblks); + if (scsi_exec(bdev, pccb)) { scsi_print_error(pccb); blkcnt -= blks; break; } + + if (blks > max_blks) { + start += max_blks; + blks -= max_blks; + } else { + start += blks; + blks = 0; + } buf_addr += pccb->datalen; } while (blks != 0); debug("%s: end startblk " LBAF ", blccnt %x buffer %lX\n", __func__, start, smallblks, buf_addr);
This gets called with the same parameter in two paths in scsi_write(), de-dup them to prepare for additional logic after the write. Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org> --- drivers/scsi/scsi.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)