]>
Commit | Line | Data |
---|---|---|
7cb15094 GKH |
1 | From 9fa4075878a5faac872a63f4a97ce79c776264e9 Mon Sep 17 00:00:00 2001 |
2 | From: Peng Tao <bergwolf@gmail.com> | |
3 | Date: Sat, 30 Jul 2011 20:52:32 -0400 | |
4 | Subject: pnfs: save layoutcommit cred at layout header init | |
5 | ||
6 | From: Peng Tao <bergwolf@gmail.com> | |
7 | ||
8 | commit 9fa4075878a5faac872a63f4a97ce79c776264e9 upstream. | |
9 | ||
10 | No need to save it for every lseg. | |
11 | No need to save it at every pnfs_set_layoutcommit. | |
12 | ||
13 | [Needed in v3.0] | |
14 | Signed-off-by: Peng Tao <peng_tao@emc.com> | |
15 | Signed-off-by: Boaz Harrosh <bharrosh@panasas.com> | |
16 | Signed-off-by: Jim Rees <rees@umich.edu> | |
17 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | |
18 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | |
19 | ||
20 | --- | |
21 | fs/nfs/pnfs.c | 21 +++++++++++---------- | |
22 | fs/nfs/pnfs.h | 2 +- | |
23 | 2 files changed, 12 insertions(+), 11 deletions(-) | |
24 | ||
25 | --- a/fs/nfs/pnfs.c | |
26 | +++ b/fs/nfs/pnfs.c | |
27 | @@ -189,6 +189,7 @@ static void | |
28 | pnfs_free_layout_hdr(struct pnfs_layout_hdr *lo) | |
29 | { | |
30 | struct pnfs_layoutdriver_type *ld = NFS_SERVER(lo->plh_inode)->pnfs_curr_ld; | |
31 | + put_rpccred(lo->plh_lc_cred); | |
32 | return ld->alloc_layout_hdr ? ld->free_layout_hdr(lo) : kfree(lo); | |
33 | } | |
34 | ||
35 | @@ -805,7 +806,9 @@ out: | |
36 | } | |
37 | ||
38 | static struct pnfs_layout_hdr * | |
39 | -alloc_init_layout_hdr(struct inode *ino, gfp_t gfp_flags) | |
40 | +alloc_init_layout_hdr(struct inode *ino, | |
41 | + struct nfs_open_context *ctx, | |
42 | + gfp_t gfp_flags) | |
43 | { | |
44 | struct pnfs_layout_hdr *lo; | |
45 | ||
46 | @@ -817,11 +820,14 @@ alloc_init_layout_hdr(struct inode *ino, | |
47 | INIT_LIST_HEAD(&lo->plh_segs); | |
48 | INIT_LIST_HEAD(&lo->plh_bulk_recall); | |
49 | lo->plh_inode = ino; | |
50 | + lo->plh_lc_cred = get_rpccred(ctx->state->owner->so_cred); | |
51 | return lo; | |
52 | } | |
53 | ||
54 | static struct pnfs_layout_hdr * | |
55 | -pnfs_find_alloc_layout(struct inode *ino, gfp_t gfp_flags) | |
56 | +pnfs_find_alloc_layout(struct inode *ino, | |
57 | + struct nfs_open_context *ctx, | |
58 | + gfp_t gfp_flags) | |
59 | { | |
60 | struct nfs_inode *nfsi = NFS_I(ino); | |
61 | struct pnfs_layout_hdr *new = NULL; | |
62 | @@ -836,7 +842,7 @@ pnfs_find_alloc_layout(struct inode *ino | |
63 | return nfsi->layout; | |
64 | } | |
65 | spin_unlock(&ino->i_lock); | |
66 | - new = alloc_init_layout_hdr(ino, gfp_flags); | |
67 | + new = alloc_init_layout_hdr(ino, ctx, gfp_flags); | |
68 | spin_lock(&ino->i_lock); | |
69 | ||
70 | if (likely(nfsi->layout == NULL)) /* Won the race? */ | |
71 | @@ -928,7 +934,7 @@ pnfs_update_layout(struct inode *ino, | |
72 | if (!pnfs_enabled_sb(NFS_SERVER(ino))) | |
73 | return NULL; | |
74 | spin_lock(&ino->i_lock); | |
75 | - lo = pnfs_find_alloc_layout(ino, gfp_flags); | |
76 | + lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); | |
77 | if (lo == NULL) { | |
78 | dprintk("%s ERROR: can't get pnfs_layout_hdr\n", __func__); | |
79 | goto out_unlock; | |
80 | @@ -1218,8 +1224,6 @@ pnfs_set_layoutcommit(struct nfs_write_d | |
81 | if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) { | |
82 | /* references matched in nfs4_layoutcommit_release */ | |
83 | get_lseg(wdata->lseg); | |
84 | - wdata->lseg->pls_lc_cred = | |
85 | - get_rpccred(wdata->args.context->state->owner->so_cred); | |
86 | mark_as_dirty = true; | |
87 | dprintk("%s: Set layoutcommit for inode %lu ", | |
88 | __func__, wdata->inode->i_ino); | |
89 | @@ -1251,7 +1255,6 @@ pnfs_layoutcommit_inode(struct inode *in | |
90 | struct nfs4_layoutcommit_data *data; | |
91 | struct nfs_inode *nfsi = NFS_I(inode); | |
92 | struct pnfs_layout_segment *lseg; | |
93 | - struct rpc_cred *cred; | |
94 | loff_t end_pos; | |
95 | int status = 0; | |
96 | ||
97 | @@ -1281,9 +1284,7 @@ pnfs_layoutcommit_inode(struct inode *in | |
98 | lseg = pnfs_list_write_lseg(inode); | |
99 | ||
100 | end_pos = nfsi->layout->plh_lwb; | |
101 | - cred = lseg->pls_lc_cred; | |
102 | nfsi->layout->plh_lwb = 0; | |
103 | - lseg->pls_lc_cred = NULL; | |
104 | ||
105 | memcpy(&data->args.stateid.data, nfsi->layout->plh_stateid.data, | |
106 | sizeof(nfsi->layout->plh_stateid.data)); | |
107 | @@ -1291,7 +1292,7 @@ pnfs_layoutcommit_inode(struct inode *in | |
108 | ||
109 | data->args.inode = inode; | |
110 | data->lseg = lseg; | |
111 | - data->cred = cred; | |
112 | + data->cred = get_rpccred(nfsi->layout->plh_lc_cred); | |
113 | nfs_fattr_init(&data->fattr); | |
114 | data->args.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask; | |
115 | data->res.fattr = &data->fattr; | |
116 | --- a/fs/nfs/pnfs.h | |
117 | +++ b/fs/nfs/pnfs.h | |
118 | @@ -44,7 +44,6 @@ struct pnfs_layout_segment { | |
119 | atomic_t pls_refcount; | |
120 | unsigned long pls_flags; | |
121 | struct pnfs_layout_hdr *pls_layout; | |
122 | - struct rpc_cred *pls_lc_cred; /* LAYOUTCOMMIT credential */ | |
123 | }; | |
124 | ||
125 | enum pnfs_try_status { | |
126 | @@ -124,6 +123,7 @@ struct pnfs_layout_hdr { | |
127 | u32 plh_barrier; /* ignore lower seqids */ | |
128 | unsigned long plh_flags; | |
129 | loff_t plh_lwb; /* last write byte for layoutcommit */ | |
130 | + struct rpc_cred *plh_lc_cred; /* layoutcommit cred */ | |
131 | struct inode *plh_inode; | |
132 | }; | |
133 |