[PATCH 14/24] pnfs_submit: use fsdata to pass lseg

Fred Isaman
2010-06-08T04:19:47Z

Preparing for LAYUTGET invocation in nfs_write_begin to be the
only invocation in the write path.

It isn't used at all yet, but it should be properly referenced/dereferenced

Signed-off-by: Fred Isaman <iisaman@netapp.com>
---
fs/nfs/file.c | 16 +++++++++++++---
1 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 03601d2..fde6cb5 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -420,6 +420,8 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping,
file->f_path.dentry->d_name.name,
mapping->host->i_ino, len, (long long) pos);

+ pnfs_update_layout(mapping->host, NULL, NFS4_MAX_UINT64, 0, IOMODE_RW,
+ (struct pnfs_layout_segment **) fsdata);
start:
/*
* Prevent starvation issues if someone is doing a consistency
@@ -428,11 +430,13 @@ start:
ret = wait_on_bit(&NFS_I(mapping->host)->flags, NFS_INO_FLUSHING,
nfs_wait_bit_killable, TASK_KILLABLE);
if (ret)
- return ret;
+ goto out;

page = grab_cache_page_write_begin(mapping, index, flags);
- if (!page)
- return -ENOMEM;
+ if (!page) {
+ ret = -ENOMEM;
+ goto out;
+ }
*pagep = page;

ret = nfs_flush_incompatible(file, page);
@@ -447,6 +451,11 @@ start:
if (!ret)
goto start;
}
+ out:
+ if (ret) {
+ put_lseg(*fsdata);
+ *fsdata = NULL;
+ }
return ret;
}

@@ -486,6 +495,7 @@ static int nfs_write_end(struct file *file, struct address_space *mapping,

unlock_page(page);
page_cache_release(page);
+ put_lseg(fsdata);

if (status < 0)
return status;
--
1.6.6.1