]> err.no Git - linux-2.6/blobdiff - fs/gfs2/inode.c
ext[234]: use ext[234]_get_group_desc()
[linux-2.6] / fs / gfs2 / inode.c
index af493fc6c8ce7596c453068b6d34e765646f57d4..728d3169e7bd5b32b112bf29852d52c394ef6915 100644 (file)
@@ -131,15 +131,21 @@ static struct inode *gfs2_iget_skip(struct super_block *sb,
 
 void gfs2_set_iop(struct inode *inode)
 {
+       struct gfs2_sbd *sdp = GFS2_SB(inode);
        umode_t mode = inode->i_mode;
 
        if (S_ISREG(mode)) {
                inode->i_op = &gfs2_file_iops;
-               inode->i_fop = &gfs2_file_fops;
-               inode->i_mapping->a_ops = &gfs2_file_aops;
+               if (sdp->sd_args.ar_localflocks)
+                       inode->i_fop = &gfs2_file_fops_nolock;
+               else
+                       inode->i_fop = &gfs2_file_fops;
        } else if (S_ISDIR(mode)) {
                inode->i_op = &gfs2_dir_iops;
-               inode->i_fop = &gfs2_dir_fops;
+               if (sdp->sd_args.ar_localflocks)
+                       inode->i_fop = &gfs2_dir_fops_nolock;
+               else
+                       inode->i_fop = &gfs2_dir_fops;
        } else if (S_ISLNK(mode)) {
                inode->i_op = &gfs2_symlink_iops;
        } else {
@@ -290,6 +296,9 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
        di->di_entries = be32_to_cpu(str->di_entries);
 
        di->di_eattr = be64_to_cpu(str->di_eattr);
+       if (S_ISREG(ip->i_inode.i_mode))
+               gfs2_set_aops(&ip->i_inode);
+
        return 0;
 }
 
@@ -360,7 +369,8 @@ int gfs2_dinode_dealloc(struct gfs2_inode *ip)
        if (error)
                goto out_rg_gunlock;
 
-       gfs2_trans_add_gl(ip->i_gl);
+       set_bit(GLF_DIRTY, &ip->i_gl->gl_flags);
+       set_bit(GLF_LFLUSH, &ip->i_gl->gl_flags);
 
        gfs2_free_di(rgd, ip);
 
@@ -701,9 +711,10 @@ static int alloc_dinode(struct gfs2_inode *dip, u64 *no_addr, u64 *generation)
        struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
        int error;
 
-       gfs2_alloc_get(dip);
+       if (gfs2_alloc_get(dip) == NULL)
+               return -ENOMEM;
 
-       dip->i_alloc.al_requested = RES_DINODE;
+       dip->i_alloc->al_requested = RES_DINODE;
        error = gfs2_inplace_reserve(dip);
        if (error)
                goto out;
@@ -849,7 +860,7 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
 
        error = alloc_required = gfs2_diradd_alloc_required(&dip->i_inode, name);
        if (alloc_required < 0)
-               goto fail;
+               goto fail_quota_locks;
        if (alloc_required) {
                error = gfs2_quota_check(dip, dip->i_inode.i_uid, dip->i_inode.i_gid);
                if (error)
@@ -890,7 +901,7 @@ fail_end_trans:
        gfs2_trans_end(sdp);
 
 fail_ipreserv:
-       if (dip->i_alloc.al_rgd)
+       if (dip->i_alloc->al_rgd)
                gfs2_inplace_release(dip);
 
 fail_quota_locks: