]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/autofs4/waitq.c
autofs4: check kernel communication pipe is valid for write
[linux-2.6-omap-h63xx.git] / fs / autofs4 / waitq.c
index 1132cc2a0310971bad56dc610f15625a4a61b056..dd2914d7ad7f858f73fd44cf34d2d32354c38556 100644 (file)
@@ -99,6 +99,7 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi,
                union autofs_packet_union v4_pkt;
                union autofs_v5_packet_union v5_pkt;
        } pkt;
+       struct file *pipe = NULL;
        size_t pktsz;
 
        DPRINTK("wait id = 0x%08lx, name = %.*s, type=%d",
@@ -164,8 +165,19 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi,
                return;
        }
 
-       if (autofs4_write(sbi->pipe, &pkt, pktsz))
-               autofs4_catatonic_mode(sbi);
+       /* Check if we have become catatonic */
+       mutex_lock(&sbi->wq_mutex);
+       if (!sbi->catatonic) {
+               pipe = sbi->pipe;
+               get_file(pipe);
+       }
+       mutex_unlock(&sbi->wq_mutex);
+
+       if (pipe) {
+               if (autofs4_write(pipe, &pkt, pktsz))
+                       autofs4_catatonic_mode(sbi);
+               fput(pipe);
+       }
 }
 
 static int autofs4_getpath(struct autofs_sb_info *sbi,