]> git.neil.brown.name Git - history.git/commitdiff
[XFS] Fix buffer teardown on _pagebuf_lookup_pages failure
authorChristoph Hellwig <hch@sgi.com>
Tue, 10 Feb 2004 00:14:28 +0000 (11:14 +1100)
committerChristoph Hellwig <hch@sgi.com>
Tue, 10 Feb 2004 00:14:28 +0000 (11:14 +1100)
SGI Modid: xfs-linux:xfs-kern:166032a

fs/xfs/linux/xfs_buf.c

index 6fe563ca046a92ac58b10cde4243a24b377db478..fc8b3e6329da4feca2f9001d13eb4fea1633394d 100644 (file)
@@ -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;
 }
 
 /*