From cc537af912b1aa57efed70896b8e145b42456e79 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 10 Feb 2004 11:14:28 +1100 Subject: [PATCH] [XFS] Fix buffer teardown on _pagebuf_lookup_pages failure SGI Modid: xfs-linux:xfs-kern:166032a --- fs/xfs/linux/xfs_buf.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/fs/xfs/linux/xfs_buf.c b/fs/xfs/linux/xfs_buf.c index 6fe563ca046a9..fc8b3e6329da4 100644 --- a/fs/xfs/linux/xfs_buf.c +++ b/fs/xfs/linux/xfs_buf.c @@ -779,8 +779,9 @@ pagebuf_get( /* allocate a buffer */ /* fill in any missing pages */ error = _pagebuf_lookup_pages(pb, pb->pb_target->pbr_mapping, flags); if (unlikely(error)) { - pagebuf_free(pb); - return (NULL); + printk(KERN_WARNING + "pagebuf_get: warning, failed to lookup pages\n"); + goto no_buffer; } /* @@ -801,10 +802,7 @@ pagebuf_get( /* allocate a buffer */ * Read ahead call which is already satisfied, * drop the buffer */ - if (flags & (PBF_LOCK | PBF_TRYLOCK)) - pagebuf_unlock(pb); - pagebuf_rele(pb); - return NULL; + goto no_buffer; } else { PB_TRACE(pb, "get_read_done", (unsigned long)flags); /* We do not want read in the flags */ @@ -813,7 +811,14 @@ pagebuf_get( /* allocate a buffer */ } else { PB_TRACE(pb, "get_write", (unsigned long)flags); } - return (pb); + + return pb; + +no_buffer: + if (flags & (PBF_LOCK | PBF_TRYLOCK)) + pagebuf_unlock(pb); + pagebuf_rele(pb); + return NULL; } /* -- 2.53.0