Merge branch 'for-linus' from kernel.org:/.../shaggy/jfs-2.6 manually
[pandora-kernel.git] / fs / jfs / inode.c
index 6c04f5e..0ec62d5 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/pagemap.h>
 #include <linux/quotaops.h>
 #include "jfs_incore.h"
+#include "jfs_inode.h"
 #include "jfs_filsys.h"
 #include "jfs_imap.h"
 #include "jfs_extent.h"
 #include "jfs_debug.h"
 
 
-extern struct inode_operations jfs_dir_inode_operations;
-extern struct inode_operations jfs_file_inode_operations;
-extern struct inode_operations jfs_symlink_inode_operations;
-extern struct file_operations jfs_dir_operations;
-extern struct file_operations jfs_file_operations;
-struct address_space_operations jfs_aops;
-extern int freeZeroLink(struct inode *);
-
 void jfs_read_inode(struct inode *inode)
 {
        if (diRead(inode)) { 
@@ -135,17 +128,23 @@ void jfs_delete_inode(struct inode *inode)
 {
        jfs_info("In jfs_delete_inode, inode = 0x%p", inode);
 
-       if (test_cflag(COMMIT_Freewmap, inode))
-               freeZeroLink(inode);
+       if (!is_bad_inode(inode) &&
+           (JFS_IP(inode)->fileset == cpu_to_le32(FILESYSTEM_I))) {
 
-       diFree(inode);
+               truncate_inode_pages(&inode->i_data, 0);
 
-       /*
-        * Free the inode from the quota allocation.
-        */
-       DQUOT_INIT(inode);
-       DQUOT_FREE_INODE(inode);
-       DQUOT_DROP(inode);
+               if (test_cflag(COMMIT_Freewmap, inode))
+                       jfs_free_zero_link(inode);
+
+               diFree(inode);
+
+               /*
+                * Free the inode from the quota allocation.
+                */
+               DQUOT_INIT(inode);
+               DQUOT_FREE_INODE(inode);
+               DQUOT_DROP(inode);
+       }
 
        clear_inode(inode);
 }
@@ -178,7 +177,7 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks,
        xad_t xad;
        s64 xaddr;
        int xflag;
-       s32 xlen;
+       s32 xlen = max_blocks;
 
        /*
         * Take appropriate lock on inode
@@ -190,7 +189,7 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks,
 
        if (((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size) &&
            (!xtLookup(ip, lblock64, max_blocks, &xflag, &xaddr, &xlen, 0)) &&
-           xlen) {
+           xaddr) {
                if (xflag & XAD_NOTRECORDED) {
                        if (!create)
                                /*
@@ -229,7 +228,7 @@ jfs_get_blocks(struct inode *ip, sector_t lblock, unsigned long max_blocks,
 #ifdef _JFS_4K
        if ((rc = extHint(ip, lblock64 << ip->i_sb->s_blocksize_bits, &xad)))
                goto unlock;
-       rc = extAlloc(ip, max_blocks, lblock64, &xad, FALSE);
+       rc = extAlloc(ip, xlen, lblock64, &xad, FALSE);
        if (rc)
                goto unlock;