diff options
| author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2010-03-29 19:13:59 -0400 |
|---|---|---|
| committer | Eric Van Hensbergen <ericvh@gmail.com> | 2010-04-05 11:37:36 -0400 |
| commit | 6d96d3ab7aea5f0e75205a0c97f8d1fdf82c5287 (patch) | |
| tree | a4dfa0472e2e670de1da7e7c0905da12d4608ab4 /net | |
| parent | d994f4058d9f9be7e44529b55fc6be6552901ead (diff) | |
9p: Make sure we are able to clunk the cached fid on umount
dcache prune happen on umount. So we cannot mark the client
satus disconnect. That will prevent a 9p call to the server
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'net')
| -rw-r--r-- | net/9p/client.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index e3e5bf4469ce..a037a29f3f0e 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -533,7 +533,12 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...) | |||
| 533 | 533 | ||
| 534 | P9_DPRINTK(P9_DEBUG_MUX, "client %p op %d\n", c, type); | 534 | P9_DPRINTK(P9_DEBUG_MUX, "client %p op %d\n", c, type); |
| 535 | 535 | ||
| 536 | if (c->status != Connected) | 536 | /* we allow for any status other than disconnected */ |
| 537 | if (c->status == Disconnected) | ||
| 538 | return ERR_PTR(-EIO); | ||
| 539 | |||
| 540 | /* if status is begin_disconnected we allow only clunk request */ | ||
| 541 | if ((c->status == BeginDisconnect) && (type != P9_TCLUNK)) | ||
| 537 | return ERR_PTR(-EIO); | 542 | return ERR_PTR(-EIO); |
| 538 | 543 | ||
| 539 | if (signal_pending(current)) { | 544 | if (signal_pending(current)) { |
| @@ -799,8 +804,10 @@ void p9_client_destroy(struct p9_client *clnt) | |||
| 799 | 804 | ||
| 800 | v9fs_put_trans(clnt->trans_mod); | 805 | v9fs_put_trans(clnt->trans_mod); |
| 801 | 806 | ||
| 802 | list_for_each_entry_safe(fid, fidptr, &clnt->fidlist, flist) | 807 | list_for_each_entry_safe(fid, fidptr, &clnt->fidlist, flist) { |
| 808 | printk(KERN_INFO "Found fid %d not clunked\n", fid->fid); | ||
| 803 | p9_fid_destroy(fid); | 809 | p9_fid_destroy(fid); |
| 810 | } | ||
| 804 | 811 | ||
| 805 | if (clnt->fidpool) | 812 | if (clnt->fidpool) |
| 806 | p9_idpool_destroy(clnt->fidpool); | 813 | p9_idpool_destroy(clnt->fidpool); |
| @@ -818,6 +825,13 @@ void p9_client_disconnect(struct p9_client *clnt) | |||
| 818 | } | 825 | } |
| 819 | EXPORT_SYMBOL(p9_client_disconnect); | 826 | EXPORT_SYMBOL(p9_client_disconnect); |
| 820 | 827 | ||
| 828 | void p9_client_begin_disconnect(struct p9_client *clnt) | ||
| 829 | { | ||
| 830 | P9_DPRINTK(P9_DEBUG_9P, "clnt %p\n", clnt); | ||
| 831 | clnt->status = BeginDisconnect; | ||
| 832 | } | ||
| 833 | EXPORT_SYMBOL(p9_client_begin_disconnect); | ||
| 834 | |||
| 821 | struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, | 835 | struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, |
| 822 | char *uname, u32 n_uname, char *aname) | 836 | char *uname, u32 n_uname, char *aname) |
| 823 | { | 837 | { |
