Hi When a PUFFS filesystem enforces quota, a process doing a write over quota will end frozen in DE+ state.
The problem is that we have written data in the page cache that is supposed to go to disk. The code path is a bit complicated, but basically we go in genfs VOP_PUTPAGE, which leads to genfs_do_io() where we have a VOP_STRATEGY, which cause PUFFS write. The PUFFS write will get EDQUOT, but genfs_do_io() ignores VOP_STRATEGY's return value and retries forever. In other words, when flushing the cache, the kernel ignores errors from the filesystem and runs an endless loop attempting to flush data, during which the process that did the over quota write is not allowed to complete exit(). What is the proper way to deal with that? Is it reasonable to wipe the page cache using puffs_inval_pagecache_node() when write gets a failure? Any failure? Or just EDQUOT and ENOSPC? Should that happen in libpuffs or in the filesystem (libperfuse here)? -- Emmanuel Dreyfus http://hcpnet.free.fr/pubz [email protected]
