]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'gfs2/master'
authorThierry Reding <treding@nvidia.com>
Mon, 21 Oct 2013 10:43:54 +0000 (12:43 +0200)
committerThierry Reding <treding@nvidia.com>
Mon, 21 Oct 2013 10:43:54 +0000 (12:43 +0200)
1  2 
fs/gfs2/aops.c
fs/gfs2/file.c
fs/gfs2/inode.c
lib/lockref.c

diff --combined fs/gfs2/aops.c
index 43e8eaaa0cf8d093496a2852e7e5443870be4045,b7fc035a6943cc40f649f1cca7be5858fbcf1cbc..01a2aa5f25a149c312f87d4ad6525ac0c1d808a6
@@@ -611,12 -611,14 +611,14 @@@ static int gfs2_write_begin(struct fil
                gfs2_write_calc_reserv(ip, len, &data_blocks, &ind_blocks);
  
        if (alloc_required) {
+               struct gfs2_alloc_parms ap = { .aflags = 0, };
                error = gfs2_quota_lock_check(ip);
                if (error)
                        goto out_unlock;
  
                requested = data_blocks + ind_blocks;
-               error = gfs2_inplace_reserve(ip, requested, 0);
+               ap.target = requested;
+               error = gfs2_inplace_reserve(ip, &ap);
                if (error)
                        goto out_qunlock;
        }
@@@ -979,7 -981,8 +981,7 @@@ static int gfs2_ok_for_dio(struct gfs2_
  
  
  static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
 -                            const struct iovec *iov, loff_t offset,
 -                            unsigned long nr_segs)
 +                            struct iov_iter *iter, loff_t offset)
  {
        struct file *file = iocb->ki_filp;
        struct inode *inode = file->f_mapping->host;
        if (rv != 1)
                goto out; /* dio not valid, fall back to buffered i/o */
  
 -      rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
 -                                offset, nr_segs, gfs2_get_block_direct,
 +      rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iter,
 +                                offset, gfs2_get_block_direct,
                                  NULL, NULL, 0);
  out:
        gfs2_glock_dq(&gh);
diff --combined fs/gfs2/file.c
index 28f462832e1850d5e70a2e50a1ef683abd3aef4c,efc078f0ee4ed5464646841a4035b933756b562e..0838913ca5687dc0e2abaaeb6ae4159a8458cce7
@@@ -383,6 -383,7 +383,7 @@@ static int gfs2_page_mkwrite(struct vm_
        struct inode *inode = file_inode(vma->vm_file);
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_sbd *sdp = GFS2_SB(inode);
+       struct gfs2_alloc_parms ap = { .aflags = 0, };
        unsigned long last_index;
        u64 pos = page->index << PAGE_CACHE_SHIFT;
        unsigned int data_blocks, ind_blocks, rblocks;
        if (ret)
                goto out_unlock;
        gfs2_write_calc_reserv(ip, PAGE_CACHE_SIZE, &data_blocks, &ind_blocks);
-       ret = gfs2_inplace_reserve(ip, data_blocks + ind_blocks, 0);
+       ap.target = data_blocks + ind_blocks;
+       ret = gfs2_inplace_reserve(ip, &ap);
        if (ret)
                goto out_quota_unlock;
  
@@@ -620,7 -622,7 +622,7 @@@ static int gfs2_release(struct inode *i
        if (!(file->f_mode & FMODE_WRITE))
                return 0;
  
-       gfs2_rs_delete(ip);
+       gfs2_rs_delete(ip, &inode->i_writecount);
        return 0;
  }
  
@@@ -681,9 -683,10 +683,9 @@@ static int gfs2_fsync(struct file *file
  }
  
  /**
 - * gfs2_file_aio_write - Perform a write to a file
 + * gfs2_file_write_iter - Perform a write to a file
   * @iocb: The io context
 - * @iov: The data to write
 - * @nr_segs: Number of @iov segments
 + * @iter: The data to write
   * @pos: The file position
   *
   * We have to do a lock/unlock here to refresh the inode size for
   *
   */
  
 -static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
 -                                 unsigned long nr_segs, loff_t pos)
 +static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *iter,
 +                                  loff_t pos)
  {
        struct file *file = iocb->ki_filp;
 -      size_t writesize = iov_length(iov, nr_segs);
 +      size_t writesize = iov_iter_count(iter);
        struct gfs2_inode *ip = GFS2_I(file_inode(file));
        int ret;
  
                gfs2_glock_dq_uninit(&gh);
        }
  
 -      return generic_file_aio_write(iocb, iov, nr_segs, pos);
 +      return generic_file_write_iter(iocb, iter, pos);
  }
  
  static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len,
