]> err.no Git - linux-2.6/blobdiff - fs/gfs2/inode.c
Merge branch 'for-2.6.26' of git://linux-nfs.org/~bfields/linux
[linux-2.6] / fs / gfs2 / inode.c
index c3fe8aa03c4ec09794392c6d1ea0b7a088eb42f3..09453d057e4126535ab0c1641c75b4d6fa7b3808 100644 (file)
@@ -47,8 +47,7 @@ static int iget_test(struct inode *inode, void *opaque)
        struct gfs2_inode *ip = GFS2_I(inode);
        u64 *no_addr = opaque;
 
-       if (ip->i_no_addr == *no_addr &&
-           inode->i_private != NULL)
+       if (ip->i_no_addr == *no_addr && test_bit(GIF_USER, &ip->i_flags))
                return 1;
 
        return 0;
@@ -61,6 +60,7 @@ static int iget_set(struct inode *inode, void *opaque)
 
        inode->i_ino = (unsigned long)*no_addr;
        ip->i_no_addr = *no_addr;
+       set_bit(GIF_USER, &ip->i_flags);
        return 0;
 }
 
@@ -86,7 +86,7 @@ static int iget_skip_test(struct inode *inode, void *opaque)
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_skip_data *data = opaque;
 
-       if (ip->i_no_addr == data->no_addr && inode->i_private != NULL){
+       if (ip->i_no_addr == data->no_addr && test_bit(GIF_USER, &ip->i_flags)){
                if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)){
                        data->skipped = 1;
                        return 0;
@@ -105,6 +105,7 @@ static int iget_skip_set(struct inode *inode, void *opaque)
                return 1;
        inode->i_ino = (unsigned long)(data->no_addr);
        ip->i_no_addr = data->no_addr;
+       set_bit(GIF_USER, &ip->i_flags);
        return 0;
 }
 
@@ -149,7 +150,8 @@ void gfs2_set_iop(struct inode *inode)
        } else if (S_ISLNK(mode)) {
                inode->i_op = &gfs2_symlink_iops;
        } else {
-               inode->i_op = &gfs2_dev_iops;
+               inode->i_op = &gfs2_file_iops;
+               init_special_inode(inode, inode->i_mode, inode->i_rdev);
        }
 
        unlock_new_inode(inode);
@@ -165,7 +167,7 @@ void gfs2_set_iop(struct inode *inode)
  * Returns: A VFS inode, or an error
  */
 
-struct inode *gfs2_inode_lookup(struct super_block *sb, 
+struct inode *gfs2_inode_lookup(struct super_block *sb,
                                unsigned int type,
                                u64 no_addr,
                                u64 no_formal_ino, int skip_freeing)
@@ -186,7 +188,6 @@ struct inode *gfs2_inode_lookup(struct super_block *sb,
 
        if (inode->i_state & I_NEW) {
                struct gfs2_sbd *sdp = GFS2_SB(inode);
-               inode->i_private = ip;
                ip->i_no_formal_ino = no_formal_ino;
 
                error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
@@ -273,8 +274,7 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
        ip->i_inode.i_nlink = be32_to_cpu(str->di_nlink);
        di->di_size = be64_to_cpu(str->di_size);
        i_size_write(&ip->i_inode, di->di_size);
-       di->di_blocks = be64_to_cpu(str->di_blocks);
-       gfs2_set_inode_blocks(&ip->i_inode);
+       gfs2_set_inode_blocks(&ip->i_inode, be64_to_cpu(str->di_blocks));
        ip->i_inode.i_atime.tv_sec = be64_to_cpu(str->di_atime);
        ip->i_inode.i_atime.tv_nsec = be32_to_cpu(str->di_atime_nsec);
        ip->i_inode.i_mtime.tv_sec = be64_to_cpu(str->di_mtime);
@@ -344,13 +344,15 @@ int gfs2_dinode_dealloc(struct gfs2_inode *ip)
        struct gfs2_rgrpd *rgd;
        int error;
 
-       if (ip->i_di.di_blocks != 1) {
+       if (gfs2_get_inode_blocks(&ip->i_inode) != 1) {
                if (gfs2_consist_inode(ip))
                        gfs2_dinode_print(ip);
                return -EIO;
        }
 
        al = gfs2_alloc_get(ip);
+       if (!al)
+               return -ENOMEM;
 
        error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
        if (error)
@@ -494,7 +496,7 @@ struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
                return dir;
        }
 
-       if (gfs2_glock_is_locked_by_me(dip->i_gl) == 0) {
+       if (gfs2_glock_is_locked_by_me(dip->i_gl) == NULL) {
                error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
                if (error)
                        return ERR_PTR(error);
@@ -825,7 +827,8 @@ static int make_dinode(struct gfs2_inode *dip, struct gfs2_glock *gl,
        int error;
 
        munge_mode_uid_gid(dip, &mode, &uid, &gid);
-       gfs2_alloc_get(dip);
+       if (!gfs2_alloc_get(dip))
+               return -ENOMEM;
 
        error = gfs2_quota_lock(dip, uid, gid);
        if (error)
@@ -860,6 +863,8 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
        int error;
 
        al = gfs2_alloc_get(dip);
+       if (!al)
+               return -ENOMEM;
 
        error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
        if (error)
@@ -1226,7 +1231,7 @@ int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len)
 
        x = ip->i_di.di_size + 1;
        if (x > *len) {
-               *buf = kmalloc(x, GFP_KERNEL);
+               *buf = kmalloc(x, GFP_NOFS);
                if (!*buf) {
                        error = -ENOMEM;
                        goto out_brelse;
@@ -1398,7 +1403,7 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
        str->di_gid = cpu_to_be32(ip->i_inode.i_gid);
        str->di_nlink = cpu_to_be32(ip->i_inode.i_nlink);
        str->di_size = cpu_to_be64(di->di_size);
-       str->di_blocks = cpu_to_be64(di->di_blocks);
+       str->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
        str->di_atime = cpu_to_be64(ip->i_inode.i_atime.tv_sec);
        str->di_mtime = cpu_to_be64(ip->i_inode.i_mtime.tv_sec);
        str->di_ctime = cpu_to_be64(ip->i_inode.i_ctime.tv_sec);
@@ -1430,8 +1435,8 @@ void gfs2_dinode_print(const struct gfs2_inode *ip)
        printk(KERN_INFO "  no_addr = %llu\n",
               (unsigned long long)ip->i_no_addr);
        printk(KERN_INFO "  di_size = %llu\n", (unsigned long long)di->di_size);
-       printk(KERN_INFO "  di_blocks = %llu\n",
-              (unsigned long long)di->di_blocks);
+       printk(KERN_INFO "  blocks = %llu\n",
+              (unsigned long long)gfs2_get_inode_blocks(&ip->i_inode));
        printk(KERN_INFO "  i_goal = %llu\n",
               (unsigned long long)ip->i_goal);
        printk(KERN_INFO "  di_flags = 0x%.8X\n", di->di_flags);