# Copyright (C) 2010-2014 Junjiro R. Okajima Dynamically customizable FS operations ---------------------------------------------------------------------- Generally FS operations (struct inode_operations, struct address_space_operations, struct file_operations, etc.) are defined as "static const", but it never means that FS have only one set of operation. Some FS have multiple sets of them. For instance, ext2 has three sets, one for XIP, for NOBH, and for normal. Since aufs overrides and redirects these operations, sometimes aufs has to change its behaviour according to the branch FS type. More imporantly VFS acts differently if a function (member in the struct) is set or not. It means aufs should have several sets of operations and select one among them according to the branch FS definition. In order to solve this problem and not to affect the behavour of VFS, aufs defines these operations dynamically. For instance, aufs defines aio_read function for struct file_operations, but it may not be set to the file_operations. When the branch FS doesn't have it, aufs doesn't set it to its file_operations while the function definition itself is still alive. So the behaviour of io_submit(2) will not change, and it will return an error when aio_read is not defined. The lifetime of these dynamically generated operation object is maintained by aufs branch object. When the branch is removed from aufs, the reference counter of the object is decremented. When it reaches zero, the dynamically generated operation object will be freed. This approach is designed to support AIO (io_submit), Direcit I/O and XIP mainly. Currently this approach is applied to file_operations and vm_operations_struct for regular files only.