From 11c63d251e4d121bab0e97ccd69e9fd6d5ba38e4 Mon Sep 17 00:00:00 2001 From: Oleg Drokin Date: Wed, 14 Mar 2012 20:56:02 -0400 Subject: [PATCH] LU-1206: mdt: Fix error handling in mdt_mfd_open 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 Signed-off-by: Oleg Drokin Change-Id: I3bd98bd68368b48f2afaa7bb450d3a9947c992ac Reviewed-on: http://review.whamcloud.com/2300 Reviewed-by: Andreas Dilger Tested-by: Hudson Tested-by: Maloo --- lustre/mdt/mdt_open.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 3cfe6bf..47628a1 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -680,7 +680,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, struct mdt_object *p, 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) { @@ -749,12 +749,21 @@ static int mdt_mfd_open(struct mdt_thread_info *info, struct mdt_object *p, } 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, -- 1.8.3.1