[RFC] 2.4 truncate locking

From: William Lee Irwin III (wli@holomorphy.com)
Date: Wed Apr 17 2002 - 10:09:12 EST


I did some research on how truncate_inode_pages()'s locking works.
Please feel free to clarify and/or correct my notes on the subject,
which I'd like to turn into a docpatch soon.

Thanks to Al Viro, Rik van Riel, Arjan van de Ven, and Christoph Hellwig
for their help to clarify these rules.

Cheers,
Bill

(1) exclusion from freeing of the inode

        inode->i_count for holding a reference count to protect against
        prematurely freeing the inode.

(2) exclusion from simultaneous manipulation of the inode page lists

        pagecache_lock protects page->list and the inode list heads.

(3) exclusion from creation of memory mappings to the affected region

        inode->i_shared_lock and inode->i_mmap_lock serialize mmap
        operations, but are not held by truncate_inode_pages() and so
        proceed simultaneously. No pages are allocated by this operation
        to refer to the inode, as this is done lazily at fault-time.
        See (8) for fault-time exclusion.

(4) exclusion from writes to the affected region

        inode->i_sem

(5) exclusion from reads to the affected region

        reads beyond inode->i_size do not perform pagecache lookup
        pagecache_lock serializes pagecache access while truncation
        simultaneously proceeds

(6) exclusion from pageout of the affected region

        pagemap_lru_lock

(7) exclusion from multiple simultaneous truncate operations

        inode->i_sem

(8) exclusion from memory-mapped reads or writes of the affected region

        either

        (1) unmapping the pages from all processes referencing the pages
                to obtain unique references to them all by means of
                vmtruncate() / zap_page_range()
                        *or*
        (2) a unique reference to the inode itself (vma's mapping a file
                have ->vm_file which holds a reference to the inode)

(9) exclusion from simultaneous manipulation of page->mapping

        pagemap_lru_lock

(10) exclusion from simultaneous manipulation of pages by buffer cache

        PG_locked
                and
        unique reference to page by page->buffers == NULL
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Apr 23 2002 - 22:00:18 EST