diff options
Diffstat (limited to 'fs/nfs/pnfs.c')
-rw-r--r-- | fs/nfs/pnfs.c | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 17149a49006..b5d45158694 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
@@ -101,8 +101,8 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh, | |||
101 | goto out_no_driver; | 101 | goto out_no_driver; |
102 | if (!(server->nfs_client->cl_exchange_flags & | 102 | if (!(server->nfs_client->cl_exchange_flags & |
103 | (EXCHGID4_FLAG_USE_NON_PNFS | EXCHGID4_FLAG_USE_PNFS_MDS))) { | 103 | (EXCHGID4_FLAG_USE_NON_PNFS | EXCHGID4_FLAG_USE_PNFS_MDS))) { |
104 | printk(KERN_ERR "%s: id %u cl_exchange_flags 0x%x\n", __func__, | 104 | printk(KERN_ERR "NFS: %s: id %u cl_exchange_flags 0x%x\n", |
105 | id, server->nfs_client->cl_exchange_flags); | 105 | __func__, id, server->nfs_client->cl_exchange_flags); |
106 | goto out_no_driver; | 106 | goto out_no_driver; |
107 | } | 107 | } |
108 | ld_type = find_pnfs_driver(id); | 108 | ld_type = find_pnfs_driver(id); |
@@ -122,8 +122,8 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh, | |||
122 | server->pnfs_curr_ld = ld_type; | 122 | server->pnfs_curr_ld = ld_type; |
123 | if (ld_type->set_layoutdriver | 123 | if (ld_type->set_layoutdriver |
124 | && ld_type->set_layoutdriver(server, mntfh)) { | 124 | && ld_type->set_layoutdriver(server, mntfh)) { |
125 | printk(KERN_ERR "%s: Error initializing pNFS layout driver %u.\n", | 125 | printk(KERN_ERR "NFS: %s: Error initializing pNFS layout " |
126 | __func__, id); | 126 | "driver %u.\n", __func__, id); |
127 | module_put(ld_type->owner); | 127 | module_put(ld_type->owner); |
128 | goto out_no_driver; | 128 | goto out_no_driver; |
129 | } | 129 | } |
@@ -143,11 +143,11 @@ pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *ld_type) | |||
143 | struct pnfs_layoutdriver_type *tmp; | 143 | struct pnfs_layoutdriver_type *tmp; |
144 | 144 | ||
145 | if (ld_type->id == 0) { | 145 | if (ld_type->id == 0) { |
146 | printk(KERN_ERR "%s id 0 is reserved\n", __func__); | 146 | printk(KERN_ERR "NFS: %s id 0 is reserved\n", __func__); |
147 | return status; | 147 | return status; |
148 | } | 148 | } |
149 | if (!ld_type->alloc_lseg || !ld_type->free_lseg) { | 149 | if (!ld_type->alloc_lseg || !ld_type->free_lseg) { |
150 | printk(KERN_ERR "%s Layout driver must provide " | 150 | printk(KERN_ERR "NFS: %s Layout driver must provide " |
151 | "alloc_lseg and free_lseg.\n", __func__); | 151 | "alloc_lseg and free_lseg.\n", __func__); |
152 | return status; | 152 | return status; |
153 | } | 153 | } |
@@ -160,7 +160,7 @@ pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *ld_type) | |||
160 | dprintk("%s Registering id:%u name:%s\n", __func__, ld_type->id, | 160 | dprintk("%s Registering id:%u name:%s\n", __func__, ld_type->id, |
161 | ld_type->name); | 161 | ld_type->name); |
162 | } else { | 162 | } else { |
163 | printk(KERN_ERR "%s Module with id %d already loaded!\n", | 163 | printk(KERN_ERR "NFS: %s Module with id %d already loaded!\n", |
164 | __func__, ld_type->id); | 164 | __func__, ld_type->id); |
165 | } | 165 | } |
166 | spin_unlock(&pnfs_spinlock); | 166 | spin_unlock(&pnfs_spinlock); |
@@ -496,12 +496,12 @@ pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new, | |||
496 | { | 496 | { |
497 | u32 oldseq, newseq; | 497 | u32 oldseq, newseq; |
498 | 498 | ||
499 | oldseq = be32_to_cpu(lo->plh_stateid.stateid.seqid); | 499 | oldseq = be32_to_cpu(lo->plh_stateid.seqid); |
500 | newseq = be32_to_cpu(new->stateid.seqid); | 500 | newseq = be32_to_cpu(new->seqid); |
501 | if ((int)(newseq - oldseq) > 0) { | 501 | if ((int)(newseq - oldseq) > 0) { |
502 | memcpy(&lo->plh_stateid, &new->stateid, sizeof(new->stateid)); | 502 | nfs4_stateid_copy(&lo->plh_stateid, new); |
503 | if (update_barrier) { | 503 | if (update_barrier) { |
504 | u32 new_barrier = be32_to_cpu(new->stateid.seqid); | 504 | u32 new_barrier = be32_to_cpu(new->seqid); |
505 | 505 | ||
506 | if ((int)(new_barrier - lo->plh_barrier)) | 506 | if ((int)(new_barrier - lo->plh_barrier)) |
507 | lo->plh_barrier = new_barrier; | 507 | lo->plh_barrier = new_barrier; |
@@ -525,7 +525,7 @@ pnfs_layoutgets_blocked(struct pnfs_layout_hdr *lo, nfs4_stateid *stateid, | |||
525 | int lget) | 525 | int lget) |
526 | { | 526 | { |
527 | if ((stateid) && | 527 | if ((stateid) && |
528 | (int)(lo->plh_barrier - be32_to_cpu(stateid->stateid.seqid)) >= 0) | 528 | (int)(lo->plh_barrier - be32_to_cpu(stateid->seqid)) >= 0) |
529 | return true; | 529 | return true; |
530 | return lo->plh_block_lgets || | 530 | return lo->plh_block_lgets || |
531 | test_bit(NFS_LAYOUT_DESTROYED, &lo->plh_flags) || | 531 | test_bit(NFS_LAYOUT_DESTROYED, &lo->plh_flags) || |
@@ -549,11 +549,10 @@ pnfs_choose_layoutget_stateid(nfs4_stateid *dst, struct pnfs_layout_hdr *lo, | |||
549 | 549 | ||
550 | do { | 550 | do { |
551 | seq = read_seqbegin(&open_state->seqlock); | 551 | seq = read_seqbegin(&open_state->seqlock); |
552 | memcpy(dst->data, open_state->stateid.data, | 552 | nfs4_stateid_copy(dst, &open_state->stateid); |
553 | sizeof(open_state->stateid.data)); | ||
554 | } while (read_seqretry(&open_state->seqlock, seq)); | 553 | } while (read_seqretry(&open_state->seqlock, seq)); |
555 | } else | 554 | } else |
556 | memcpy(dst->data, lo->plh_stateid.data, sizeof(lo->plh_stateid.data)); | 555 | nfs4_stateid_copy(dst, &lo->plh_stateid); |
557 | spin_unlock(&lo->plh_inode->i_lock); | 556 | spin_unlock(&lo->plh_inode->i_lock); |
558 | dprintk("<-- %s\n", __func__); | 557 | dprintk("<-- %s\n", __func__); |
559 | return status; | 558 | return status; |
@@ -590,7 +589,7 @@ send_layoutget(struct pnfs_layout_hdr *lo, | |||
590 | max_resp_sz = server->nfs_client->cl_session->fc_attrs.max_resp_sz; | 589 | max_resp_sz = server->nfs_client->cl_session->fc_attrs.max_resp_sz; |
591 | max_pages = max_resp_sz >> PAGE_SHIFT; | 590 | max_pages = max_resp_sz >> PAGE_SHIFT; |
592 | 591 | ||
593 | pages = kzalloc(max_pages * sizeof(struct page *), gfp_flags); | 592 | pages = kcalloc(max_pages, sizeof(struct page *), gfp_flags); |
594 | if (!pages) | 593 | if (!pages) |
595 | goto out_err_free; | 594 | goto out_err_free; |
596 | 595 | ||
@@ -760,7 +759,7 @@ bool pnfs_roc_drain(struct inode *ino, u32 *barrier) | |||
760 | } | 759 | } |
761 | if (!found) { | 760 | if (!found) { |
762 | struct pnfs_layout_hdr *lo = nfsi->layout; | 761 | struct pnfs_layout_hdr *lo = nfsi->layout; |
763 | u32 current_seqid = be32_to_cpu(lo->plh_stateid.stateid.seqid); | 762 | u32 current_seqid = be32_to_cpu(lo->plh_stateid.seqid); |
764 | 763 | ||
765 | /* Since close does not return a layout stateid for use as | 764 | /* Since close does not return a layout stateid for use as |
766 | * a barrier, we choose the worst-case barrier. | 765 | * a barrier, we choose the worst-case barrier. |
@@ -966,8 +965,7 @@ pnfs_update_layout(struct inode *ino, | |||
966 | } | 965 | } |
967 | 966 | ||
968 | /* Do we even need to bother with this? */ | 967 | /* Do we even need to bother with this? */ |
969 | if (test_bit(NFS4CLNT_LAYOUTRECALL, &clp->cl_state) || | 968 | if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { |
970 | test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { | ||
971 | dprintk("%s matches recall, use MDS\n", __func__); | 969 | dprintk("%s matches recall, use MDS\n", __func__); |
972 | goto out_unlock; | 970 | goto out_unlock; |
973 | } | 971 | } |
@@ -1032,7 +1030,6 @@ pnfs_layout_process(struct nfs4_layoutget *lgp) | |||
1032 | struct nfs4_layoutget_res *res = &lgp->res; | 1030 | struct nfs4_layoutget_res *res = &lgp->res; |
1033 | struct pnfs_layout_segment *lseg; | 1031 | struct pnfs_layout_segment *lseg; |
1034 | struct inode *ino = lo->plh_inode; | 1032 | struct inode *ino = lo->plh_inode; |
1035 | struct nfs_client *clp = NFS_SERVER(ino)->nfs_client; | ||
1036 | int status = 0; | 1033 | int status = 0; |
1037 | 1034 | ||
1038 | /* Inject layout blob into I/O device driver */ | 1035 | /* Inject layout blob into I/O device driver */ |
@@ -1048,8 +1045,7 @@ pnfs_layout_process(struct nfs4_layoutget *lgp) | |||
1048 | } | 1045 | } |
1049 | 1046 | ||
1050 | spin_lock(&ino->i_lock); | 1047 | spin_lock(&ino->i_lock); |
1051 | if (test_bit(NFS4CLNT_LAYOUTRECALL, &clp->cl_state) || | 1048 | if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { |
1052 | test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { | ||
1053 | dprintk("%s forget reply due to recall\n", __func__); | 1049 | dprintk("%s forget reply due to recall\n", __func__); |
1054 | goto out_forget_reply; | 1050 | goto out_forget_reply; |
1055 | } | 1051 | } |
@@ -1214,6 +1210,7 @@ void pnfs_ld_write_done(struct nfs_write_data *data) | |||
1214 | } | 1210 | } |
1215 | data->task.tk_status = pnfs_write_done_resend_to_mds(data->inode, &data->pages); | 1211 | data->task.tk_status = pnfs_write_done_resend_to_mds(data->inode, &data->pages); |
1216 | } | 1212 | } |
1213 | put_lseg(data->lseg); | ||
1217 | data->mds_ops->rpc_release(data); | 1214 | data->mds_ops->rpc_release(data); |
1218 | } | 1215 | } |
1219 | EXPORT_SYMBOL_GPL(pnfs_ld_write_done); | 1216 | EXPORT_SYMBOL_GPL(pnfs_ld_write_done); |
@@ -1227,6 +1224,7 @@ pnfs_write_through_mds(struct nfs_pageio_descriptor *desc, | |||
1227 | nfs_list_add_request(data->req, &desc->pg_list); | 1224 | nfs_list_add_request(data->req, &desc->pg_list); |
1228 | nfs_pageio_reset_write_mds(desc); | 1225 | nfs_pageio_reset_write_mds(desc); |
1229 | desc->pg_recoalesce = 1; | 1226 | desc->pg_recoalesce = 1; |
1227 | put_lseg(data->lseg); | ||
1230 | nfs_writedata_release(data); | 1228 | nfs_writedata_release(data); |
1231 | } | 1229 | } |
1232 | 1230 | ||
@@ -1327,6 +1325,7 @@ void pnfs_ld_read_done(struct nfs_read_data *data) | |||
1327 | data->mds_ops->rpc_call_done(&data->task, data); | 1325 | data->mds_ops->rpc_call_done(&data->task, data); |
1328 | } else | 1326 | } else |
1329 | pnfs_ld_handle_read_error(data); | 1327 | pnfs_ld_handle_read_error(data); |
1328 | put_lseg(data->lseg); | ||
1330 | data->mds_ops->rpc_release(data); | 1329 | data->mds_ops->rpc_release(data); |
1331 | } | 1330 | } |
1332 | EXPORT_SYMBOL_GPL(pnfs_ld_read_done); | 1331 | EXPORT_SYMBOL_GPL(pnfs_ld_read_done); |
@@ -1530,8 +1529,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync) | |||
1530 | end_pos = nfsi->layout->plh_lwb; | 1529 | end_pos = nfsi->layout->plh_lwb; |
1531 | nfsi->layout->plh_lwb = 0; | 1530 | nfsi->layout->plh_lwb = 0; |
1532 | 1531 | ||
1533 | memcpy(&data->args.stateid.data, nfsi->layout->plh_stateid.data, | 1532 | nfs4_stateid_copy(&data->args.stateid, &nfsi->layout->plh_stateid); |
1534 | sizeof(nfsi->layout->plh_stateid.data)); | ||
1535 | spin_unlock(&inode->i_lock); | 1533 | spin_unlock(&inode->i_lock); |
1536 | 1534 | ||
1537 | data->args.inode = inode; | 1535 | data->args.inode = inode; |