In mdt_mfd_open if the mo_open() call failed or we could not allocate
mfd, we also need to undo write/exec reference count in order to
not mess up with subsequent exec/write accesses.
Signed-off-by: Prakash Surya <surya1@llnl.gov>
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Change-Id: I3bd98bd68368b48f2afaa7bb450d3a9947c992ac
Reviewed-on: http://review.whamcloud.com/2300
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
rc = mo_open(info->mti_env, mdt_object_child(o),
created ? flags | MDS_OPEN_CREATED : flags);
if (rc)
- RETURN(rc);
+ GOTO(err_out, rc);
mfd = mdt_mfd_new();
if (mfd != NULL) {
}
mdt_empty_transno(info, rc);
- } else
- rc = -ENOMEM;
+ } else {
+ GOTO(err_out, rc = -ENOMEM);
+ }
RETURN(rc);
-}
+err_out:
+ if (flags & FMODE_WRITE)
+ /* XXX We also need to close io epoch here.
+ * See LU-1220 - green */
+ mdt_write_put(o);
+ else if (flags & FMODE_EXEC)
+ mdt_write_allow(o);
+ return rc;
+}
int mdt_finish_open(struct mdt_thread_info *info,
struct mdt_object *p, struct mdt_object *o,