summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/locking/nolock/main.c15
-rw-r--r--fs/gfs2/ops_address.c66
-rw-r--r--fs/gfs2/ops_file.c19
3 files changed, 19 insertions, 81 deletions
diff --git a/fs/gfs2/locking/nolock/main.c b/fs/gfs2/locking/nolock/main.c
index 9398309f2810..ecd37371eba5 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 01aa4a9b48c3..3fd8c6ec256c 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 db4484a3efcc..c44225fa758b 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 = {