CacheFiles: Handle ENOSPC on create/mkdir better
David Howells
maintainerPATCH 1/1 CacheFiles: Handle ENOSPC on create/mkdir better
Handle ENOSPC on create/mkdir calls to the backing filesystem better. Rather than returning it to FS-Cache or FS-Cache returning it to the netfs, it is converted into ENOBUFS.
This can be reproduced by setting up a very small cache, for example with:
dd if=/dev/zero of=/root/fakedisc bs=10240 count=1024 mke2fs -j /root/fakedisc
tune2fs -o user_xattr /root/fakedisc
mount -o loop /root/fakedisc /var/fscache/ cachefilesd
And then running a "find" over a few thousand NFS files on an NFS share that's mounted with "-o fsc". This will eventually run the cache out of free inodes, and ENOSPC will be returned by Ext3, yielding a lot of these messages in the kernel log:
FS-Cache: error from cache: -28
David
---
fs/cachefiles/cf-namei.c | 7 ++++++- fs/fscache/cookie.c | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-)
fs/cachefiles/cf-namei.c +6 -1
@@ -501,11 +501,13 @@ lookup_again:return 0 ; create_error: +_debug ("create error %d" , ret);if (ret == -EIO )cachefiles_io_error (cache,"create/mkdir failed" ); goto error; check_error: +_debug ("check error %d" , ret);write_lock (&cache->active_lock);rb_erase (&object->active_node, &cache->active_nodes);write_unlock (&cache->active_lock);
@@ -538,7 +540,10 @@ error_out: current->fsuid = fsuid; current->fsgid = fsgid; -_leave (" = ret" ); +if (ret == -ENOSPC ) + ret = -ENOBUFS ; + +_leave (" = error %d" , -ret);return ret; }
fs/fscache/cookie.c +4 -1
@@ -750,7 +750,10 @@ no_cache: ret = -ENOMEDIUM ; goto error_cleanup; error: -printk (KERN_ERR "FS-Cache: error from cache: %d\n" , ret); +if (ret != -ENOBUFS ) { +printk (KERN_ERR "FS-Cache: error from cache: %d\n" , ret); + ret = -ENOBUFS ; + } error_cleanup:if (cookie) {up_write (&cookie->sem);
David Howells
maintainerQuoted 3 lines · David Howells
Handle ENOSPC on create/mkdir calls to the backing filesystem better. Rather than returning it to FS-Cache or FS-Cache returning it to the netfs, it is converted into ENOBUFS.
of course.