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


Reply via email to