From: NeilBrown <[email protected]>
[[This fixup for f242581e611e in vfs/vfs-7.1.directory provides a new commit description has preserves the error returns and log message, and importantly calls cachefiles_io_error() in exactly the same circumstances as the original - thanks]] Rather then using lock_rename() and lookup_one() etc we can use the new start_renaming_dentry(). This is part of centralising dir locking and lookup so that locking rules can be changed. Some error conditions are checked in start_renaming_dentry() but need to be re-checked when an error is reported to ensure correct handling. The check that ->graveyard is still d_can_lookup() is dropped as this was checked when ->graveyard was assigned, and it cannot be changed. Signed-off-by: NeilBrown <[email protected]> Link: https://patch.msgid.link/[email protected] --- fs/cachefiles/namei.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c index 3af42ec78411..c464c72a51cb 100644 --- a/fs/cachefiles/namei.c +++ b/fs/cachefiles/namei.c @@ -309,7 +309,26 @@ int cachefiles_bury_object(struct cachefiles_cache *cache, rd.flags = 0; ret = start_renaming_dentry(&rd, 0, rep, &QSTR(nbuffer)); if (ret) { - cachefiles_io_error(cache, "Cannot lock/lookup in graveyard"); + /* Some errors aren't fatal */ + if (ret == -EXDEV) + /* double-lock failed */ + return ret; + if (d_unhashed(rep) || rep->d_parent != dir || IS_DEADDIR(d_inode(rep))) { + /* the entry was probably culled when we dropped the parent dir + * lock */ + _leave(" = 0 [culled?]"); + return 0; + } + if (ret == -EINVAL || ret == -ENOTEMPTY) { + cachefiles_io_error(cache, "May not make directory loop"); + return -EIO; + } + if (ret == -ENOMEM) { + _leave(" = -ENOMEM"); + return -ENOMEM; + } + + cachefiles_io_error(cache, "Lookup error %d", ret); return -EIO; } -- 2.50.0.107.gf914562f5916.dirty
