aboutsummaryrefslogtreecommitdiffstats
path: root/fs/reiserfs/xattr.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/reiserfs/xattr.c')
-rw-r--r--fs/reiserfs/xattr.c19
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 */ 979static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd)
980static int
981xattr_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
992static const struct dentry_operations xattr_lookup_poison_ops = { 984static const struct dentry_operations xattr_lookup_poison_ops = {
993 .d_compare = xattr_lookup_poison, 985 .d_revalidate = xattr_hide_revalidate,
994}; 986};
995 987
996int reiserfs_lookup_privroot(struct super_block *s) 988int 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