summaryrefslogtreecommitdiffstats
path: root/fs/erofs/xattr.h
diff options
context:
space:
mode:
authorGao Xiang <hsiangkao@aol.com>2019-08-22 17:36:59 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-08-24 08:20:10 -0400
commit47e4937a4a7ca4184fd282791dfee76c6799966a (patch)
treefc68338c13a00ac74ac9f1a838491bd3f7649c28 /fs/erofs/xattr.h
parentf401441deda68326852560bf70d59e95f585bbb3 (diff)
erofs: move erofs out of staging
EROFS filesystem has been merged into linux-staging for a year. EROFS is designed to be a better solution of saving extra storage space with guaranteed end-to-end performance for read-only files with the help of reduced metadata, fixed-sized output compression and decompression inplace technologies. In the past year, EROFS was greatly improved by many people as a staging driver, self-tested, betaed by a large number of our internal users, successfully applied to almost all in-service HUAWEI smartphones as the part of EMUI 9.1 and proven to be stable enough to be moved out of staging. EROFS is a self-contained filesystem driver. Although there are still some TODOs to be more generic, we have a dedicated team actively keeping on working on EROFS in order to make it better with the evolution of Linux kernel as the other in-kernel filesystems. As Pavel suggested, it's better to do as one commit since git can do moves and all histories will be saved in this way. Let's promote it from staging and enhance it more actively as a "real" part of kernel for more wider scenarios! Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Theodore Ts'o <tytso@mit.edu> Cc: Pavel Machek <pavel@denx.de> Cc: David Sterba <dsterba@suse.cz> Cc: Amir Goldstein <amir73il@gmail.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: Darrick J . Wong <darrick.wong@oracle.com> Cc: Dave Chinner <david@fromorbit.com> Cc: Jaegeuk Kim <jaegeuk@kernel.org> Cc: Jan Kara <jack@suse.cz> Cc: Richard Weinberger <richard@nod.at> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Chao Yu <yuchao0@huawei.com> Cc: Miao Xie <miaoxie@huawei.com> Cc: Li Guifu <bluce.liguifu@huawei.com> Cc: Fang Wei <fangwei1@huawei.com> Signed-off-by: Gao Xiang <gaoxiang25@huawei.com> Link: https://lore.kernel.org/r/20190822213659.5501-1-hsiangkao@aol.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/erofs/xattr.h')
-rw-r--r--fs/erofs/xattr.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/fs/erofs/xattr.h b/fs/erofs/xattr.h
new file mode 100644
index 000000000000..c5ca47d814dd
--- /dev/null
+++ b/fs/erofs/xattr.h
@@ -0,0 +1,92 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2017-2018 HUAWEI, Inc.
4 * http://www.huawei.com/
5 * Created by Gao Xiang <gaoxiang25@huawei.com>
6 */
7#ifndef __EROFS_XATTR_H
8#define __EROFS_XATTR_H
9
10#include "internal.h"
11#include <linux/posix_acl_xattr.h>
12#include <linux/xattr.h>
13
14/* Attribute not found */
15#define ENOATTR ENODATA
16
17static inline unsigned int inlinexattr_header_size(struct inode *inode)
18{
19 return sizeof(struct erofs_xattr_ibody_header)
20 + sizeof(u32) * EROFS_V(inode)->xattr_shared_count;
21}
22
23static inline erofs_blk_t xattrblock_addr(struct erofs_sb_info *sbi,
24 unsigned int xattr_id)
25{
26#ifdef CONFIG_EROFS_FS_XATTR
27 return sbi->xattr_blkaddr +
28 xattr_id * sizeof(__u32) / EROFS_BLKSIZ;
29#else
30 return 0;
31#endif
32}
33
34static inline unsigned int xattrblock_offset(struct erofs_sb_info *sbi,
35 unsigned int xattr_id)
36{
37 return (xattr_id * sizeof(__u32)) % EROFS_BLKSIZ;
38}
39
40#ifdef CONFIG_EROFS_FS_XATTR
41extern const struct xattr_handler erofs_xattr_user_handler;
42extern const struct xattr_handler erofs_xattr_trusted_handler;
43#ifdef CONFIG_EROFS_FS_SECURITY
44extern const struct xattr_handler erofs_xattr_security_handler;
45#endif
46
47static inline const struct xattr_handler *erofs_xattr_handler(unsigned int idx)
48{
49static const struct xattr_handler *xattr_handler_map[] = {
50 [EROFS_XATTR_INDEX_USER] = &erofs_xattr_user_handler,
51#ifdef CONFIG_EROFS_FS_POSIX_ACL
52 [EROFS_XATTR_INDEX_POSIX_ACL_ACCESS] = &posix_acl_access_xattr_handler,
53 [EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT] =
54 &posix_acl_default_xattr_handler,
55#endif
56 [EROFS_XATTR_INDEX_TRUSTED] = &erofs_xattr_trusted_handler,
57#ifdef CONFIG_EROFS_FS_SECURITY
58 [EROFS_XATTR_INDEX_SECURITY] = &erofs_xattr_security_handler,
59#endif
60};
61
62 return idx && idx < ARRAY_SIZE(xattr_handler_map) ?
63 xattr_handler_map[idx] : NULL;
64}
65
66extern const struct xattr_handler *erofs_xattr_handlers[];
67
68int erofs_getxattr(struct inode *, int, const char *, void *, size_t);
69ssize_t erofs_listxattr(struct dentry *, char *, size_t);
70#else
71static inline int erofs_getxattr(struct inode *inode, int index,
72 const char *name, void *buffer,
73 size_t buffer_size)
74{
75 return -EOPNOTSUPP;
76}
77
78static inline ssize_t erofs_listxattr(struct dentry *dentry,
79 char *buffer, size_t buffer_size)
80{
81 return -EOPNOTSUPP;
82}
83#endif /* !CONFIG_EROFS_FS_XATTR */
84
85#ifdef CONFIG_EROFS_FS_POSIX_ACL
86struct posix_acl *erofs_get_acl(struct inode *inode, int type);
87#else
88#define erofs_get_acl (NULL)
89#endif
90
91#endif
92