[lustre-devel] [PATCH/RFC] lustre: changelog_cdev need to find obd on each access.
quentin.bouget at cea.fr
quentin.bouget at cea.fr
Wed Nov 7 02:05:34 PST 2018
Le 07/11/2018 à 02:09, NeilBrown a écrit :
> A changelog cdev can be held open indefinitely, and obd structures can
> come and go while it is open. So it isn't safe to choose and obd
> at open time, and continue to use it.
>
> Instead, we need to choose and obd on each access that needs it, and
> hold the chlg_registered_dev_lock mutex while using the obd. This
> prevents the obd from being freed.
`struct llog_ctxt' has a reference on that obd (and `struct llog_handle'
has a reference on a `struct llog_ctxt').
I don't think letting the obd go away is safe.
> @@ -193,11 +204,17 @@ static void enq_record_delete(struct chlg_rec_entry *rec)
> static int chlg_load(void *args)
> {
> struct chlg_reader_state *crs = args;
> - struct obd_device *obd = crs->crs_obd;
> + struct obd_device *obd;
> struct llog_ctxt *ctx = NULL;
> struct llog_handle *llh = NULL;
> int rc;
>
> + mutex_lock(&chlg_registered_dev_lock);
> + obd = chlg_obd_get(crs->crs_dev);
> + if (!obd) {
> + rc = -ENOENT;
> + goto err_out;
> + }
> ctx = llog_get_context(obd, LLOG_CHANGELOG_REPL_CTXT);
From there the obd is irrevocably referenced. I suspect it is used for
more than just its name.
Maybe trying to unmount the (wrong) mountpoint will fail after that, but
I am not confident.
Quentin
More information about the lustre-devel
mailing list