From 1d8a1dde88bd111395b1c30d057fc5a516f9aa26 Mon Sep 17 00:00:00 2001 From: Boaz Harrosh Date: Fri, 6 Jan 2012 09:31:20 +0200 Subject: [PATCH] --- yaml --- r: 282943 b: refs/heads/master c: fe0fe83585f88346557868a803a479dfaaa0688a h: refs/heads/master i: 282941: 7007e83c8b43cde6d5c6ad3cf6228d3f8afdbf0c 282939: e7ac9b03d8e6ac04642837618b5200b994e74577 282935: 46471fc312ea2a437ec2a6dc5b291717d7345ca6 282927: d614fc1e3434ff07fd13c2bba3a7c814ee686bdb 282911: 2820ab4b11c42af363a460b32b31a3dfc034b0e9 282879: e57986ba4651c4ba6d26a0ef2c5ca8911714df85 v: v3 --- [refs] | 2 +- trunk/fs/nfs/objlayout/objio_osd.c | 3 ++- trunk/fs/nfs/pnfs.c | 12 ++++++++++++ trunk/fs/nfs/pnfs.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 9622bef88ef6..c8bd48179362 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5c0b4129c07b902b27d3f3ebc087757f534a3abd +refs/heads/master: fe0fe83585f88346557868a803a479dfaaa0688a diff --git a/trunk/fs/nfs/objlayout/objio_osd.c b/trunk/fs/nfs/objlayout/objio_osd.c index c807ab93140e..55d01280a609 100644 --- a/trunk/fs/nfs/objlayout/objio_osd.c +++ b/trunk/fs/nfs/objlayout/objio_osd.c @@ -551,7 +551,8 @@ static const struct nfs_pageio_ops objio_pg_write_ops = { static struct pnfs_layoutdriver_type objlayout_type = { .id = LAYOUT_OSD2_OBJECTS, .name = "LAYOUT_OSD2_OBJECTS", - .flags = PNFS_LAYOUTRET_ON_SETATTR, + .flags = PNFS_LAYOUTRET_ON_SETATTR | + PNFS_LAYOUTRET_ON_ERROR, .alloc_layout_hdr = objlayout_alloc_layout_hdr, .free_layout_hdr = objlayout_free_layout_hdr, diff --git a/trunk/fs/nfs/pnfs.c b/trunk/fs/nfs/pnfs.c index 8e672a2b2d69..f881a6387942 100644 --- a/trunk/fs/nfs/pnfs.c +++ b/trunk/fs/nfs/pnfs.c @@ -1178,6 +1178,15 @@ void pnfs_ld_write_done(struct nfs_write_data *data) put_lseg(data->lseg); data->lseg = NULL; dprintk("pnfs write error = %d\n", data->pnfs_error); + if (NFS_SERVER(data->inode)->pnfs_curr_ld->flags & + PNFS_LAYOUTRET_ON_ERROR) { + /* Don't lo_commit on error, Server will needs to + * preform a file recovery. + */ + clear_bit(NFS_INO_LAYOUTCOMMIT, + &NFS_I(data->inode)->flags); + pnfs_return_layout(data->inode); + } } data->mds_ops->rpc_release(data); } @@ -1267,6 +1276,9 @@ static void pnfs_ld_handle_read_error(struct nfs_read_data *data) put_lseg(data->lseg); data->lseg = NULL; dprintk("pnfs write error = %d\n", data->pnfs_error); + if (NFS_SERVER(data->inode)->pnfs_curr_ld->flags & + PNFS_LAYOUTRET_ON_ERROR) + pnfs_return_layout(data->inode); nfs_pageio_init_read_mds(&pgio, data->inode); diff --git a/trunk/fs/nfs/pnfs.h b/trunk/fs/nfs/pnfs.h index 1509530cb111..53d593a0a4f2 100644 --- a/trunk/fs/nfs/pnfs.h +++ b/trunk/fs/nfs/pnfs.h @@ -68,6 +68,7 @@ enum { enum layoutdriver_policy_flags { /* Should the pNFS client commit and return the layout upon a setattr */ PNFS_LAYOUTRET_ON_SETATTR = 1 << 0, + PNFS_LAYOUTRET_ON_ERROR = 1 << 1, }; struct nfs4_deviceid_node;