void np_fid_decref(Npfid *fid) { if (!fid) return; fid->refcount--; if (!fid->refcount) np_fid_destroy(fid); }
void np_fid_decref(Npfid *fid) { int n; if (!fid) return; pthread_mutex_lock(&fid->lock); n = --fid->refcount; pthread_mutex_unlock(&fid->lock); if (!n) np_fid_destroy(fid); }
/* Look up operation's fid and assign it to req->fid. * This is done before the request is handed off to a worker, with * the plan of using fid data in scheduling work. * The fid refcount is incremented here, then decremented in np_respond (). */ static void np_preprocess_request(Npreq *req) { Npfcall *tc = req->tcall; Npconn *conn = req->conn; switch (tc->type) { case P9_TSTATFS: req->fid = np_fid_find (conn, tc->u.tstatfs.fid); break; case P9_TLOPEN: req->fid = np_fid_find (conn, tc->u.tlopen.fid); break; case P9_TLCREATE: req->fid = np_fid_find (conn, tc->u.tlcreate.fid); break; case P9_TSYMLINK: req->fid = np_fid_find (conn, tc->u.tsymlink.fid); break; case P9_TMKNOD: req->fid = np_fid_find (conn, tc->u.tmknod.fid); break; case P9_TRENAME: req->fid = np_fid_find (conn, tc->u.trename.fid); break; case P9_TREADLINK: req->fid = np_fid_find (conn, tc->u.treadlink.fid); break; case P9_TGETATTR: req->fid = np_fid_find (conn, tc->u.tgetattr.fid); break; case P9_TSETATTR: req->fid = np_fid_find (conn, tc->u.tsetattr.fid); break; case P9_TXATTRWALK: req->fid = np_fid_find (conn, tc->u.txattrwalk.fid); break; case P9_TXATTRCREATE: req->fid = np_fid_find (conn, tc->u.txattrcreate.fid); break; case P9_TREADDIR: req->fid = np_fid_find (conn, tc->u.treaddir.fid); break; case P9_TFSYNC: req->fid = np_fid_find (conn, tc->u.tfsync.fid); break; case P9_TLOCK: req->fid = np_fid_find (conn, tc->u.tlock.fid); break; case P9_TGETLOCK: req->fid = np_fid_find (conn, tc->u.tgetlock.fid); break; case P9_TLINK: req->fid = np_fid_find (conn, tc->u.tlink.dfid); break; case P9_TMKDIR: req->fid = np_fid_find (conn, tc->u.tmkdir.fid); break; case P9_TVERSION: break; case P9_TAUTH: if (np_fid_find (conn, tc->u.tauth.afid)) break; req->fid = np_fid_create (conn, tc->u.tauth.afid, NULL); if (!req->fid) break; req->fid->aname = np_strdup (&tc->u.tauth.aname); if (!req->fid->aname) { np_fid_destroy(req->fid); req->fid = NULL; } /* XXX leave fid->tpool NULL for now as auth * can be handled in the default thread pool * without risk of deadlock. */ break; case P9_TATTACH: if (np_fid_find (conn, tc->u.tattach.fid)) break; req->fid = np_fid_create (conn, tc->u.tattach.fid,NULL); if (!req->fid) break; req->fid->aname = np_strdup (&tc->u.tattach.aname); if (!req->fid->aname) { np_fid_destroy(req->fid); req->fid = NULL; } np_tpool_select (req); break; case P9_TFLUSH: break; case P9_TWALK: req->fid = np_fid_find (conn, tc->u.twalk.fid); break; case P9_TREAD: req->fid = np_fid_find (conn, tc->u.tread.fid); break; case P9_TWRITE: req->fid = np_fid_find (conn, tc->u.twrite.fid); break; case P9_TCLUNK: req->fid = np_fid_find (conn, tc->u.tclunk.fid); break; case P9_TREMOVE: req->fid = np_fid_find (conn, tc->u.tremove.fid); break; default: break; } if (req->fid) np_fid_incref (req->fid); }