Skip to content

Commit 42ac3f7

Browse files
author
Hongzhen Luo
committed
[EROFS] implement {fget,flist}xattr() for ErofsFile
Signed-off-by: Hongzhen Luo <[email protected]>
1 parent 6722f54 commit 42ac3f7

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

src/overlaybd/tar/erofs/erofs_fs.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,35 @@ ssize_t ErofsFile::pread(void *buf, size_t count, off_t offset)
285285
return read;
286286
}
287287

288+
ssize_t ErofsFile::fgetxattr(const char *name, void *value, size_t size)
289+
{
290+
ssize_t value_size = 0;
291+
292+
value_size = erofs_getxattr(&file_private->inode, name, NULL, 0);
293+
if (value_size < 0)
294+
LOG_ERROR_RETURN(-1, size, "[erofs] fail to get xattr `", name);
295+
if ((size_t)value_size > size)
296+
LOG_ERROR_RETURN(-1, -1, "[erofs] buffer is too small to put xattr value of `", name);
297+
return erofs_getxattr(&file_private->inode, name, (char*)value, value_size);
298+
}
299+
300+
ssize_t ErofsFile::flistxattr(char *list, size_t size)
301+
{
302+
ssize_t kllen;
303+
304+
kllen = erofs_listxattr(&file_private->inode, NULL, 0);
305+
if (kllen < 0)
306+
LOG_ERROR_RETURN(-1, kllen, "[erofs] fail to list xattr");
307+
if ((size_t)kllen > size)
308+
LOG_ERROR_RETURN(-1, -1, "[erofs buffer size is too small to put xattrs");
309+
if (erofs_listxattr(&file_private->inode, list, kllen) != kllen)
310+
LOG_ERROR_RETURN(-1, -1, "[erofs] fail to list xattr");
311+
return kllen;
312+
}
313+
314+
EROFS_UNIMPLEMENTED_FUNC(int, ErofsFile, fsetxattr(const char *name, const void *value, size_t size, int flags), -EROFS_UNIMPLEMENTED)
315+
EROFS_UNIMPLEMENTED_FUNC(int, ErofsFile, fremovexattr(const char *name), -EROFS_UNIMPLEMENTED)
316+
288317
// ErofsFileSystem
289318
EROFS_UNIMPLEMENTED_FUNC(photon::fs::IFile*, ErofsFileSystem, open(const char *pathname, int flags, mode_t mode), NULL)
290319
EROFS_UNIMPLEMENTED_FUNC(photon::fs::IFile*, ErofsFileSystem, creat(const char *pathname, mode_t mode), NULL)

src/overlaybd/tar/erofs/erofs_fs.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,18 @@ class ErofsFileSystem: public photon::fs::IFileSystem {
5858
friend class ErofsFile;
5959
};
6060

61-
class ErofsFile: public photon::fs::VirtualReadOnlyFile {
61+
class ErofsFile: public photon::fs::VirtualReadOnlyFile, public photon::fs::IFileXAttr {
6262
public:
6363
ErofsFile(ErofsFileSystem *fs);
6464
~ErofsFile();
6565
photon::fs::IFileSystem *filesystem();
6666
int fstat(struct stat *buf);
6767
int fiemap(struct photon::fs::fiemap *map);
6868
ssize_t pread(void *buf, size_t count, off_t offset);
69+
ssize_t fgetxattr(const char *name, void *value, size_t size);
70+
ssize_t flistxattr(char *list, size_t size);
71+
int fsetxattr(const char *name, const void *value, size_t size, int flags);
72+
int fremovexattr(const char *name);
6973
private:
7074
ErofsFileSystem *fs;
7175
struct ErofsFileInt;

0 commit comments

Comments
 (0)