diff options
Diffstat (limited to 'fs/reiserfs/xattr.c')
-rw-r--r-- | fs/reiserfs/xattr.c | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index 75f4c0bf0506..1347e9f32c52 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c | |||
@@ -557,7 +557,7 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th, | |||
557 | if (!err && new_size < i_size_read(dentry->d_inode)) { | 557 | if (!err && new_size < i_size_read(dentry->d_inode)) { |
558 | struct iattr newattrs = { | 558 | struct iattr newattrs = { |
559 | .ia_ctime = current_fs_time(inode->i_sb), | 559 | .ia_ctime = current_fs_time(inode->i_sb), |
560 | .ia_size = buffer_size, | 560 | .ia_size = new_size, |
561 | .ia_valid = ATTR_SIZE | ATTR_CTIME, | 561 | .ia_valid = ATTR_SIZE | ATTR_CTIME, |
562 | }; | 562 | }; |
563 | 563 | ||
@@ -976,21 +976,13 @@ int reiserfs_permission(struct inode *inode, int mask) | |||
976 | return generic_permission(inode, mask, NULL); | 976 | return generic_permission(inode, mask, NULL); |
977 | } | 977 | } |
978 | 978 | ||
979 | /* This will catch lookups from the fs root to .reiserfs_priv */ | 979 | static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd) |
980 | static int | ||
981 | xattr_lookup_poison(struct dentry *dentry, struct qstr *q1, struct qstr *name) | ||
982 | { | 980 | { |
983 | struct dentry *priv_root = REISERFS_SB(dentry->d_sb)->priv_root; | 981 | return -EPERM; |
984 | if (container_of(q1, struct dentry, d_name) == priv_root) | ||
985 | return -ENOENT; | ||
986 | if (q1->len == name->len && | ||
987 | !memcmp(q1->name, name->name, name->len)) | ||
988 | return 0; | ||
989 | return 1; | ||
990 | } | 982 | } |
991 | 983 | ||
992 | static const struct dentry_operations xattr_lookup_poison_ops = { | 984 | static const struct dentry_operations xattr_lookup_poison_ops = { |
993 | .d_compare = xattr_lookup_poison, | 985 | .d_revalidate = xattr_hide_revalidate, |
994 | }; | 986 | }; |
995 | 987 | ||
996 | int reiserfs_lookup_privroot(struct super_block *s) | 988 | int reiserfs_lookup_privroot(struct super_block *s) |
@@ -1004,8 +996,7 @@ int reiserfs_lookup_privroot(struct super_block *s) | |||
1004 | strlen(PRIVROOT_NAME)); | 996 | strlen(PRIVROOT_NAME)); |
1005 | if (!IS_ERR(dentry)) { | 997 | if (!IS_ERR(dentry)) { |
1006 | REISERFS_SB(s)->priv_root = dentry; | 998 | REISERFS_SB(s)->priv_root = dentry; |
1007 | if (!reiserfs_expose_privroot(s)) | 999 | dentry->d_op = &xattr_lookup_poison_ops; |
1008 | s->s_root->d_op = &xattr_lookup_poison_ops; | ||
1009 | if (dentry->d_inode) | 1000 | if (dentry->d_inode) |
1010 | dentry->d_inode->i_flags |= S_PRIVATE; | 1001 | dentry->d_inode->i_flags |= S_PRIVATE; |
1011 | } else | 1002 | } else |