Package: vim Version: 1:7.1-056+2 Severity: normal When using vim to edit files on a remote FS (in this case sshfs, but I imagine this happens with others too), vim starts throwing errors saying "E297: Write error in swap file" if the connection to the remote dies and then comes back up again. I'm guessing that vim is keeping the filehandle for the swapfile open, and this filehandle becomes invalid when the connection dies.
Steps to reproduce: mkdir tmp sshfs -o reconnect localhost:/tmp tmp vim tmp/foo Type some stuff in, save it, then keep it open. In another window, kill the ssh process that's been spawned by sshfs, then go back to vim. Start pressing u/^R to undo/redo, and you should start to see the aforemetioned error. The above example is a bit contrived, I actually noticed the problem when using software suspend, which makes the ssh processes die. According to strace, the error returned from the write(2) call is EIO. Perhaps instead of just throwing an error, vim should attempt to re-open the swap file and THEN throw an error if that fails as well. select(8, [0 5 7], NULL, [0 5], NULLselect(4, [3], [], [], NULL) = 1 (in [0]) read(0, "u", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) _llseek(8, 0, [0], SEEK_SET) = 0 write(8, "b0VIM 7.1\0\0\0\0\20\0\0\304\247\4G&\0\0\0\200)\0\0chr"..., 4096) = -1 EIO (Input/output error) select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) time(NULL) = 1191487479 time(NULL) = 1191487479 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[53;1H\r\n\33[?25l\33[1m\33[37m\33[41mE29"..., 156) = 156 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487479, 947304}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 208000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "\r", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\f\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\25\0\0\0v"..., 116) = 116 uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\10\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\7\0\0\0vi"..., 100) = 100 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[m\33[1;1H\33[2L\33[?25l\33[1;1Haoeu\r\na"..., 115) = 115 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487480, 740168}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 472000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "\22", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) _llseek(8, 0, [0], SEEK_SET) = 0 write(8, "b0VIM 7.1\0\0\0\0\20\0\0\304\247\4G&\0\0\0\200)\0\0chr"..., 4096) = -1 EIO (Input/output error) write(1, "\33[?25l\33[m\33[53;1H\33[1m\33[37m\33[41mE2"..., 60) = 60 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) time(NULL) = 1191487481 time(NULL) = 1191487481 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[m\r\r\n1 change; after #2 52 sec"..., 98) = 98 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487481, 267523}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 96000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "\r", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\f\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\27\0\0\0v"..., 116) = 116 uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\10\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\7\0\0\0vi"..., 100) = 100 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[m\33[1;1H\33[2L\33[?25l\33[1;1Haoeu\r\na"..., 129) = 129 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487482, 172142}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 320000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "\22", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) time(NULL) = 1191487482 time(NULL) = 1191487482 write(1, "\33[?25l\33[53;1H2 more lines; after"..., 51) = 51 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[4;51r\33[4;1H\33[2L\33[1;53r\33[53;1H\33"..., 86) = 86 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487482, 851962}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {2, 464000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "u", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) time(NULL) = 1191487484 time(NULL) = 1191487484 write(1, "\33[?25l\33[m\33[53;1H2 fewer lines; b"..., 56) = 56 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[3;51r\33[3;1H\33[2M\33[1;53r\33[3;1Hao"..., 436) = 436 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487484, 387571}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 640000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "u", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) _llseek(8, 0, [0], SEEK_SET) = 0 write(8, "b0VIM 7.1\0\0\0\0\20\0\0\304\247\4G&\0\0\0\200)\0\0chr"..., 4096) = -1 EIO (Input/output error) write(1, "\33[?25l\33[m\33[53;1H\33[1m\33[37m\33[41mE2"..., 60) = 60 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) time(NULL) = 1191487484 time(NULL) = 1191487484 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[m\r\r\n1 change; before #2 55 se"..., 99) = 99 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487484, 747662}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 336000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "\r", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\f\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\25\0\0\0v"..., 116) = 116 uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\10\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\7\0\0\0vi"..., 100) = 100 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[m\33[1;1H\33[2L\33[?25l\33[1;1Haoeu\r\na"..., 128) = 128 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487485, 412200}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {2, 896000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, ":", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[?25l\33[53;1H:", 14) = 14 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost -isig -icanon -echo ...}) = 0 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\33[34h\33[?25h", 11) = 11 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487486, 514793}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 808000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "q", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "q\33[?25l\r:q\33[34h\33[?25h", 21) = 21 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 gettimeofday({1191487486, 706526}, NULL) = 0 select(8, [0 5 7], NULL, [0 5], {4, 0}) = 1 (in [0], left {3, 624000}) select(8, [0 5 7], NULL, [0 5], NULL) = 1 (in [0]) read(0, "\r", 4096) = 1 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) write(1, "\r", 1) = 1 open(".", O_RDONLY|O_LARGEFILE) = 6 fchdir(6) = 0 chdir("tmp") = 0 getcwd("/home/chrisb/tmp", 1024) = 17 fchdir(6) = 0 close(6) = 0 select(8, [0 5 7], NULL, [0 5], {0, 0}) = 0 (Timeout) unlink("/tmp/v498049/dbext.sql") = -1 ENOENT (No such file or directory) open("/home/chrisb/.viminfo", O_RDONLY|O_LARGEFILE) = 6 stat64("/home/chrisb/.viminfo", {st_mode=S_IFREG|0600, st_size=24566, ...}) = 0 getuid32() = 1000 getuid32() = 1000 stat64("/home/chrisb/.viminfo.tmp", 0xbf82da6c) = -1 ENOENT (No such file or directory) umask(0) = 022 open("/home/chrisb/.viminfo.tmp", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE|O_NOFOLLOW, 0600) = 9 umask(022) = 0 fcntl64(9, F_GETFL) = 0x28001 (flags O_WRONLY|O_LARGEFILE|O_NOFOLLOW) fstat64(9, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f1d000 _llseek(9, 0, [0], SEEK_CUR) = 0 fchown32(9, 1000, 1000) = 0 fstat64(6, {st_mode=S_IFREG|0600, st_size=24566, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f1c000 read(6, "# This viminfo file was generate"..., 4096) = 4096 read(6, "PATH\'].\'/application/includes/re"..., 4096) = 4096 read(6, "/sites/deep.thought/devsites/cbu"..., 4096) = 4096 read(6, "cation/searches/suite/itq.search"..., 4096) = 4096 read(6, "uite/cas/bid.html\n-\' 316 26 ~"..., 4096) = 4096 open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 10 fstat64(10, {st_mode=S_IFREG|0644, st_size=25486, ...}) = 0 mmap2(NULL, 25486, PROT_READ, MAP_SHARED, 10, 0) = 0xb7f15000 close(10) = 0 futex(0xb7173a6c, FUTEX_WAKE, 2147483647) = 0 open("/usr/lib/gconv/ISO8859-1.so", O_RDONLY) = 10 read(10, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p\3\0\000"..., 512) = 512 fstat64(10, {st_mode=S_IFREG|0644, st_size=5384, ...}) = 0 mmap2(NULL, 8220, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 10, 0) = 0xb7f12000 mmap2(0xb7f13000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 10, 0) = 0xb7f13000 close(10) = 0 write(9, "# This viminfo file was generate"..., 4096) = 4096 write(9, "PATH\'].\'/application/includes/re"..., 4096) = 4096 write(9, "re/htdocs/suite/cas/edit.html\n-\'"..., 4096) = 4096 write(9, "nt/dt/home/export/sites/deep.tho"..., 4096) = 4096 read(6, "9\t26\n\t+\t282\t0\n\t+\t383\t0\n\t+\t315\t5\n"..., 4096) = 4086 write(9, "143\t0\n\t+\t146\t0\n\t+\t147\t0\n\t+\t167\t0"..., 4096) = 4096 read(6, "", 4096) = 0 write(9, "252\t0\n\t+\t163\t0\n\t+\t246\t0\n\t+\t252\t0"..., 2870) = 2870 close(9) = 0 munmap(0xb7f1d000, 4096) = 0 close(6) = 0 munmap(0xb7f1c000, 4096) = 0 stat64("/home/chrisb/.viminfo.tmp", {st_mode=S_IFREG|0600, st_size=23350, ...}) = 0 unlink("/home/chrisb/.viminfo") = 0 rename("/home/chrisb/.viminfo.tmp", "/home/chrisb/.viminfo") = 0 write(1, "\33[?25l", 6) = 6 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost -isig -icanon -echo ...}) = 0 ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost isig icanon echo ...}) = 0 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\n\0L\0\200\3\'\0\0\0\37\0\0\0\10\0\0\0\17\0\0\0c"..., 108) = 108 uname({sys="Linux", node="spawn", ...}) = 0 write(7, "\22\0\n\0L\0\200\3%\0\0\0\37\0\0\0\10\0\0\0\17\0\0\0ch"..., 108) = 108 write(1, "\33[53;1H\33[K\33[53;1H\33[?1l\33>", 24) = 24 write(1, "\33[34h\33[?25h\33[?1049l", 19) = 19 close(8) = -1 EIO (Input/output error) ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "E", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "7", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "2", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, ":", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, " ", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "C", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "l", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "o", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "s", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "e", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, " ", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "e", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "r", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "r", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "o", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "r", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, " ", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "o", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "n", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, " ", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "s", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "w", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "a", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "p", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, " ", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "f", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "i", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "l", 1) = 1 ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 write(2, "e", 1) = 1 write(1, "\33[?25l\33[J", 9) = 9 unlink("/home/chrisb/tmp/.vimtest.swp") = 0 open("/tmp/v498049/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 6 fstat64(6, {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0 fcntl64(6, F_SETFD, FD_CLOEXEC) = 0 getdents64(6, /* 2 entries */, 4096) = 48 getdents64(6, /* 0 entries */, 4096) = 0 close(6) = 0 rmdir("/tmp/v498049") = 0 exit_group(0) = ? ) = ? ERESTARTNOHAND (To be restarted) -- System Information: Debian Release: lenny/sid APT prefers testing APT policy: (900, 'testing'), (500, 'unstable'), (1, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.6.22-2-686 (SMP w/1 CPU core) Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to en_GB.UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages vim depends on: ii libc6 2.6.1-1+b1 GNU C Library: Shared libraries ii libgpmg1 1.19.6-25 General Purpose Mouse - shared lib ii libncurses5 5.6+20070825-1 Shared libraries for terminal hand ii vim-common 1:7.1-056+2 Vi IMproved - Common files ii vim-runtime 1:7.1-056+2 Vi IMproved - Runtime files vim recommends no packages. -- no debconf information -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]