-
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