Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
6da22013
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6da22013
编写于
11月 13, 2016
作者:
T
Theodore Ts'o
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fscrypt' into origin
上级
a2f6d9c4
a6e08912
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
124 addition
and
85 deletion
+124
-85
fs/crypto/crypto.c
fs/crypto/crypto.c
+51
-32
fs/crypto/fname.c
fs/crypto/fname.c
+23
-34
fs/crypto/keyinfo.c
fs/crypto/keyinfo.c
+13
-3
fs/ext4/inode.c
fs/ext4/inode.c
+5
-2
fs/ext4/page-io.c
fs/ext4/page-io.c
+2
-1
fs/f2fs/data.c
fs/f2fs/data.c
+4
-1
include/linux/fscrypto.h
include/linux/fscrypto.h
+26
-12
未找到文件。
fs/crypto/crypto.c
浏览文件 @
6da22013
...
...
@@ -88,7 +88,7 @@ EXPORT_SYMBOL(fscrypt_release_ctx);
* Return: An allocated and initialized encryption context on success; error
* value or NULL otherwise.
*/
struct
fscrypt_ctx
*
fscrypt_get_ctx
(
struct
inode
*
inode
,
gfp_t
gfp_flags
)
struct
fscrypt_ctx
*
fscrypt_get_ctx
(
const
struct
inode
*
inode
,
gfp_t
gfp_flags
)
{
struct
fscrypt_ctx
*
ctx
=
NULL
;
struct
fscrypt_info
*
ci
=
inode
->
i_crypt_info
;
...
...
@@ -146,9 +146,10 @@ typedef enum {
FS_ENCRYPT
,
}
fscrypt_direction_t
;
static
int
do_page_crypto
(
struct
inode
*
inode
,
static
int
do_page_crypto
(
const
struct
inode
*
inode
,
fscrypt_direction_t
rw
,
pgoff_t
index
,
struct
page
*
src_page
,
struct
page
*
dest_page
,
unsigned
int
src_len
,
unsigned
int
src_offset
,
gfp_t
gfp_flags
)
{
struct
{
...
...
@@ -179,10 +180,10 @@ static int do_page_crypto(struct inode *inode,
memset
(
xts_tweak
.
padding
,
0
,
sizeof
(
xts_tweak
.
padding
));
sg_init_table
(
&
dst
,
1
);
sg_set_page
(
&
dst
,
dest_page
,
PAGE_SIZE
,
0
);
sg_set_page
(
&
dst
,
dest_page
,
src_len
,
src_offset
);
sg_init_table
(
&
src
,
1
);
sg_set_page
(
&
src
,
src_page
,
PAGE_SIZE
,
0
);
skcipher_request_set_crypt
(
req
,
&
src
,
&
dst
,
PAGE_SIZE
,
&
xts_tweak
);
sg_set_page
(
&
src
,
src_page
,
src_len
,
src_offset
);
skcipher_request_set_crypt
(
req
,
&
src
,
&
dst
,
src_len
,
&
xts_tweak
);
if
(
rw
==
FS_DECRYPT
)
res
=
crypto_skcipher_decrypt
(
req
);
else
...
...
@@ -213,12 +214,17 @@ static struct page *alloc_bounce_page(struct fscrypt_ctx *ctx, gfp_t gfp_flags)
/**
* fscypt_encrypt_page() - Encrypts a page
* @inode: The inode for which the encryption should take place
* @plaintext_page: The page to encrypt. Must be locked.
* @gfp_flags: The gfp flag for memory allocation
* @inode: The inode for which the encryption should take place
* @plaintext_page: The page to encrypt. Must be locked.
* @plaintext_len: Length of plaintext within page
* @plaintext_offset: Offset of plaintext within page
* @index: Index for encryption. This is mainly the page index, but
* but might be different for multiple calls on same page.
* @gfp_flags: The gfp flag for memory allocation
*
* Allocates a ciphertext page and encrypts plaintext_page into it using the ctx
* encryption context.
* Encrypts plaintext_page using the ctx encryption context. If
* the filesystem supports it, encryption is performed in-place, otherwise a
* new ciphertext_page is allocated and returned.
*
* Called on the page write path. The caller must call
* fscrypt_restore_control_page() on the returned ciphertext page to
...
...
@@ -227,35 +233,44 @@ static struct page *alloc_bounce_page(struct fscrypt_ctx *ctx, gfp_t gfp_flags)
* Return: An allocated page with the encrypted content on success. Else, an
* error value or NULL.
*/
struct
page
*
fscrypt_encrypt_page
(
struct
inode
*
inode
,
struct
page
*
plaintext_page
,
gfp_t
gfp_flags
)
struct
page
*
fscrypt_encrypt_page
(
const
struct
inode
*
inode
,
struct
page
*
plaintext_page
,
unsigned
int
plaintext_len
,
unsigned
int
plaintext_offset
,
pgoff_t
index
,
gfp_t
gfp_flags
)
{
struct
fscrypt_ctx
*
ctx
;
struct
page
*
ciphertext_page
=
NULL
;
struct
page
*
ciphertext_page
=
plaintext_page
;
int
err
;
BUG_ON
(
!
PageLocked
(
plaintext_page
)
);
BUG_ON
(
plaintext_len
%
FS_CRYPTO_BLOCK_SIZE
!=
0
);
ctx
=
fscrypt_get_ctx
(
inode
,
gfp_flags
);
if
(
IS_ERR
(
ctx
))
return
(
struct
page
*
)
ctx
;
/* The encryption operation will require a bounce page. */
ciphertext_page
=
alloc_bounce_page
(
ctx
,
gfp_flags
);
if
(
IS_ERR
(
ciphertext_page
))
goto
errout
;
if
(
!
(
inode
->
i_sb
->
s_cop
->
flags
&
FS_CFLG_INPLACE_ENCRYPTION
))
{
/* The encryption operation will require a bounce page. */
ciphertext_page
=
alloc_bounce_page
(
ctx
,
gfp_flags
);
if
(
IS_ERR
(
ciphertext_page
))
goto
errout
;
}
ctx
->
w
.
control_page
=
plaintext_page
;
err
=
do_page_crypto
(
inode
,
FS_ENCRYPT
,
plaintext_page
->
index
,
err
=
do_page_crypto
(
inode
,
FS_ENCRYPT
,
index
,
plaintext_page
,
ciphertext_page
,
plaintext_len
,
plaintext_offset
,
gfp_flags
);
if
(
err
)
{
ciphertext_page
=
ERR_PTR
(
err
);
goto
errout
;
}
SetPagePrivate
(
ciphertext_page
);
set_page_private
(
ciphertext_page
,
(
unsigned
long
)
ctx
);
lock_page
(
ciphertext_page
);
if
(
!
(
inode
->
i_sb
->
s_cop
->
flags
&
FS_CFLG_INPLACE_ENCRYPTION
))
{
SetPagePrivate
(
ciphertext_page
);
set_page_private
(
ciphertext_page
,
(
unsigned
long
)
ctx
);
lock_page
(
ciphertext_page
);
}
return
ciphertext_page
;
errout:
...
...
@@ -265,8 +280,12 @@ struct page *fscrypt_encrypt_page(struct inode *inode,
EXPORT_SYMBOL
(
fscrypt_encrypt_page
);
/**
* f2crypt_decrypt_page() - Decrypts a page in-place
* @page: The page to decrypt. Must be locked.
* fscrypt_decrypt_page() - Decrypts a page in-place
* @inode: Encrypted inode to decrypt.
* @page: The page to decrypt. Must be locked.
* @len: Number of bytes in @page to be decrypted.
* @offs: Start of data in @page.
* @index: Index for encryption.
*
* Decrypts page in-place using the ctx encryption context.
*
...
...
@@ -274,16 +293,15 @@ EXPORT_SYMBOL(fscrypt_encrypt_page);
*
* Return: Zero on success, non-zero otherwise.
*/
int
fscrypt_decrypt_page
(
struct
page
*
page
)
int
fscrypt_decrypt_page
(
const
struct
inode
*
inode
,
struct
page
*
page
,
unsigned
int
len
,
unsigned
int
offs
,
pgoff_t
index
)
{
BUG_ON
(
!
PageLocked
(
page
));
return
do_page_crypto
(
page
->
mapping
->
host
,
FS_DECRYPT
,
page
->
index
,
page
,
page
,
GFP_NOFS
);
return
do_page_crypto
(
inode
,
FS_DECRYPT
,
page
->
index
,
page
,
page
,
len
,
offs
,
GFP_NOFS
);
}
EXPORT_SYMBOL
(
fscrypt_decrypt_page
);
int
fscrypt_zeroout_range
(
struct
inode
*
inode
,
pgoff_t
lblk
,
int
fscrypt_zeroout_range
(
const
struct
inode
*
inode
,
pgoff_t
lblk
,
sector_t
pblk
,
unsigned
int
len
)
{
struct
fscrypt_ctx
*
ctx
;
...
...
@@ -306,7 +324,7 @@ int fscrypt_zeroout_range(struct inode *inode, pgoff_t lblk,
while
(
len
--
)
{
err
=
do_page_crypto
(
inode
,
FS_ENCRYPT
,
lblk
,
ZERO_PAGE
(
0
),
ciphertext_page
,
GFP_NOFS
);
PAGE_SIZE
,
0
,
GFP_NOFS
);
if
(
err
)
goto
errout
;
...
...
@@ -414,7 +432,8 @@ static void completion_pages(struct work_struct *work)
bio_for_each_segment_all
(
bv
,
bio
,
i
)
{
struct
page
*
page
=
bv
->
bv_page
;
int
ret
=
fscrypt_decrypt_page
(
page
);
int
ret
=
fscrypt_decrypt_page
(
page
->
mapping
->
host
,
page
,
PAGE_SIZE
,
0
,
page
->
index
);
if
(
ret
)
{
WARN_ON_ONCE
(
1
);
...
...
fs/crypto/fname.c
浏览文件 @
6da22013
...
...
@@ -39,65 +39,54 @@ static void fname_crypt_complete(struct crypto_async_request *req, int res)
static
int
fname_encrypt
(
struct
inode
*
inode
,
const
struct
qstr
*
iname
,
struct
fscrypt_str
*
oname
)
{
u32
ciphertext_len
;
struct
skcipher_request
*
req
=
NULL
;
DECLARE_FS_COMPLETION_RESULT
(
ecr
);
struct
fscrypt_info
*
ci
=
inode
->
i_crypt_info
;
struct
crypto_skcipher
*
tfm
=
ci
->
ci_ctfm
;
int
res
=
0
;
char
iv
[
FS_CRYPTO_BLOCK_SIZE
];
struct
scatterlist
s
rc_sg
,
dst_s
g
;
struct
scatterlist
sg
;
int
padding
=
4
<<
(
ci
->
ci_flags
&
FS_POLICY_FLAGS_PAD_MASK
);
char
*
workbuf
,
buf
[
32
],
*
alloc_buf
=
NULL
;
unsigned
lim
;
unsigned
int
lim
;
unsigned
int
cryptlen
;
lim
=
inode
->
i_sb
->
s_cop
->
max_namelen
(
inode
);
if
(
iname
->
len
<=
0
||
iname
->
len
>
lim
)
return
-
EIO
;
ciphertext_len
=
max
(
iname
->
len
,
(
u32
)
FS_CRYPTO_BLOCK_SIZE
);
ciphertext_len
=
round_up
(
ciphertext_len
,
padding
);
ciphertext_len
=
min
(
ciphertext_len
,
lim
);
/*
* Copy the filename to the output buffer for encrypting in-place and
* pad it with the needed number of NUL bytes.
*/
cryptlen
=
max_t
(
unsigned
int
,
iname
->
len
,
FS_CRYPTO_BLOCK_SIZE
);
cryptlen
=
round_up
(
cryptlen
,
padding
);
cryptlen
=
min
(
cryptlen
,
lim
);
memcpy
(
oname
->
name
,
iname
->
name
,
iname
->
len
);
memset
(
oname
->
name
+
iname
->
len
,
0
,
cryptlen
-
iname
->
len
);
if
(
ciphertext_len
<=
sizeof
(
buf
))
{
workbuf
=
buf
;
}
else
{
alloc_buf
=
kmalloc
(
ciphertext_len
,
GFP_NOFS
);
if
(
!
alloc_buf
)
return
-
ENOMEM
;
workbuf
=
alloc_buf
;
}
/* Initialize the IV */
memset
(
iv
,
0
,
FS_CRYPTO_BLOCK_SIZE
);
/*
Allocate
request */
/*
Set up the encryption
request */
req
=
skcipher_request_alloc
(
tfm
,
GFP_NOFS
);
if
(
!
req
)
{
printk_ratelimited
(
KERN_ERR
"%s: crypto_request_alloc() failed
\n
"
,
__func__
);
kfree
(
alloc_buf
);
"%s: skcipher_request_alloc() failed
\n
"
,
__func__
);
return
-
ENOMEM
;
}
skcipher_request_set_callback
(
req
,
CRYPTO_TFM_REQ_MAY_BACKLOG
|
CRYPTO_TFM_REQ_MAY_SLEEP
,
fname_crypt_complete
,
&
ecr
);
sg_init_one
(
&
sg
,
oname
->
name
,
cryptlen
);
skcipher_request_set_crypt
(
req
,
&
sg
,
&
sg
,
cryptlen
,
iv
);
/* Copy the input */
memcpy
(
workbuf
,
iname
->
name
,
iname
->
len
);
if
(
iname
->
len
<
ciphertext_len
)
memset
(
workbuf
+
iname
->
len
,
0
,
ciphertext_len
-
iname
->
len
);
/* Initialize IV */
memset
(
iv
,
0
,
FS_CRYPTO_BLOCK_SIZE
);
/* Create encryption request */
sg_init_one
(
&
src_sg
,
workbuf
,
ciphertext_len
);
sg_init_one
(
&
dst_sg
,
oname
->
name
,
ciphertext_len
);
skcipher_request_set_crypt
(
req
,
&
src_sg
,
&
dst_sg
,
ciphertext_len
,
iv
);
/* Do the encryption */
res
=
crypto_skcipher_encrypt
(
req
);
if
(
res
==
-
EINPROGRESS
||
res
==
-
EBUSY
)
{
/* Request is being completed asynchronously; wait for it */
wait_for_completion
(
&
ecr
.
completion
);
res
=
ecr
.
res
;
}
kfree
(
alloc_buf
);
skcipher_request_free
(
req
);
if
(
res
<
0
)
{
printk_ratelimited
(
KERN_ERR
...
...
@@ -105,7 +94,7 @@ static int fname_encrypt(struct inode *inode,
return
res
;
}
oname
->
len
=
c
iphertext_
len
;
oname
->
len
=
c
rypt
len
;
return
0
;
}
...
...
@@ -220,7 +209,7 @@ static int digest_decode(const char *src, int len, char *dst)
return
cp
-
dst
;
}
u32
fscrypt_fname_encrypted_size
(
struct
inode
*
inode
,
u32
ilen
)
u32
fscrypt_fname_encrypted_size
(
const
struct
inode
*
inode
,
u32
ilen
)
{
int
padding
=
32
;
struct
fscrypt_info
*
ci
=
inode
->
i_crypt_info
;
...
...
@@ -238,7 +227,7 @@ EXPORT_SYMBOL(fscrypt_fname_encrypted_size);
* Allocates an output buffer that is sufficient for the crypto operation
* specified by the context and the direction.
*/
int
fscrypt_fname_alloc_buffer
(
struct
inode
*
inode
,
int
fscrypt_fname_alloc_buffer
(
const
struct
inode
*
inode
,
u32
ilen
,
struct
fscrypt_str
*
crypto_str
)
{
unsigned
int
olen
=
fscrypt_fname_encrypted_size
(
inode
,
ilen
);
...
...
fs/crypto/keyinfo.c
浏览文件 @
6da22013
...
...
@@ -185,7 +185,7 @@ int get_crypt_info(struct inode *inode)
struct
crypto_skcipher
*
ctfm
;
const
char
*
cipher_str
;
int
keysize
;
u8
raw_key
[
FS_MAX_KEY_SIZE
]
;
u8
*
raw_key
=
NULL
;
int
res
;
res
=
fscrypt_initialize
();
...
...
@@ -238,6 +238,15 @@ int get_crypt_info(struct inode *inode)
if
(
res
)
goto
out
;
/*
* This cannot be a stack buffer because it is passed to the scatterlist
* crypto API as part of key derivation.
*/
res
=
-
ENOMEM
;
raw_key
=
kmalloc
(
FS_MAX_KEY_SIZE
,
GFP_NOFS
);
if
(
!
raw_key
)
goto
out
;
if
(
fscrypt_dummy_context_enabled
(
inode
))
{
memset
(
raw_key
,
0x42
,
FS_AES_256_XTS_KEY_SIZE
);
goto
got_key
;
...
...
@@ -276,7 +285,8 @@ int get_crypt_info(struct inode *inode)
if
(
res
)
goto
out
;
memzero_explicit
(
raw_key
,
sizeof
(
raw_key
));
kzfree
(
raw_key
);
raw_key
=
NULL
;
if
(
cmpxchg
(
&
inode
->
i_crypt_info
,
NULL
,
crypt_info
)
!=
NULL
)
{
put_crypt_info
(
crypt_info
);
goto
retry
;
...
...
@@ -287,7 +297,7 @@ int get_crypt_info(struct inode *inode)
if
(
res
==
-
ENOKEY
)
res
=
0
;
put_crypt_info
(
crypt_info
);
memzero_explicit
(
raw_key
,
sizeof
(
raw_key
)
);
kzfree
(
raw_key
);
return
res
;
}
...
...
fs/ext4/inode.c
浏览文件 @
6da22013
...
...
@@ -1169,7 +1169,8 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len,
if
(
unlikely
(
err
))
page_zero_new_buffers
(
page
,
from
,
to
);
else
if
(
decrypt
)
err
=
fscrypt_decrypt_page
(
page
);
err
=
fscrypt_decrypt_page
(
page
->
mapping
->
host
,
page
,
PAGE_SIZE
,
0
,
page
->
index
);
return
err
;
}
#endif
...
...
@@ -3746,7 +3747,9 @@ static int __ext4_block_zero_page_range(handle_t *handle,
/* We expect the key to be set. */
BUG_ON
(
!
fscrypt_has_encryption_key
(
inode
));
BUG_ON
(
blocksize
!=
PAGE_SIZE
);
WARN_ON_ONCE
(
fscrypt_decrypt_page
(
page
));
BUG_ON
(
!
PageLocked
(
page
));
WARN_ON_ONCE
(
fscrypt_decrypt_page
(
page
->
mapping
->
host
,
page
,
PAGE_SIZE
,
0
,
page
->
index
));
}
}
if
(
ext4_should_journal_data
(
inode
))
{
...
...
fs/ext4/page-io.c
浏览文件 @
6da22013
...
...
@@ -470,7 +470,8 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
gfp_t
gfp_flags
=
GFP_NOFS
;
retry_encrypt:
data_page
=
fscrypt_encrypt_page
(
inode
,
page
,
gfp_flags
);
data_page
=
fscrypt_encrypt_page
(
inode
,
page
,
PAGE_SIZE
,
0
,
page
->
index
,
gfp_flags
);
if
(
IS_ERR
(
data_page
))
{
ret
=
PTR_ERR
(
data_page
);
if
(
ret
==
-
ENOMEM
&&
wbc
->
sync_mode
==
WB_SYNC_ALL
)
{
...
...
fs/f2fs/data.c
浏览文件 @
6da22013
...
...
@@ -1194,8 +1194,11 @@ int do_write_data_page(struct f2fs_io_info *fio)
f2fs_wait_on_encrypted_page_writeback
(
F2FS_I_SB
(
inode
),
fio
->
old_blkaddr
);
retry_encrypt:
BUG_ON
(
!
PageLocked
(
fio
->
page
));
fio
->
encrypted_page
=
fscrypt_encrypt_page
(
inode
,
fio
->
page
,
gfp_flags
);
PAGE_SIZE
,
0
,
fio
->
page
->
index
,
gfp_flags
);
if
(
IS_ERR
(
fio
->
encrypted_page
))
{
err
=
PTR_ERR
(
fio
->
encrypted_page
);
if
(
err
==
-
ENOMEM
)
{
...
...
include/linux/fscrypto.h
浏览文件 @
6da22013
...
...
@@ -153,10 +153,16 @@ struct fscrypt_name {
#define fname_name(p) ((p)->disk_name.name)
#define fname_len(p) ((p)->disk_name.len)
/*
* fscrypt superblock flags
*/
#define FS_CFLG_INPLACE_ENCRYPTION (1U << 1)
/*
* crypto opertions for filesystems
*/
struct
fscrypt_operations
{
unsigned
int
flags
;
int
(
*
get_context
)(
struct
inode
*
,
void
*
,
size_t
);
int
(
*
key_prefix
)(
struct
inode
*
,
u8
**
);
int
(
*
prepare_context
)(
struct
inode
*
);
...
...
@@ -206,7 +212,7 @@ static inline struct page *fscrypt_control_page(struct page *page)
#endif
}
static
inline
int
fscrypt_has_encryption_key
(
struct
inode
*
inode
)
static
inline
int
fscrypt_has_encryption_key
(
const
struct
inode
*
inode
)
{
#if IS_ENABLED(CONFIG_FS_ENCRYPTION)
return
(
inode
->
i_crypt_info
!=
NULL
);
...
...
@@ -240,14 +246,17 @@ static inline void fscrypt_set_d_op(struct dentry *dentry)
extern
struct
kmem_cache
*
fscrypt_info_cachep
;
int
fscrypt_initialize
(
void
);
extern
struct
fscrypt_ctx
*
fscrypt_get_ctx
(
struct
inode
*
,
gfp_t
);
extern
struct
fscrypt_ctx
*
fscrypt_get_ctx
(
const
struct
inode
*
,
gfp_t
);
extern
void
fscrypt_release_ctx
(
struct
fscrypt_ctx
*
);
extern
struct
page
*
fscrypt_encrypt_page
(
struct
inode
*
,
struct
page
*
,
gfp_t
);
extern
int
fscrypt_decrypt_page
(
struct
page
*
);
extern
struct
page
*
fscrypt_encrypt_page
(
const
struct
inode
*
,
struct
page
*
,
unsigned
int
,
unsigned
int
,
pgoff_t
,
gfp_t
);
extern
int
fscrypt_decrypt_page
(
const
struct
inode
*
,
struct
page
*
,
unsigned
int
,
unsigned
int
,
pgoff_t
);
extern
void
fscrypt_decrypt_bio_pages
(
struct
fscrypt_ctx
*
,
struct
bio
*
);
extern
void
fscrypt_pullback_bio_page
(
struct
page
**
,
bool
);
extern
void
fscrypt_restore_control_page
(
struct
page
*
);
extern
int
fscrypt_zeroout_range
(
struct
inode
*
,
pgoff_t
,
sector_t
,
extern
int
fscrypt_zeroout_range
(
const
struct
inode
*
,
pgoff_t
,
sector_t
,
unsigned
int
);
/* policy.c */
extern
int
fscrypt_process_policy
(
struct
file
*
,
const
struct
fscrypt_policy
*
);
...
...
@@ -264,8 +273,8 @@ extern void fscrypt_put_encryption_info(struct inode *, struct fscrypt_info *);
extern
int
fscrypt_setup_filename
(
struct
inode
*
,
const
struct
qstr
*
,
int
lookup
,
struct
fscrypt_name
*
);
extern
void
fscrypt_free_filename
(
struct
fscrypt_name
*
);
extern
u32
fscrypt_fname_encrypted_size
(
struct
inode
*
,
u32
);
extern
int
fscrypt_fname_alloc_buffer
(
struct
inode
*
,
u32
,
extern
u32
fscrypt_fname_encrypted_size
(
const
struct
inode
*
,
u32
);
extern
int
fscrypt_fname_alloc_buffer
(
const
struct
inode
*
,
u32
,
struct
fscrypt_str
*
);
extern
void
fscrypt_fname_free_buffer
(
struct
fscrypt_str
*
);
extern
int
fscrypt_fname_disk_to_usr
(
struct
inode
*
,
u32
,
u32
,
...
...
@@ -275,7 +284,7 @@ extern int fscrypt_fname_usr_to_disk(struct inode *, const struct qstr *,
#endif
/* crypto.c */
static
inline
struct
fscrypt_ctx
*
fscrypt_notsupp_get_ctx
(
struct
inode
*
i
,
static
inline
struct
fscrypt_ctx
*
fscrypt_notsupp_get_ctx
(
const
struct
inode
*
i
,
gfp_t
f
)
{
return
ERR_PTR
(
-
EOPNOTSUPP
);
...
...
@@ -286,13 +295,18 @@ static inline void fscrypt_notsupp_release_ctx(struct fscrypt_ctx *c)
return
;
}
static
inline
struct
page
*
fscrypt_notsupp_encrypt_page
(
struct
inode
*
i
,
struct
page
*
p
,
gfp_t
f
)
static
inline
struct
page
*
fscrypt_notsupp_encrypt_page
(
const
struct
inode
*
i
,
struct
page
*
p
,
unsigned
int
len
,
unsigned
int
offs
,
pgoff_t
index
,
gfp_t
f
)
{
return
ERR_PTR
(
-
EOPNOTSUPP
);
}
static
inline
int
fscrypt_notsupp_decrypt_page
(
struct
page
*
p
)
static
inline
int
fscrypt_notsupp_decrypt_page
(
const
struct
inode
*
i
,
struct
page
*
p
,
unsigned
int
len
,
unsigned
int
offs
,
pgoff_t
index
)
{
return
-
EOPNOTSUPP
;
}
...
...
@@ -313,7 +327,7 @@ static inline void fscrypt_notsupp_restore_control_page(struct page *p)
return
;
}
static
inline
int
fscrypt_notsupp_zeroout_range
(
struct
inode
*
i
,
pgoff_t
p
,
static
inline
int
fscrypt_notsupp_zeroout_range
(
const
struct
inode
*
i
,
pgoff_t
p
,
sector_t
s
,
unsigned
int
f
)
{
return
-
EOPNOTSUPP
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录