|
@@ -1428,6 +1428,7 @@ int p9_client_clunk(struct p9_fid *fid)
|
|
|
int err;
|
|
|
struct p9_client *clnt;
|
|
|
struct p9_req_t *req;
|
|
|
+ int retries = 0;
|
|
|
|
|
|
if (!fid) {
|
|
|
pr_warn("%s (%d): Trying to clunk with NULL fid\n",
|
|
@@ -1436,7 +1437,9 @@ int p9_client_clunk(struct p9_fid *fid)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- p9_debug(P9_DEBUG_9P, ">>> TCLUNK fid %d\n", fid->fid);
|
|
|
+again:
|
|
|
+ p9_debug(P9_DEBUG_9P, ">>> TCLUNK fid %d (try %d)\n", fid->fid,
|
|
|
+ retries);
|
|
|
err = 0;
|
|
|
clnt = fid->clnt;
|
|
|
|
|
@@ -1452,8 +1455,14 @@ int p9_client_clunk(struct p9_fid *fid)
|
|
|
error:
|
|
|
/*
|
|
|
* Fid is not valid even after a failed clunk
|
|
|
+ * If interrupted, retry once then give up and
|
|
|
+ * leak fid until umount.
|
|
|
*/
|
|
|
- p9_fid_destroy(fid);
|
|
|
+ if (err == -ERESTARTSYS) {
|
|
|
+ if (retries++ == 0)
|
|
|
+ goto again;
|
|
|
+ } else
|
|
|
+ p9_fid_destroy(fid);
|
|
|
return err;
|
|
|
}
|
|
|
EXPORT_SYMBOL(p9_client_clunk);
|
|
@@ -1478,7 +1487,10 @@ int p9_client_remove(struct p9_fid *fid)
|
|
|
|
|
|
p9_free_req(clnt, req);
|
|
|
error:
|
|
|
- p9_fid_destroy(fid);
|
|
|
+ if (err == -ERESTARTSYS)
|
|
|
+ p9_client_clunk(fid);
|
|
|
+ else
|
|
|
+ p9_fid_destroy(fid);
|
|
|
return err;
|
|
|
}
|
|
|
EXPORT_SYMBOL(p9_client_remove);
|