vserver 1.9.3
[linux-2.6.git] / fs / jfs / jfs_imap.c
index 6a6f147..084ec26 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *   Copyright (C) International Business Machines Corp., 2000-2003
+ *   Copyright (C) International Business Machines Corp., 2000-2004
  *
  *   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
@@ -44,6 +44,7 @@
 #include <linux/fs.h>
 #include <linux/buffer_head.h>
 #include <linux/pagemap.h>
+#include <linux/quotaops.h>
 #include <linux/vserver/xid.h>
 
 #include "jfs_incore.h"
@@ -505,6 +506,9 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary)
        ip->i_mapping->a_ops = &jfs_aops;
        mapping_set_gfp_mask(ip->i_mapping, GFP_NOFS);
 
+       /* Allocations to metadata inodes should not affect quotas */
+       ip->i_flags |= S_NOQUOTA;
+
        if ((inum == FILESYSTEM_I) && (JFS_IP(ip)->ipimap == sbi->ipaimap)) {
                sbi->gengen = le32_to_cpu(dp->di_gengen);
                sbi->inostamp = le32_to_cpu(dp->di_inostamp);
@@ -2602,28 +2606,11 @@ diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)
                        iagp->inosmap[i] = ONES;
 
                flush_metapage(mp);
-#ifdef _STILL_TO_PORT
-               /* synchronously write the iag page */
-               if (bmWrite(bp)) {
-                       /* Free the blocks allocated for the iag since it was
-                        * not successfully added to the inode map
-                        */
-                       dbFree(ipimap, xaddr, (s64) xlen);
-
-                       /* release the inode map lock */
-                       IWRITE_UNLOCK(ipimap);
-
-                       rc = -EIO;
-                       goto out;
-               }
-
-               /* Now the iag is on disk */
 
                /*
                 * start tyransaction of update of the inode map
                 * addressing structure pointing to the new iag page;
                 */
-#endif                         /*  _STILL_TO_PORT */
                tid = txBegin(sb, COMMIT_FORCE);
                down(&JFS_IP(ipimap)->commit_sem);
 
@@ -2645,7 +2632,7 @@ diNewIAG(struct inomap * imap, int *iagnop, int agno, struct metapage ** mpp)
 
                /* update the inode map's inode to reflect the extension */
                ipimap->i_size += PSIZE;
-               ipimap->i_blocks += LBLK2PBLK(sb, xlen);
+               inode_add_bytes(ipimap, PSIZE);
 
                /*
                 * txCommit(COMMIT_FORCE) will synchronously write address 
@@ -3086,7 +3073,7 @@ static void duplicateIXtree(struct super_block *sb, s64 blkno,
        }
        /* update the inode map's inode to reflect the extension */
        ip->i_size += PSIZE;
-       ip->i_blocks += LBLK2PBLK(sb, xlen);
+       inode_add_bytes(ip, PSIZE);
        txCommit(tid, 1, &ip, COMMIT_FORCE);
       cleanup:
        txEnd(tid);
@@ -3119,7 +3106,7 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip)
        ip->i_uid = INOXID_UID(XID_TAG(ip), uid, gid);
        ip->i_gid = INOXID_GID(XID_TAG(ip), uid, gid);
        ip->i_xid = INOXID_XID(XID_TAG(ip), uid, gid, 0);
-       
+
        ip->i_size = le64_to_cpu(dip->di_size);
        ip->i_atime.tv_sec = le32_to_cpu(dip->di_atime.tv_sec);
        ip->i_atime.tv_nsec = le32_to_cpu(dip->di_atime.tv_nsec);