diff options
| -rw-r--r-- | fs/nfs/direct.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 0c542ec92d5b..00eee87510fe 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -168,7 +168,7 @@ static inline struct nfs_direct_req *nfs_direct_req_alloc(void) | |||
| 168 | return dreq; | 168 | return dreq; |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | static void nfs_direct_req_release(struct kref *kref) | 171 | static void nfs_direct_req_free(struct kref *kref) |
| 172 | { | 172 | { |
| 173 | struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref); | 173 | struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref); |
| 174 | 174 | ||
| @@ -177,6 +177,11 @@ static void nfs_direct_req_release(struct kref *kref) | |||
| 177 | kmem_cache_free(nfs_direct_cachep, dreq); | 177 | kmem_cache_free(nfs_direct_cachep, dreq); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static void nfs_direct_req_release(struct nfs_direct_req *dreq) | ||
| 181 | { | ||
| 182 | kref_put(&dreq->kref, nfs_direct_req_free); | ||
| 183 | } | ||
| 184 | |||
| 180 | /* | 185 | /* |
| 181 | * Collects and returns the final error value/byte-count. | 186 | * Collects and returns the final error value/byte-count. |
| 182 | */ | 187 | */ |
| @@ -196,7 +201,6 @@ static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq) | |||
| 196 | result = dreq->count; | 201 | result = dreq->count; |
| 197 | 202 | ||
| 198 | out: | 203 | out: |
| 199 | kref_put(&dreq->kref, nfs_direct_req_release); | ||
| 200 | return (ssize_t) result; | 204 | return (ssize_t) result; |
| 201 | } | 205 | } |
| 202 | 206 | ||
| @@ -214,7 +218,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) | |||
| 214 | } | 218 | } |
| 215 | complete_all(&dreq->completion); | 219 | complete_all(&dreq->completion); |
| 216 | 220 | ||
| 217 | kref_put(&dreq->kref, nfs_direct_req_release); | 221 | nfs_direct_req_release(dreq); |
| 218 | } | 222 | } |
| 219 | 223 | ||
| 220 | /* | 224 | /* |
| @@ -369,6 +373,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size | |||
| 369 | if (!result) | 373 | if (!result) |
| 370 | result = nfs_direct_wait(dreq); | 374 | result = nfs_direct_wait(dreq); |
| 371 | rpc_clnt_sigunmask(clnt, &oldset); | 375 | rpc_clnt_sigunmask(clnt, &oldset); |
| 376 | nfs_direct_req_release(dreq); | ||
| 372 | 377 | ||
| 373 | return result; | 378 | return result; |
| 374 | } | 379 | } |
| @@ -716,6 +721,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz | |||
| 716 | if (!result) | 721 | if (!result) |
| 717 | result = nfs_direct_wait(dreq); | 722 | result = nfs_direct_wait(dreq); |
| 718 | rpc_clnt_sigunmask(clnt, &oldset); | 723 | rpc_clnt_sigunmask(clnt, &oldset); |
| 724 | nfs_direct_req_release(dreq); | ||
| 719 | 725 | ||
| 720 | return result; | 726 | return result; |
| 721 | } | 727 | } |
