• Andrew Morton's avatar
    [PATCH] `event' removal: core kernel · 4ccf7a32
    Andrew Morton authored
    Patch from Manfred Spraul
    
    f_version and i_version are used by filesystems to check if it can
    reuse the f_pos position across readdir calls without validation.
    
    Right now f_version and i_version are modified by
        f_version = ++event;
        i_version = ++event;
        if (f_version != i_version) goto revalidate
    and event is a global, exported variable.
    
    But that's not needed,
        f_version  = 0;
        i_version++;
        if (f_version != i_version) goto revalidate
    works too, without the ugly 'event' variable.
    
    I got an ok from viro, and I had notified the fs maintainers, no
    complaints either
    
    - block_dev.c, block_llseek updates f_version to '++event'.
       grep showed that no device driver uses f_version, this is dead
       code copied from the default llseek implementation.
    
    - the llseek implementations and get_empty_flip set f_version
       to '++event'
       This is not dead code, but
                filp->f_version = 0
       achieves the same effect:
       f_version is used by the readdir() implementation of several
       filesystems to skip the revalidation of f_pos at the beginning
       of a readdir call: If llseek was not called and the filesystem
       did not change since the last readdir call, then the value in
       f_pos can be trusted.
       The implementation (for example in ext2) is
         inode->i_version = ++event;
       in all operations that change a directory
       At the beginning of file_operation->readdir():
         if(inode->i_version != flip->f_version)
                    revalidate();
         filp->f_version = inode->i_version;
       There are other users of f_version, but none of them use the
       default llseek implementation (e.g. fs/pipe.c)
    4ccf7a32
read_write.c 14.6 KB