]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.0.1/pnfs-save-layoutcommit-cred-at-layout-header-init.patch
5.1-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.0.1 / pnfs-save-layoutcommit-cred-at-layout-header-init.patch
CommitLineData
7cb15094
GKH
1From 9fa4075878a5faac872a63f4a97ce79c776264e9 Mon Sep 17 00:00:00 2001
2From: Peng Tao <bergwolf@gmail.com>
3Date: Sat, 30 Jul 2011 20:52:32 -0400
4Subject: pnfs: save layoutcommit cred at layout header init
5
6From: Peng Tao <bergwolf@gmail.com>
7
8commit 9fa4075878a5faac872a63f4a97ce79c776264e9 upstream.
9
10No need to save it for every lseg.
11No need to save it at every pnfs_set_layoutcommit.
12
13[Needed in v3.0]
14Signed-off-by: Peng Tao <peng_tao@emc.com>
15Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
16Signed-off-by: Jim Rees <rees@umich.edu>
17Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
18Signed-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