Merge git://git.kernel.org/pub/scm/linux/kernel/git/hch/xfs-icache-races
[safe/jmp/linux-2.6] / fs / gfs2 / inode.c
index 97d3ce6..2f94bd7 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/sort.h>
 #include <linux/gfs2_ondisk.h>
 #include <linux/crc32.h>
-#include <linux/lm_interface.h>
 #include <linux/security.h>
 #include <linux/time.h>
 
@@ -31,7 +30,6 @@
 #include "inode.h"
 #include "log.h"
 #include "meta_io.h"
-#include "ops_address.h"
 #include "quota.h"
 #include "rgrp.h"
 #include "trans.h"
@@ -137,13 +135,13 @@ void gfs2_set_iop(struct inode *inode)
 
        if (S_ISREG(mode)) {
                inode->i_op = &gfs2_file_iops;
-               if (sdp->sd_args.ar_localflocks)
+               if (gfs2_localflocks(sdp))
                        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;
-               if (sdp->sd_args.ar_localflocks)
+               if (gfs2_localflocks(sdp))
                        inode->i_fop = &gfs2_dir_fops_nolock;
                else
                        inode->i_fop = &gfs2_dir_fops;
@@ -386,7 +384,6 @@ int gfs2_dinode_dealloc(struct gfs2_inode *ip)
        gfs2_free_di(rgd, ip);
 
        gfs2_trans_end(sdp);
-       clear_bit(GLF_STICKY, &ip->i_gl->gl_flags);
 
 out_rg_gunlock:
        gfs2_glock_dq_uninit(&al->al_rgd_gh);
@@ -1049,154 +1046,7 @@ fail:
        return ERR_PTR(error);
 }
 
-/**
- * gfs2_rmdiri - Remove a directory
- * @dip: The parent directory of the directory to be removed
- * @name: The name of the directory to be removed
- * @ip: The GFS2 inode of the directory to be removed
- *
- * Assumes Glocks on dip and ip are held
- *
- * Returns: errno
- */
-
-int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
-               struct gfs2_inode *ip)
-{
-       struct qstr dotname;
-       int error;
-
-       if (ip->i_entries != 2) {
-               if (gfs2_consist_inode(ip))
-                       gfs2_dinode_print(ip);
-               return -EIO;
-       }
-
-       error = gfs2_dir_del(dip, name);
-       if (error)
-               return error;
-
-       error = gfs2_change_nlink(dip, -1);
-       if (error)
-               return error;
-
-       gfs2_str2qstr(&dotname, ".");
-       error = gfs2_dir_del(ip, &dotname);
-       if (error)
-               return error;
-
-       gfs2_str2qstr(&dotname, "..");
-       error = gfs2_dir_del(ip, &dotname);
-       if (error)
-               return error;
-
-       /* It looks odd, but it really should be done twice */
-       error = gfs2_change_nlink(ip, -1);
-       if (error)
-               return error;
-
-       error = gfs2_change_nlink(ip, -1);
-       if (error)
-               return error;
-
-       return error;
-}
-
-/*
- * gfs2_unlink_ok - check to see that a inode is still in a directory
- * @dip: the directory
- * @name: the name of the file
- * @ip: the inode
- *
- * Assumes that the lock on (at least) @dip is held.
- *
- * Returns: 0 if the parent/child relationship is correct, errno if it isn't
- */
-
-int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
-                  const struct gfs2_inode *ip)
-{
-       int error;
-
-       if (IS_IMMUTABLE(&ip->i_inode) || IS_APPEND(&ip->i_inode))
-               return -EPERM;
-
-       if ((dip->i_inode.i_mode & S_ISVTX) &&
-           dip->i_inode.i_uid != current_fsuid() &&
-           ip->i_inode.i_uid != current_fsuid() && !capable(CAP_FOWNER))
-               return -EPERM;
-
-       if (IS_APPEND(&dip->i_inode))
-               return -EPERM;
-
-       error = gfs2_permission(&dip->i_inode, MAY_WRITE | MAY_EXEC);
-       if (error)
-               return error;
-
-       error = gfs2_dir_check(&dip->i_inode, name, ip);
-       if (error)
-               return error;
-
-       return 0;
-}
-
-/**
- * gfs2_readlinki - return the contents of a symlink
- * @ip: the symlink's inode
- * @buf: a pointer to the buffer to be filled
- * @len: a pointer to the length of @buf
- *
- * If @buf is too small, a piece of memory is kmalloc()ed and needs
- * to be freed by the caller.
- *
- * Returns: errno
- */
-
-int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len)
-{
-       struct gfs2_holder i_gh;
-       struct buffer_head *dibh;
-       unsigned int x;
-       int error;
-
-       gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &i_gh);
-       error = gfs2_glock_nq(&i_gh);
-       if (error) {
-               gfs2_holder_uninit(&i_gh);
-               return error;
-       }
-
-       if (!ip->i_disksize) {
-               gfs2_consist_inode(ip);
-               error = -EIO;
-               goto out;
-       }
-
-       error = gfs2_meta_inode_buffer(ip, &dibh);
-       if (error)
-               goto out;
-
-       x = ip->i_disksize + 1;
-       if (x > *len) {
-               *buf = kmalloc(x, GFP_NOFS);
-               if (!*buf) {
-                       error = -ENOMEM;
-                       goto out_brelse;
-               }
-       }
-
-       memcpy(*buf, dibh->b_data + sizeof(struct gfs2_dinode), x);
-       *len = x;
-
-out_brelse:
-       brelse(dibh);
-out:
-       gfs2_glock_dq_uninit(&i_gh);
-       return error;
-}
-
-static int
-__gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr)
+static int __gfs2_setattr_simple(struct gfs2_inode *ip, struct iattr *attr)
 {
        struct buffer_head *dibh;
        int error;