2017-04-07 4:29 GMT-07:00 Germano Percossi <germano.percossi@xxxxxxxxxx>: > This fixes Continuous Availability when errors during > file reopen are encountered. > > cifs_user_readv and cifs_user_writev would wait for ever if > results of cifs_reopen_file are not stored and for later inspection. > > In fact, results are checked and, in case of errors, a chain > of function calls leading to reads and writes to be scheduled in > a separate thread is skipped. > These threads will wake up the corresponding waiters once reads > and writes are done. > > However, given the return value is not stored, when rc is checked > for errors a previous one (always zero) is inspected instead. > This leads to pending reads/writes added to the list, making > cifs_user_readv and cifs_user_writev wait for ever. > > Signed-off-by: Germano Percossi <germano.percossi@xxxxxxxxxx> > --- > fs/cifs/file.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/fs/cifs/file.c b/fs/cifs/file.c > index aa3debb..21d4045 100644 > --- a/fs/cifs/file.c > +++ b/fs/cifs/file.c > @@ -2597,7 +2597,7 @@ cifs_write_from_iter(loff_t offset, size_t len, struct iov_iter *from, > wdata->credits = credits; > > if (!wdata->cfile->invalidHandle || > - !cifs_reopen_file(wdata->cfile, false)) > + !(rc = cifs_reopen_file(wdata->cfile, false))) > rc = server->ops->async_writev(wdata, > cifs_uncached_writedata_release); > if (rc) { > @@ -3022,7 +3022,7 @@ cifs_send_async_read(loff_t offset, size_t len, struct cifsFileInfo *open_file, > rdata->credits = credits; > > if (!rdata->cfile->invalidHandle || > - !cifs_reopen_file(rdata->cfile, true)) > + !(rc = cifs_reopen_file(rdata->cfile, true))) > rc = server->ops->async_readv(rdata); > error: > if (rc) { > @@ -3617,7 +3617,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, > } > > if (!rdata->cfile->invalidHandle || > - !cifs_reopen_file(rdata->cfile, true)) > + !(rc = cifs_reopen_file(rdata->cfile, true))) > rc = server->ops->async_readv(rdata); > if (rc) { > add_credits_and_wake_if(server, rdata->credits, 0); > -- > git-series 0.9.1 > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html Nice catch! This one should probably go to stable. Reviewed-by: Pavel Shilovsky <pshilov@xxxxxxxxxxxxx> -- Best regards, Pavel Shilovsky -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html