summaryrefslogtreecommitdiffstats
path: root/lib/scatterlist.c
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2010-10-13 16:18:36 +1100
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2010-10-13 16:18:36 +1100
commit4783f393de3077211c14675a0e57c8a02e9190b0 (patch)
tree6c37d8664eb072fd026db3706481d771da4495ca /lib/scatterlist.c
parent9f5f9ffe50e90ed73040d2100db8bfc341cee352 (diff)
parent5b8544c38e6fde6968645afd46ff681492192b86 (diff)
downloadop-kernel-dev-4783f393de3077211c14675a0e57c8a02e9190b0.zip
op-kernel-dev-4783f393de3077211c14675a0e57c8a02e9190b0.tar.gz
Merge remote branch 'kumar/merge' into next
Diffstat (limited to 'lib/scatterlist.c')
-rw-r--r--lib/scatterlist.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/scatterlist.c b/lib/scatterlist.c
index a5ec428..4ceb05d 100644
--- a/lib/scatterlist.c
+++ b/lib/scatterlist.c
@@ -248,8 +248,18 @@ int __sg_alloc_table(struct sg_table *table, unsigned int nents,
left -= sg_size;
sg = alloc_fn(alloc_size, gfp_mask);
- if (unlikely(!sg))
- return -ENOMEM;
+ if (unlikely(!sg)) {
+ /*
+ * Adjust entry count to reflect that the last
+ * entry of the previous table won't be used for
+ * linkage. Without this, sg_kfree() may get
+ * confused.
+ */
+ if (prv)
+ table->nents = ++table->orig_nents;
+
+ return -ENOMEM;
+ }
sg_init_table(sg, alloc_size);
table->nents = table->orig_nents += sg_size;
OpenPOWER on IntegriCloud