diff options
Diffstat (limited to 'mm/shmem.c')
-rw-r--r-- | mm/shmem.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/mm/shmem.c b/mm/shmem.c index 0605716aee06..bab9041b1967 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -2496,8 +2496,15 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s | |||
2496 | return 0; | 2496 | return 0; |
2497 | } | 2497 | } |
2498 | 2498 | ||
2499 | static void shmem_put_link(void *arg) | ||
2500 | { | ||
2501 | mark_page_accessed(arg); | ||
2502 | put_page(arg); | ||
2503 | } | ||
2504 | |||
2499 | static const char *shmem_get_link(struct dentry *dentry, | 2505 | static const char *shmem_get_link(struct dentry *dentry, |
2500 | struct inode *inode, void **cookie) | 2506 | struct inode *inode, |
2507 | struct delayed_call *done) | ||
2501 | { | 2508 | { |
2502 | struct page *page = NULL; | 2509 | struct page *page = NULL; |
2503 | int error; | 2510 | int error; |
@@ -2515,17 +2522,10 @@ static const char *shmem_get_link(struct dentry *dentry, | |||
2515 | return ERR_PTR(error); | 2522 | return ERR_PTR(error); |
2516 | unlock_page(page); | 2523 | unlock_page(page); |
2517 | } | 2524 | } |
2518 | *cookie = page; | 2525 | set_delayed_call(done, shmem_put_link, page); |
2519 | return page_address(page); | 2526 | return page_address(page); |
2520 | } | 2527 | } |
2521 | 2528 | ||
2522 | static void shmem_put_link(struct inode *unused, void *cookie) | ||
2523 | { | ||
2524 | struct page *page = cookie; | ||
2525 | mark_page_accessed(page); | ||
2526 | page_cache_release(page); | ||
2527 | } | ||
2528 | |||
2529 | #ifdef CONFIG_TMPFS_XATTR | 2529 | #ifdef CONFIG_TMPFS_XATTR |
2530 | /* | 2530 | /* |
2531 | * Superblocks without xattr inode operations may get some security.* xattr | 2531 | * Superblocks without xattr inode operations may get some security.* xattr |
@@ -2680,7 +2680,6 @@ static const struct inode_operations shmem_short_symlink_operations = { | |||
2680 | static const struct inode_operations shmem_symlink_inode_operations = { | 2680 | static const struct inode_operations shmem_symlink_inode_operations = { |
2681 | .readlink = generic_readlink, | 2681 | .readlink = generic_readlink, |
2682 | .get_link = shmem_get_link, | 2682 | .get_link = shmem_get_link, |
2683 | .put_link = shmem_put_link, | ||
2684 | #ifdef CONFIG_TMPFS_XATTR | 2683 | #ifdef CONFIG_TMPFS_XATTR |
2685 | .setxattr = shmem_setxattr, | 2684 | .setxattr = shmem_setxattr, |
2686 | .getxattr = shmem_getxattr, | 2685 | .getxattr = shmem_getxattr, |