diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 769981c17323a5b35a6d6cc4791350bc38b9488b..eb552ca6102a82c6ed66f7374f793b9d984b1a4b 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -170,6 +170,15 @@ Bugzilla : 13532 Description: rewrite ext2-derived code in llite/dir.c and obdclass/uuid.c Details : rewrite inherited code (uuid parsing code from ext2 utils and readdir code from ext3) from scratch preserving functionality. + +Severity : normal +Bugzilla : 13436 +Description: Only those disconnect error should be returned by rq_status. +Details : In open/enqueue processs, Some errors, which will cause client + disconnected, should be returned by rq_status, while other + errors should still be returned by intent, then mdc or llite will + detect them. + -------------------------------------------------------------------------------- 2007-08-27 Cluster File Systems, Inc. <info@clusterfs.com> diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index e7a1fc64d4b18e1edc011ebb010a2bece64c732d..4b235027821ac26c02e306c95512cf545ff7f8b5 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -2333,6 +2333,9 @@ void intent_set_disposition(struct ldlm_reply *rep, int flag) rep->lock_policy_res1 |= flag; } +#define IS_CLIENT_DISCONNECT_ERROR(error) \ + (error == -ENOTCONN || error == -ENODEV) + static int mds_intent_policy(struct ldlm_namespace *ns, struct ldlm_lock **lockp, void *req_cookie, ldlm_mode_t mode, int flags, void *data) @@ -2407,10 +2410,18 @@ static int mds_intent_policy(struct ldlm_namespace *ns, /* If there was an error of some sort or if we are not * returning any locks */ - if (rep->lock_policy_res2) - RETURN(rep->lock_policy_res2); - if (!intent_disposition(rep, DISP_OPEN_LOCK)) - RETURN(ELDLM_LOCK_ABORTED); + if (rep->lock_policy_res2 || + !intent_disposition(rep, DISP_OPEN_LOCK)) { + /* If it is the disconnect error (ENODEV & ENOCONN) + * ptlrpc layer should know this imediately, it should + * be replied by rq_stats, otherwise, return it by + * intent here + */ + if (IS_CLIENT_DISCONNECT_ERROR(rep->lock_policy_res2)) + RETURN(rep->lock_policy_res2); + else + RETURN(ELDLM_LOCK_ABORTED); + } break; case IT_LOOKUP: getattr_part = MDS_INODELOCK_LOOKUP;