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/9p | |
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/9p')
-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 | { |