提交 11803f97 编写于 作者: A Al Viro

switch befs long symlinks to page_symlink_operations

just give them the right ->readpage()...
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 527e9316
...@@ -42,7 +42,7 @@ static struct inode *befs_iget(struct super_block *, unsigned long); ...@@ -42,7 +42,7 @@ static struct inode *befs_iget(struct super_block *, unsigned long);
static struct inode *befs_alloc_inode(struct super_block *sb); static struct inode *befs_alloc_inode(struct super_block *sb);
static void befs_destroy_inode(struct inode *inode); static void befs_destroy_inode(struct inode *inode);
static void befs_destroy_inodecache(void); static void befs_destroy_inodecache(void);
static const char *befs_follow_link(struct dentry *, void **); static int befs_symlink_readpage(struct file *, struct page *);
static int befs_utf2nls(struct super_block *sb, const char *in, int in_len, static int befs_utf2nls(struct super_block *sb, const char *in, int in_len,
char **out, int *out_len); char **out, int *out_len);
static int befs_nls2utf(struct super_block *sb, const char *in, int in_len, static int befs_nls2utf(struct super_block *sb, const char *in, int in_len,
...@@ -79,10 +79,8 @@ static const struct address_space_operations befs_aops = { ...@@ -79,10 +79,8 @@ static const struct address_space_operations befs_aops = {
.bmap = befs_bmap, .bmap = befs_bmap,
}; };
static const struct inode_operations befs_symlink_inode_operations = { static const struct address_space_operations befs_symlink_aops = {
.readlink = generic_readlink, .readpage = befs_symlink_readpage,
.follow_link = befs_follow_link,
.put_link = kfree_put_link,
}; };
/* /*
...@@ -398,7 +396,8 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino) ...@@ -398,7 +396,8 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
inode->i_fop = &befs_dir_operations; inode->i_fop = &befs_dir_operations;
} else if (S_ISLNK(inode->i_mode)) { } else if (S_ISLNK(inode->i_mode)) {
if (befs_ino->i_flags & BEFS_LONG_SYMLINK) { if (befs_ino->i_flags & BEFS_LONG_SYMLINK) {
inode->i_op = &befs_symlink_inode_operations; inode->i_op = &page_symlink_inode_operations;
inode->i_mapping->a_ops = &befs_symlink_aops;
} else { } else {
inode->i_link = befs_ino->i_data.symlink; inode->i_link = befs_ino->i_data.symlink;
inode->i_op = &simple_symlink_inode_operations; inode->i_op = &simple_symlink_inode_operations;
...@@ -463,31 +462,35 @@ befs_destroy_inodecache(void) ...@@ -463,31 +462,35 @@ befs_destroy_inodecache(void)
* The data stream become link name. Unless the LONG_SYMLINK * The data stream become link name. Unless the LONG_SYMLINK
* flag is set. * flag is set.
*/ */
static const char * static int befs_symlink_readpage(struct file *unused, struct page *page)
befs_follow_link(struct dentry *dentry, void **cookie)
{ {
struct super_block *sb = dentry->d_sb; struct inode *inode = page->mapping->host;
struct befs_inode_info *befs_ino = BEFS_I(d_inode(dentry)); struct super_block *sb = inode->i_sb;
struct befs_inode_info *befs_ino = BEFS_I(inode);
befs_data_stream *data = &befs_ino->i_data.ds; befs_data_stream *data = &befs_ino->i_data.ds;
befs_off_t len = data->size; befs_off_t len = data->size;
char *link; char *link = kmap(page);
if (len == 0) { if (len == 0 || len > PAGE_SIZE) {
befs_error(sb, "Long symlink with illegal length"); befs_error(sb, "Long symlink with illegal length");
return ERR_PTR(-EIO); goto fail;
} }
befs_debug(sb, "Follow long symlink"); befs_debug(sb, "Follow long symlink");
link = kmalloc(len, GFP_NOFS);
if (!link)
return ERR_PTR(-ENOMEM);
if (befs_read_lsymlink(sb, data, link, len) != len) { if (befs_read_lsymlink(sb, data, link, len) != len) {
kfree(link);
befs_error(sb, "Failed to read entire long symlink"); befs_error(sb, "Failed to read entire long symlink");
return ERR_PTR(-EIO); goto fail;
} }
link[len - 1] = '\0'; link[len - 1] = '\0';
return *cookie = link; SetPageUptodate(page);
kunmap(page);
unlock_page(page);
return 0;
fail:
SetPageError(page);
kunmap(page);
unlock_page(page);
return -EIO;
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册