From: adilger Date: Fri, 19 Aug 2005 08:13:51 +0000 (+0000) Subject: Branch b1_4 X-Git-Tag: v1_7_140~1^12~3^2~55^5~1 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=8f9849336da83416437dbf304144b1226428e279;p=fs%2Flustre-release.git Branch b1_4 Description: Racing open + rm can assert client in mdc_set_open_replay_data() Details : If lookup is in progress on a file that is unlinked we might try to revalidate the inode and fail in revalidate after lookup is complete and ll_file_open() enqueues the open again but it_open_error() was not checking DISP_OPEN_OPEN errors correctly. b=5479 b=6816 --- diff --git a/lustre/ChangeLog b/lustre/ChangeLog index f15e1c6..4586390 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -87,6 +87,15 @@ Description: chmod/chown may include an extra supplementary group Details : ll{,u}_mdc_pack_op_data() does not properly initialize the supplementary group and if none is specified this is used. +Severity : minor +Bugzilla : 5479 (6816) +Frequency : rare +Description: Racing open + rm can assert client in mdc_set_open_replay_data() +Details : If lookup is in progress on a file that is unlinked we might try + to revalidate the inode and fail in revalidate after lookup is + complete and ll_file_open() enqueues the open again but + it_open_error() was not checking DISP_OPEN_OPEN errors correctly. + 2005-08-08 Cluster File Systems, Inc. * version 1.4.4 * bug fixes diff --git a/lustre/mdc/mdc_locks.c b/lustre/mdc/mdc_locks.c index e1475d0..ead4b89 100644 --- a/lustre/mdc/mdc_locks.c +++ b/lustre/mdc/mdc_locks.c @@ -69,28 +69,28 @@ static int it_to_lock_mode(struct lookup_intent *it) int it_open_error(int phase, struct lookup_intent *it) { if (it_disposition(it, DISP_OPEN_OPEN)) { - if (phase == DISP_OPEN_OPEN) + if (phase >= DISP_OPEN_OPEN) return it->d.lustre.it_status; else return 0; } if (it_disposition(it, DISP_OPEN_CREATE)) { - if (phase == DISP_OPEN_CREATE) + if (phase >= DISP_OPEN_CREATE) return it->d.lustre.it_status; else return 0; } if (it_disposition(it, DISP_LOOKUP_EXECD)) { - if (phase == DISP_LOOKUP_EXECD) + if (phase >= DISP_LOOKUP_EXECD) return it->d.lustre.it_status; else return 0; } if (it_disposition(it, DISP_IT_EXECD)) { - if (phase == DISP_IT_EXECD) + if (phase >= DISP_IT_EXECD) return it->d.lustre.it_status; else return 0;