[devel] BUG: uw-imap locking does not work on reiserfs

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Сб Окт 12 18:23:23 MSD 2002


Внимание, грабли!

В uw-imap (по крайней мере, в версии uw-imap-2001a-alt6) не работает
блокировка почтовых ящиков, если они находятся на файловой системе
reiserfs (проверено с ядром 2.4.18-up-alt8). На ext2, ext3 блокировка
работает. На других файловых системах тоже могут быть проблемы - не
проверял.

Ошибка может приводить к порче почтовых ящиков и потере сообщений.

Причина, похоже, в следующем куске кода (src/osdep/unix/nfstnew.c):

/* Test for NFS
 * Accepts: file descriptor
 * Returns: T if NFS file, NIL otherwise
 */

long test_nfs (int fd)
{
  struct stat sbuf;
  struct ustat usbuf;
  struct statvfs vsbuf;
  /* Any base type that begins with "nfs" or "afs" is considered to be a
   * network filesystem.
   */
  return ((!fstat (fd,&sbuf) && !ustat (sbuf.st_dev,&usbuf) &&
	   !++usbuf.f_tinode) ||
	  (!fstatvfs (fd,&vsbuf) && (vsbuf.f_basetype[1] == 'f') &&
	   (vsbuf.f_basetype[2] == 's') &&
	   ((vsbuf.f_basetype[0] == 'n') || (vsbuf.f_basetype[0] == 'a')))) ?
	     LONGT : NIL;
}

На reiserfs функция ustat возвращает f_tinode == -1, в результате чего
uw-imap считает, что работает с NFS, и прекращает использовать
блокировки через fcntl (остается только dotlock, но этот метод не
работает с системными ящиками в /var/spool/mail).

-- 
Sergey Vlasov



Подробная информация о списке рассылки Devel