Whamcloud - gitweb
Branch b1_4
authoradilger <adilger>
Fri, 19 Aug 2005 08:13:51 +0000 (08:13 +0000)
committeradilger <adilger>
Fri, 19 Aug 2005 08:13:51 +0000 (08:13 +0000)
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

lustre/ChangeLog
lustre/mdc/mdc_locks.c

index f15e1c6..4586390 100644 (file)
@@ -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. <info@clusterfs.com>
        * version 1.4.4
        * bug fixes
index e1475d0..ead4b89 100644 (file)
@@ -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;