Project

General

Profile

Actions

Tasks #69442

closed

Tasks #63293: Implement fscrypt in libcephfs and cephfs-fuse

locked symlink displays empty dest when not cached

Added by Christopher Hoffman about 1 year ago. Updated about 1 year ago.

Status:
Resolved
Priority:
Normal
Category:
-
Target version:
-
% Done:

0%

Reviewed:
Affected Versions:
Component(FS):
Labels (FS):
Pull request ID:
Tags (freeform):
Merge Commit:
Fixed In:
Released In:
Upkeep Timestamp:

Description

A symlink in an fscrypt locked dir displays empty dest when not cached.

State:
1. encrypt / unlock directory
2. write symlink in unlocked dir
3. lock directory
4. umount fuse
5. mount fuse
6. list locked dir (symlink dest is empty)
lrwxrwxrwx 1 choffman choffman 46 Jan 7 20:20 HoT0UkmhMMMYZksFpzEHntHlb3D1o7kIrIdY4URRGZo -> ''

dest should not be empty but should look like this (list lock dir from kclient):
lrwxrwxrwx 1 choffman choffman 54 Jan 7 20:20 HoT0UkmhMMMYZksFpzEHntHlb3D1o7kIrIdY4URRGZo -> AAAAAAAAAABFm0NyEY0klvTE1dgphnfE-Qi1rfuVSjSaSvPR6crt-A

Actions #1

Updated by Christopher Hoffman about 1 year ago

  • Status changed from New to In Progress
  • Assignee set to Christopher Hoffman
Actions #2

Updated by Christopher Hoffman about 1 year ago

  • Status changed from In Progress to Resolved
commit d1f228a9bd65890f1535a56271ee1d98f7e71801 (HEAD -> wip-fscrypt)
Author: Christopher Hoffman <choffman@redhat.com>
Date:   Wed Jan 8 17:53:25 2025 +0000

    client: set symlink dest to proper value

    Fixes: https://tracker.ceph.com/issues/69442
    Signed-off-by: Christopher Hoffman <choffman@redhat.com>

diff --git a/src/client/Client.cc b/src/client/Client.cc
index d4efe9a5281..47c7d9e613b 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -7463,6 +7463,8 @@ int Client::_do_lookup(Inode *dir, const string& name, int mask,
         ldout(cct, 0) << __FILE__ << ":" << __LINE__ << ": failed to decrypt symlink (r=" << ret << ")" << dendl;
       }
       inode->symlink_plain = slname;
+    } else {
+      inode->symlink_plain = inode->symlink;
     }
   }

@@ -8153,7 +8155,7 @@ int Client::_readlink(Inode *in, char *buf, size_t size)
     memcpy(buf, dname.c_str(), dname.size());
     r = dname.size();
   } else {
-    memcpy(buf, in->symlink_plain.c_str(), r);
+    memcpy(buf, in->symlink.c_str(), r);
   }

   return r;
Actions

Also available in: Atom PDF