[Devel] unlock range

Alexander Morozov amorozov на etersoft.ru
Ср Сен 28 13:47:09 MSD 2011


> > Оказывается, wineserver может снимать и много блокировок за раз:
> > /* remove all locks on a given fd */
> > static void remove_fd_locks( struct fd *fd )
> > {
> >    file_pos_t start = FILE_POS_T_MAX, end = 0;
> >    struct list *ptr;
> > 
> >    while ((ptr = list_head( &fd->locks )))
> >    {
> >        struct file_lock *lock = LIST_ENTRY( ptr, struct file_lock,
> > fd_entry );
> >        if (lock->start < start) start = lock->start;
> >        if (!lock->end || lock->end > end) end = lock->end - 1;
> >        remove_lock( lock, 0 );
> >    }
> >    if (start < end) remove_unix_locks( fd, start, end + 1 );
> > }
> 
> Я так понимаю, что текущий код блокировок из ntdll не делает подобного
> и оставляет файловой системе возможность снять их самостоятельно?

Да, не делает. И это баг, во всяком случае, для NFS. Надо исправить.

Кстати, приведённую выше функцию, я уже поменял, чтобы разблокировались в 
точности те блокировки, которые были установлены.


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