diff --git a/fs/gfs2/locking/nolock/main.c b/fs/gfs2/locking/nolock/main.c
index 9398309f2810ac3615c179fcb78ce99e855bfff4..ecd37371eba5fd748122aedb943e563b422b6f8d 100644
--- a/fs/gfs2/locking/nolock/main.c
+++ b/fs/gfs2/locking/nolock/main.c
@@ -176,14 +176,13 @@ static void nolock_sync_lvb(lm_lock_t *lock, char *lvb)
 static int nolock_plock_get(lm_lockspace_t *lockspace, struct lm_lockname *name,
 			    struct file *file, struct file_lock *fl)
 {
-	struct file_lock *tmp;
+	struct file_lock tmp;
+	int ret;
 
-	lock_kernel();
-	tmp = posix_test_lock(file, fl);
+	ret = posix_test_lock(file, fl, &tmp);
 	fl->fl_type = F_UNLCK;
-	if (tmp)
-		memcpy(fl, tmp, sizeof(struct file_lock));
-	unlock_kernel();
+	if (ret)
+		memcpy(fl, &tmp, sizeof(struct file_lock));
 
 	return 0;
 }
@@ -192,9 +191,7 @@ static int nolock_plock(lm_lockspace_t *lockspace, struct lm_lockname *name,
 			struct file *file, int cmd, struct file_lock *fl)
 {
 	int error;
-	lock_kernel();
 	error = posix_lock_file_wait(file, fl);
-	unlock_kernel();
 	return error;
 }
 
@@ -202,9 +199,7 @@ static int nolock_punlock(lm_lockspace_t *lockspace, struct lm_lockname *name,
 			  struct file *file, struct file_lock *fl)
 {
 	int error;
-	lock_kernel();
 	error = posix_lock_file_wait(file, fl);
-	unlock_kernel();
 	return error;
 }
 
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index 01aa4a9b48c39483bdca721159cf2d6a3a38ef67..3fd8c6ec256cc4b692a88e4a1db01d69c57d8bb5 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -96,59 +96,6 @@ static int get_block_noalloc(struct inode *inode, sector_t lblock,
 	return error;
 }
 
-static int get_blocks(struct inode *inode, sector_t lblock,
-		      unsigned long max_blocks, struct buffer_head *bh_result,
-		      int create)
-{
-	struct gfs2_inode *ip = inode->u.generic_ip;
-	int new = create;
-	uint64_t dblock;
-	uint32_t extlen;
-	int error;
-
-	error = gfs2_block_map(ip, lblock, &new, &dblock, &extlen);
-	if (error)
-		return error;
-
-	if (!dblock)
-		return 0;
-
-	map_bh(bh_result, inode->i_sb, dblock);
-	if (new)
-		set_buffer_new(bh_result);
-
-	if (extlen > max_blocks)
-		extlen = max_blocks;
-	bh_result->b_size = extlen << inode->i_blkbits;
-
-	return 0;
-}
-
-static int get_blocks_noalloc(struct inode *inode, sector_t lblock,
-			      unsigned long max_blocks,
-			      struct buffer_head *bh_result, int create)
-{
-	struct gfs2_inode *ip = inode->u.generic_ip;
-	int new = 0;
-	uint64_t dblock;
-	uint32_t extlen;
-	int error;
-
-	error = gfs2_block_map(ip, lblock, &new, &dblock, &extlen);
-	if (error)
-		return error;
-
-	if (dblock) {
-		map_bh(bh_result, inode->i_sb, dblock);
-		if (extlen > max_blocks)
-			extlen = max_blocks;
-		bh_result->b_size = extlen << inode->i_blkbits;
-	} else if (gfs2_assert_withdraw(ip->i_sbd, !create))
-		error = -EIO;
-
-	return error;
-}
-
 /**
  * gfs2_writepage - Write complete page
  * @page: Page to write
@@ -527,16 +474,15 @@ static void discard_buffer(struct gfs2_sbd *sdp, struct buffer_head *bh)
 	unlock_buffer(bh);
 }
 
-static int gfs2_invalidatepage(struct page *page, unsigned long offset)
+static void gfs2_invalidatepage(struct page *page, unsigned long offset)
 {
 	struct gfs2_sbd *sdp = page->mapping->host->i_sb->s_fs_info;
 	struct buffer_head *head, *bh, *next;
 	unsigned int curr_off = 0;
-	int ret = 1;
 
 	BUG_ON(!PageLocked(page));
 	if (!page_has_buffers(page))
-		return 1;
+		return;
 
 	bh = head = page_buffers(page);
 	do {
@@ -551,9 +497,9 @@ static int gfs2_invalidatepage(struct page *page, unsigned long offset)
 	} while (bh != head);
 
 	if (!offset)
-		ret = try_to_release_page(page, 0);
+		try_to_release_page(page, 0);
 
-	return ret;
+	return;
 }
 
 static ssize_t gfs2_direct_IO_write(struct kiocb *iocb, const struct iovec *iov,
@@ -587,7 +533,7 @@ static ssize_t gfs2_direct_IO_write(struct kiocb *iocb, const struct iovec *iov,
 		goto out;
 
 	rv = __blockdev_direct_IO(WRITE, iocb, inode, inode->i_sb->s_bdev,
-				  iov, offset, nr_segs, get_blocks_noalloc,
+				  iov, offset, nr_segs, gfs2_get_block,
 				  NULL, DIO_OWN_LOCKING);
 out:
 	gfs2_glock_dq_m(1, &gh);
@@ -619,7 +565,7 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
 		return -EINVAL;
 
 	return __blockdev_direct_IO(READ, iocb, inode, inode->i_sb->s_bdev, iov,
-			 	    offset, nr_segs, get_blocks, NULL,
+			 	    offset, nr_segs, gfs2_get_block, NULL,
 				    DIO_OWN_LOCKING);
 }
 
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c
index db4484a3efccc07add8751ce87911e8acf33525b..c44225fa758bba83c842cceb0e337905ba1bceb5 100644
--- a/fs/gfs2/ops_file.c
+++ b/fs/gfs2/ops_file.c
@@ -833,20 +833,15 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl)
 
 	if (sdp->sd_args.ar_localflocks) {
 		if (IS_GETLK(cmd)) {
-			struct file_lock *tmp;
-			lock_kernel();
-			tmp = posix_test_lock(file, fl);
+			struct file_lock tmp;
+			int ret;
+			ret = posix_test_lock(file, fl, &tmp);
 			fl->fl_type = F_UNLCK;
-			if (tmp)
-				memcpy(fl, tmp, sizeof(struct file_lock));
-			unlock_kernel();
+			if (ret)
+				memcpy(fl, &tmp, sizeof(struct file_lock));
 			return 0;
 		} else {
-			int error;
-			lock_kernel();
-			error = posix_lock_file_wait(file, fl);
-			unlock_kernel();
-			return error;
+			return posix_lock_file_wait(file, fl);
 		}
 	}
 
@@ -983,6 +978,8 @@ struct file_operations gfs2_file_fops = {
 	.lock = gfs2_lock,
 	.sendfile = gfs2_sendfile,
 	.flock = gfs2_flock,
+	.splice_read = generic_file_splice_read,
+	.splice_write = generic_file_splice_write,
 };
 
 struct file_operations gfs2_dir_fops = {