Commit 256a453546f1cf2c29a639c79fe0d603761a8e25
Committed by
Theodore Ts'o
1 parent
42007efd56
Exists in
master
and in
7 other branches
ext4: symlink must be handled via filesystem specific operation
generic setattr implementation is no longer responsible for quota transfer so synlinks must be handled via ext4_setattr. Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Showing 1 changed file with 2 additions and 0 deletions Inline Diff
fs/ext4/symlink.c
1 | /* | 1 | /* |
2 | * linux/fs/ext4/symlink.c | 2 | * linux/fs/ext4/symlink.c |
3 | * | 3 | * |
4 | * Only fast symlinks left here - the rest is done by generic code. AV, 1999 | 4 | * Only fast symlinks left here - the rest is done by generic code. AV, 1999 |
5 | * | 5 | * |
6 | * Copyright (C) 1992, 1993, 1994, 1995 | 6 | * Copyright (C) 1992, 1993, 1994, 1995 |
7 | * Remy Card (card@masi.ibp.fr) | 7 | * Remy Card (card@masi.ibp.fr) |
8 | * Laboratoire MASI - Institut Blaise Pascal | 8 | * Laboratoire MASI - Institut Blaise Pascal |
9 | * Universite Pierre et Marie Curie (Paris VI) | 9 | * Universite Pierre et Marie Curie (Paris VI) |
10 | * | 10 | * |
11 | * from | 11 | * from |
12 | * | 12 | * |
13 | * linux/fs/minix/symlink.c | 13 | * linux/fs/minix/symlink.c |
14 | * | 14 | * |
15 | * Copyright (C) 1991, 1992 Linus Torvalds | 15 | * Copyright (C) 1991, 1992 Linus Torvalds |
16 | * | 16 | * |
17 | * ext4 symlink handling code | 17 | * ext4 symlink handling code |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
21 | #include <linux/jbd2.h> | 21 | #include <linux/jbd2.h> |
22 | #include <linux/namei.h> | 22 | #include <linux/namei.h> |
23 | #include "ext4.h" | 23 | #include "ext4.h" |
24 | #include "xattr.h" | 24 | #include "xattr.h" |
25 | 25 | ||
26 | static void *ext4_follow_link(struct dentry *dentry, struct nameidata *nd) | 26 | static void *ext4_follow_link(struct dentry *dentry, struct nameidata *nd) |
27 | { | 27 | { |
28 | struct ext4_inode_info *ei = EXT4_I(dentry->d_inode); | 28 | struct ext4_inode_info *ei = EXT4_I(dentry->d_inode); |
29 | nd_set_link(nd, (char *) ei->i_data); | 29 | nd_set_link(nd, (char *) ei->i_data); |
30 | return NULL; | 30 | return NULL; |
31 | } | 31 | } |
32 | 32 | ||
33 | const struct inode_operations ext4_symlink_inode_operations = { | 33 | const struct inode_operations ext4_symlink_inode_operations = { |
34 | .readlink = generic_readlink, | 34 | .readlink = generic_readlink, |
35 | .follow_link = page_follow_link_light, | 35 | .follow_link = page_follow_link_light, |
36 | .put_link = page_put_link, | 36 | .put_link = page_put_link, |
37 | .setattr = ext4_setattr, | ||
37 | #ifdef CONFIG_EXT4_FS_XATTR | 38 | #ifdef CONFIG_EXT4_FS_XATTR |
38 | .setxattr = generic_setxattr, | 39 | .setxattr = generic_setxattr, |
39 | .getxattr = generic_getxattr, | 40 | .getxattr = generic_getxattr, |
40 | .listxattr = ext4_listxattr, | 41 | .listxattr = ext4_listxattr, |
41 | .removexattr = generic_removexattr, | 42 | .removexattr = generic_removexattr, |
42 | #endif | 43 | #endif |
43 | }; | 44 | }; |
44 | 45 | ||
45 | const struct inode_operations ext4_fast_symlink_inode_operations = { | 46 | const struct inode_operations ext4_fast_symlink_inode_operations = { |
46 | .readlink = generic_readlink, | 47 | .readlink = generic_readlink, |
47 | .follow_link = ext4_follow_link, | 48 | .follow_link = ext4_follow_link, |
49 | .setattr = ext4_setattr, | ||
48 | #ifdef CONFIG_EXT4_FS_XATTR | 50 | #ifdef CONFIG_EXT4_FS_XATTR |
49 | .setxattr = generic_setxattr, | 51 | .setxattr = generic_setxattr, |
50 | .getxattr = generic_getxattr, | 52 | .getxattr = generic_getxattr, |
51 | .listxattr = ext4_listxattr, | 53 | .listxattr = ext4_listxattr, |
52 | .removexattr = generic_removexattr, | 54 | .removexattr = generic_removexattr, |
53 | #endif | 55 | #endif |
54 | }; | 56 | }; |
55 | 57 |