Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
[powerpc.git] / fs / jfs / jfs_xtree.c
index e72f4eb..acc97c4 100644 (file)
@@ -3,16 +3,16 @@
  *
  *   This program is free software;  you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or 
+ *   the Free Software Foundation; either version 2 of the License, or
  *   (at your option) any later version.
- * 
+ *
  *   This program is distributed in the hope that it will be useful,
  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  *   the GNU General Public License for more details.
  *
  *   You should have received a copy of the GNU General Public License
- *   along with this program;  if not, write to the Free Software 
+ *   along with this program;  if not, write to the Free Software
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
 /*
@@ -757,6 +757,11 @@ static int xtSearch(struct inode *ip, s64 xoff,    s64 *nextp,
                        nsplit = 0;
 
                /* push (bn, index) of the parent page/entry */
+               if (BT_STACK_FULL(btstack)) {
+                       jfs_error(ip->i_sb, "stack overrun in xtSearch!");
+                       XT_PUTPAGE(mp);
+                       return -EIO;
+               }
                BT_PUSH(btstack, bn, index);
 
                /* get the child page block number */
@@ -2428,7 +2433,7 @@ printf("xtUpdate.updateLeft.split p:0x%p\n", p);
  * return:
  */
 int xtAppend(tid_t tid,                /* transaction id */
-            struct inode *ip, int xflag, s64 xoff, s32 maxblocks,      
+            struct inode *ip, int xflag, s64 xoff, s32 maxblocks,
             s32 * xlenp,       /* (in/out) */
             s64 * xaddrp,      /* (in/out) */
             int flag)
@@ -2499,7 +2504,7 @@ int xtAppend(tid_t tid,           /* transaction id */
        pxdlist.maxnpxd = pxdlist.npxd = 0;
        pxd = &pxdlist.pxd[0];
        nblocks = JFS_SBI(ip->i_sb)->nbperpage;
-       for (; nsplit > 0; nsplit--, pxd++, xaddr += nblocks, maxblocks -= nblocks) {   
+       for (; nsplit > 0; nsplit--, pxd++, xaddr += nblocks, maxblocks -= nblocks) {
                if ((rc = dbAllocBottomUp(ip, xaddr, (s64) nblocks)) == 0) {
                        PXDaddress(pxd, xaddr);
                        PXDlength(pxd, nblocks);
@@ -2514,7 +2519,7 @@ int xtAppend(tid_t tid,           /* transaction id */
                goto out;
        }
 
-       xlen = min(xlen, maxblocks);    
+       xlen = min(xlen, maxblocks);
 
        /*
         * allocate data extent requested
@@ -2964,7 +2969,7 @@ xtRelocate(tid_t tid, struct inode * ip, xad_t * oxad,    /* old XAD */
                        cmSetXD(ip, cp, pno, dxaddr, nblks);
 
                        /* release the cbuf, mark it as modified */
-                       cmPut(cp, TRUE);
+                       cmPut(cp, true);
 
                        dxaddr += nblks;
                        sxaddr += nblks;
@@ -3915,6 +3920,11 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag)
         */
       getChild:
        /* save current parent entry for the child page */
+       if (BT_STACK_FULL(&btstack)) {
+               jfs_error(ip->i_sb, "stack overrun in xtTruncate!");
+               XT_PUTPAGE(mp);
+               return -EIO;
+       }
        BT_PUSH(&btstack, bn, index);
 
        /* get child page */
@@ -4112,6 +4122,11 @@ s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size)
         */
       getChild:
        /* save current parent entry for the child page */
+       if (BT_STACK_FULL(&btstack)) {
+               jfs_error(ip->i_sb, "stack overrun in xtTruncate_pmap!");
+               XT_PUTPAGE(mp);
+               return -EIO;
+       }
        BT_PUSH(&btstack, bn, index);
 
        /* get child page */