@@@ -799,6 -802,7 +801,7 @@@ static long gfs2_fallocate(struct file 
        struct inode *inode = file_inode(file);
        struct gfs2_sbd *sdp = GFS2_SB(inode);
        struct gfs2_inode *ip = GFS2_I(inode);
+       struct gfs2_alloc_parms ap = { .aflags = 0, };
        unsigned int data_blocks = 0, ind_blocks = 0, rblocks;
        loff_t bytes, max_bytes;
        int error;
  retry:
                gfs2_write_calc_reserv(ip, bytes, &data_blocks, &ind_blocks);
  
-               error = gfs2_inplace_reserve(ip, data_blocks + ind_blocks, 0);
+               ap.target = data_blocks + ind_blocks;
+               error = gfs2_inplace_reserve(ip, &ap);
                if (error) {
                        if (error == -ENOSPC && bytes > sdp->sd_sb.sb_bsize) {
                                bytes >>= 1;
@@@ -1048,9 -1053,9 +1052,9 @@@ static int gfs2_flock(struct file *file
  const struct file_operations gfs2_file_fops = {
        .llseek         = gfs2_llseek,
        .read           = do_sync_read,
 -      .aio_read       = generic_file_aio_read,
 +      .read_iter      = generic_file_read_iter,
        .write          = do_sync_write,
 -      .aio_write      = gfs2_file_aio_write,
 +      .write_iter     = gfs2_file_write_iter,
        .unlocked_ioctl = gfs2_ioctl,
        .mmap           = gfs2_mmap,
        .open           = gfs2_open,
@@@ -1080,9 -1085,9 +1084,9 @@@ const struct file_operations gfs2_dir_f
  const struct file_operations gfs2_file_fops_nolock = {
        .llseek         = gfs2_llseek,
        .read           = do_sync_read,
 -      .aio_read       = generic_file_aio_read,
 +      .read_iter      = generic_file_read_iter,
        .write          = do_sync_write,
 -      .aio_write      = gfs2_file_aio_write,
 +      .write_iter     = gfs2_file_write_iter,
        .unlocked_ioctl = gfs2_ioctl,
        .mmap           = gfs2_mmap,
        .open           = gfs2_open,
diff --combined fs/gfs2/inode.c
index ced3257f06e84bd24b6d96063a4f88f5e2b81525,5a7ca3d1d1cf93578be6c034d6b2648b82761810..109ce9325b761211feb2facce8f721a7c8ac155d
@@@ -379,6 -379,7 +379,7 @@@ static void munge_mode_uid_gid(const st
  static int alloc_dinode(struct gfs2_inode *ip, u32 flags)
  {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
+       struct gfs2_alloc_parms ap = { .target = RES_DINODE, .aflags = flags, };
        int error;
        int dblocks = 1;
  
        if (error)
                goto out;
  
-       error = gfs2_inplace_reserve(ip, RES_DINODE, flags);
+       error = gfs2_inplace_reserve(ip, &ap);
        if (error)
                goto out_quota;
  
@@@ -472,6 -473,7 +473,7 @@@ static int link_dinode(struct gfs2_inod
                       struct gfs2_inode *ip, int arq)
  {
        struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
+       struct gfs2_alloc_parms ap = { .target = sdp->sd_max_dirres, };
        int error;
  
        if (arq) {
                if (error)
                        goto fail_quota_locks;
  
-               error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres, 0);
+               error = gfs2_inplace_reserve(dip, &ap);
                if (error)
                        goto fail_quota_locks;
  
@@@ -584,17 -586,17 +586,17 @@@ static int gfs2_create_inode(struct ino
        if (!IS_ERR(inode)) {
                d = d_splice_alias(inode, dentry);
                error = 0;
-               if (file && !IS_ERR(d)) {
-                       if (d == NULL)
-                               d = dentry;
-                       if (S_ISREG(inode->i_mode))
-                               error = finish_open(file, d, gfs2_open_common, opened);
-                       else
+               if (file) {
+                       if (S_ISREG(inode->i_mode)) {
+                               WARN_ON(d != NULL);
+                               error = finish_open(file, dentry, gfs2_open_common, opened);
+                       } else {
                                error = finish_no_open(file, d);
+                       }
+               } else {
+                       dput(d);
                }
                gfs2_glock_dq_uninit(ghs);
-               if (IS_ERR(d))
-                       return PTR_ERR(d);
                return error;
        } else if (error != -ENOENT) {
                goto fail_gunlock;
  
        mark_inode_dirty(inode);
        d_instantiate(dentry, inode);
 -      if (file)
 +      if (file) {
 +              *opened |= FILE_CREATED;
                error = finish_open(file, dentry, gfs2_open_common, opened);
 +      }
        gfs2_glock_dq_uninit(ghs);
        gfs2_glock_dq_uninit(ghs + 1);
        return error;
@@@ -713,7 -713,7 +715,7 @@@ fail_gunlock2
  fail_free_inode:
        if (ip->i_gl)
                gfs2_glock_put(ip->i_gl);
-       gfs2_rs_delete(ip);
+       gfs2_rs_delete(ip, NULL);
        free_inode_nonrcu(inode);
        inode = NULL;
  fail_gunlock:
@@@ -781,8 -781,10 +783,10 @@@ static struct dentry *__gfs2_lookup(str
                error = finish_open(file, dentry, gfs2_open_common, opened);
  
        gfs2_glock_dq_uninit(&gh);
-       if (error)
+       if (error) {
+               dput(d);
                return ERR_PTR(error);
+       }
        return d;
  }
  
@@@ -874,11 -876,12 +878,12 @@@ static int gfs2_link(struct dentry *old
        error = 0;
  
        if (alloc_required) {
+               struct gfs2_alloc_parms ap = { .target = sdp->sd_max_dirres, };
                error = gfs2_quota_lock_check(dip);
                if (error)
                        goto out_gunlock;
  
-               error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres, 0);
+               error = gfs2_inplace_reserve(dip, &ap);
                if (error)
                        goto out_gunlock_q;
  
@@@ -1163,14 -1166,16 +1168,16 @@@ static int gfs2_atomic_open(struct inod
        d = __gfs2_lookup(dir, dentry, file, opened);
        if (IS_ERR(d))
                return PTR_ERR(d);
-       if (d == NULL)
-               d = dentry;
-       if (d->d_inode) {
+       if (d != NULL)
+               dentry = d;
+       if (dentry->d_inode) {
                if (!(*opened & FILE_OPENED))
-                       return finish_no_open(file, d);
+                       return finish_no_open(file, dentry);
+               dput(d);
                return 0;
        }
  
+       BUG_ON(d != NULL);
        if (!(flags & O_CREAT))
                return -ENOENT;
  
@@@ -1385,11 -1390,12 +1392,12 @@@ static int gfs2_rename(struct inode *od
                goto out_gunlock;
  
        if (alloc_required) {
+               struct gfs2_alloc_parms ap = { .target = sdp->sd_max_dirres, };
                error = gfs2_quota_lock_check(ndip);
                if (error)
                        goto out_gunlock;
  
-               error = gfs2_inplace_reserve(ndip, sdp->sd_max_dirres, 0);
+               error = gfs2_inplace_reserve(ndip, &ap);
                if (error)
                        goto out_gunlock_q;
  
diff --combined lib/lockref.c
index 6f9d434c1521eab9ca0b2821d10936af55f2b703,8ff162fe3413f890e9b7a4bf4c0b6e80336e2ca5..af6e95d0bed6122bf9fd1e4af2bd76a4e2be62b3
@@@ -3,22 -3,6 +3,22 @@@
  
  #ifdef CONFIG_CMPXCHG_LOCKREF
  
 +/*
 + * Allow weakly-ordered memory architectures to provide barrier-less
 + * cmpxchg semantics for lockref updates.
 + */
 +#ifndef cmpxchg64_relaxed
 +# define cmpxchg64_relaxed cmpxchg64
 +#endif
 +
 +/*
 + * Allow architectures to override the default cpu_relax() within CMPXCHG_LOOP.
 + * This is useful for architectures with an expensive cpu_relax().
 + */
 +#ifndef arch_mutex_cpu_relax
 +# define arch_mutex_cpu_relax() cpu_relax()
 +#endif
 +
  /*
   * Note that the "cmpxchg()" reloads the "old" value for the
   * failure case.
        while (likely(arch_spin_value_unlocked(old.lock.rlock.raw_lock))) {     \
                struct lockref new = old, prev = old;                           \
                CODE                                                            \
 -              old.lock_count = cmpxchg(&lockref->lock_count,                  \
 -                                       old.lock_count, new.lock_count);       \
 +              old.lock_count = cmpxchg64_relaxed(&lockref->lock_count,        \
 +                                                 old.lock_count,              \
 +                                                 new.lock_count);             \
                if (likely(old.lock_count == prev.lock_count)) {                \
                        SUCCESS;                                                \
                }                                                               \
 -              cpu_relax();                                                    \
 +              arch_mutex_cpu_relax();                                         \
        }                                                                       \
  } while (0)
  
@@@ -153,6 -136,7 +153,7 @@@ void lockref_mark_dead(struct lockref *
        assert_spin_locked(&lockref->lock);
        lockref->count = -128;
  }
+ EXPORT_SYMBOL(lockref_mark_dead);
  
  /**
   * lockref_get_not_dead - Increments count unless the ref is dead