diff options
author | Hugh Dickins <hugh@veritas.com> | 2005-12-02 18:58:09 +0300 |
---|---|---|
committer | James Bottomley <jejb@titanic.(none)> | 2005-12-02 19:24:22 +0300 |
commit | 4d5cda069b3f0a3bbc18576bc15903ed665d0295 (patch) | |
tree | e89d75e2db026d7f15a13464a32197d7ecfc8272 /drivers/scsi/sg.c | |
parent | 032c09d76cdb448484859cc84dac4bba8f5f8f14 (diff) | |
download | linux-4d5cda069b3f0a3bbc18576bc15903ed665d0295.tar.xz |
[SCSI] sg: fix a bug in st_map_user_pages failure path
sg's st_map_user_pages is modelled on an earlier version of st's
sgl_map_user_pages, and has the same bug: if get_user_pages got some but
not all of the pages, then those got were released, but the positive res
code returned implied that they were still to be freed.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Douglas Gilbert <dougg@torque.net>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/sg.c')
-rw-r--r-- | drivers/scsi/sg.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 6de7ff9faf2d..b55c2a8a547c 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -1860,9 +1860,11 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, unlock_page(pages[j]); */ res = 0; out_unmap: - if (res > 0) + if (res > 0) { for (j=0; j < res; j++) page_cache_release(pages[j]); + res = 0; + } kfree(pages); return res; } |