diff options
Diffstat (limited to 'fs/nfs/filelayout/filelayout.c')
-rw-r--r-- | fs/nfs/filelayout/filelayout.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index 90978075f730..abc5056999d6 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c | |||
@@ -265,7 +265,7 @@ filelayout_set_layoutcommit(struct nfs_pgio_header *hdr) | |||
265 | { | 265 | { |
266 | 266 | ||
267 | if (FILELAYOUT_LSEG(hdr->lseg)->commit_through_mds || | 267 | if (FILELAYOUT_LSEG(hdr->lseg)->commit_through_mds || |
268 | hdr->res.verf->committed == NFS_FILE_SYNC) | 268 | hdr->res.verf->committed != NFS_DATA_SYNC) |
269 | return; | 269 | return; |
270 | 270 | ||
271 | pnfs_set_layoutcommit(hdr); | 271 | pnfs_set_layoutcommit(hdr); |
@@ -403,6 +403,9 @@ static int filelayout_commit_done_cb(struct rpc_task *task, | |||
403 | return -EAGAIN; | 403 | return -EAGAIN; |
404 | } | 404 | } |
405 | 405 | ||
406 | if (data->verf.committed == NFS_UNSTABLE) | ||
407 | pnfs_commit_set_layoutcommit(data); | ||
408 | |||
406 | return 0; | 409 | return 0; |
407 | } | 410 | } |
408 | 411 | ||
@@ -646,18 +649,15 @@ filelayout_check_layout(struct pnfs_layout_hdr *lo, | |||
646 | } | 649 | } |
647 | 650 | ||
648 | /* find and reference the deviceid */ | 651 | /* find and reference the deviceid */ |
649 | d = nfs4_find_get_deviceid(NFS_SERVER(lo->plh_inode)->pnfs_curr_ld, | 652 | d = nfs4_find_get_deviceid(NFS_SERVER(lo->plh_inode), id, |
650 | NFS_SERVER(lo->plh_inode)->nfs_client, id); | 653 | lo->plh_lc_cred, gfp_flags); |
651 | if (d == NULL) { | 654 | if (d == NULL) |
652 | dsaddr = filelayout_get_device_info(lo->plh_inode, id, | 655 | goto out; |
653 | lo->plh_lc_cred, gfp_flags); | 656 | |
654 | if (dsaddr == NULL) | 657 | dsaddr = container_of(d, struct nfs4_file_layout_dsaddr, id_node); |
655 | goto out; | ||
656 | } else | ||
657 | dsaddr = container_of(d, struct nfs4_file_layout_dsaddr, id_node); | ||
658 | /* Found deviceid is unavailable */ | 658 | /* Found deviceid is unavailable */ |
659 | if (filelayout_test_devid_unavailable(&dsaddr->id_node)) | 659 | if (filelayout_test_devid_unavailable(&dsaddr->id_node)) |
660 | goto out_put; | 660 | goto out_put; |
661 | 661 | ||
662 | fl->dsaddr = dsaddr; | 662 | fl->dsaddr = dsaddr; |
663 | 663 | ||
@@ -1368,6 +1368,17 @@ out: | |||
1368 | cinfo->ds->ncommitting = 0; | 1368 | cinfo->ds->ncommitting = 0; |
1369 | return PNFS_ATTEMPTED; | 1369 | return PNFS_ATTEMPTED; |
1370 | } | 1370 | } |
1371 | static struct nfs4_deviceid_node * | ||
1372 | filelayout_alloc_deviceid_node(struct nfs_server *server, | ||
1373 | struct pnfs_device *pdev, gfp_t gfp_flags) | ||
1374 | { | ||
1375 | struct nfs4_file_layout_dsaddr *dsaddr; | ||
1376 | |||
1377 | dsaddr = nfs4_fl_alloc_deviceid_node(server, pdev, gfp_flags); | ||
1378 | if (!dsaddr) | ||
1379 | return NULL; | ||
1380 | return &dsaddr->id_node; | ||
1381 | } | ||
1371 | 1382 | ||
1372 | static void | 1383 | static void |
1373 | filelayout_free_deveiceid_node(struct nfs4_deviceid_node *d) | 1384 | filelayout_free_deveiceid_node(struct nfs4_deviceid_node *d) |
@@ -1420,6 +1431,7 @@ static struct pnfs_layoutdriver_type filelayout_type = { | |||
1420 | .commit_pagelist = filelayout_commit_pagelist, | 1431 | .commit_pagelist = filelayout_commit_pagelist, |
1421 | .read_pagelist = filelayout_read_pagelist, | 1432 | .read_pagelist = filelayout_read_pagelist, |
1422 | .write_pagelist = filelayout_write_pagelist, | 1433 | .write_pagelist = filelayout_write_pagelist, |
1434 | .alloc_deviceid_node = filelayout_alloc_deviceid_node, | ||
1423 | .free_deviceid_node = filelayout_free_deveiceid_node, | 1435 | .free_deviceid_node = filelayout_free_deveiceid_node, |
1424 | }; | 1436 | }; |
1425 | 1437 | ||