aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2016-04-11 00:48:00 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2016-04-11 00:48:00 -0400
commitce23e640133484eebc20ca7b7668388213e11327 (patch)
tree0b37de221fe6790396c3ae636bc56e5aacbcaf46
parentb296821a7c42fa58baa17513b2b7b30ae66f3336 (diff)
->getxattr(): pass dentry and inode as separate arguments
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--Documentation/filesystems/porting6
-rw-r--r--drivers/staging/lustre/lustre/llite/llite_internal.h4
-rw-r--r--drivers/staging/lustre/lustre/llite/xattr.c6
-rw-r--r--fs/bad_inode.c4
-rw-r--r--fs/ceph/super.h2
-rw-r--r--fs/ceph/xattr.c8
-rw-r--r--fs/cifs/cifsfs.h2
-rw-r--r--fs/cifs/xattr.c6
-rw-r--r--fs/ecryptfs/crypto.c5
-rw-r--r--fs/ecryptfs/ecryptfs_kernel.h4
-rw-r--r--fs/ecryptfs/inode.c23
-rw-r--r--fs/ecryptfs/mmap.c3
-rw-r--r--fs/fuse/dir.c5
-rw-r--r--fs/gfs2/inode.c9
-rw-r--r--fs/hfs/attr.c5
-rw-r--r--fs/hfs/hfs_fs.h4
-rw-r--r--fs/jfs/jfs_xattr.h2
-rw-r--r--fs/jfs/xattr.c8
-rw-r--r--fs/kernfs/inode.c6
-rw-r--r--fs/kernfs/kernfs-internal.h4
-rw-r--r--fs/libfs.c4
-rw-r--r--fs/overlayfs/inode.c4
-rw-r--r--fs/overlayfs/overlayfs.h4
-rw-r--r--fs/overlayfs/super.c2
-rw-r--r--fs/ubifs/ubifs.h4
-rw-r--r--fs/ubifs/xattr.c6
-rw-r--r--fs/xattr.c11
-rw-r--r--include/linux/fs.h3
-rw-r--r--include/linux/xattr.h2
-rw-r--r--net/socket.c2
-rw-r--r--security/commoncap.c6
-rw-r--r--security/integrity/evm/evm_main.c2
-rw-r--r--security/selinux/hooks.c9
-rw-r--r--security/smack/smack_lsm.c4
34 files changed, 94 insertions, 85 deletions
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting
index f1b87d8aa2da..57bb3754a027 100644
--- a/Documentation/filesystems/porting
+++ b/Documentation/filesystems/porting
@@ -525,3 +525,9 @@ in your dentry operations instead.
525 set_delayed_call() where it used to set *cookie. 525 set_delayed_call() where it used to set *cookie.
526 ->put_link() is gone - just give the destructor to set_delayed_call() 526 ->put_link() is gone - just give the destructor to set_delayed_call()
527 in ->get_link(). 527 in ->get_link().
528--
529[mandatory]
530 ->getxattr() and xattr_handler.get() get dentry and inode passed separately.
531 dentry might be yet to be attached to inode, so do _not_ use its ->d_inode
532 in the instances. Rationale: !@#!@# security_d_instantiate() needs to be
533 called before we attach dentry to inode.
diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h
index 3e1572cb457b..d28efd27af57 100644
--- a/drivers/staging/lustre/lustre/llite/llite_internal.h
+++ b/drivers/staging/lustre/lustre/llite/llite_internal.h
@@ -1042,8 +1042,8 @@ static inline __u64 ll_file_maxbytes(struct inode *inode)
1042/* llite/xattr.c */ 1042/* llite/xattr.c */
1043int ll_setxattr(struct dentry *dentry, const char *name, 1043int ll_setxattr(struct dentry *dentry, const char *name,
1044 const void *value, size_t size, int flags); 1044 const void *value, size_t size, int flags);
1045ssize_t ll_getxattr(struct dentry *dentry, const char *name, 1045ssize_t ll_getxattr(struct dentry *dentry, struct inode *inode,
1046 void *buffer, size_t size); 1046 const char *name, void *buffer, size_t size);
1047ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size); 1047ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size);
1048int ll_removexattr(struct dentry *dentry, const char *name); 1048int ll_removexattr(struct dentry *dentry, const char *name);
1049 1049
diff --git a/drivers/staging/lustre/lustre/llite/xattr.c b/drivers/staging/lustre/lustre/llite/xattr.c
index b68dcc921ca2..c671f221c28c 100644
--- a/drivers/staging/lustre/lustre/llite/xattr.c
+++ b/drivers/staging/lustre/lustre/llite/xattr.c
@@ -451,11 +451,9 @@ out:
451 return rc; 451 return rc;
452} 452}
453 453
454ssize_t ll_getxattr(struct dentry *dentry, const char *name, 454ssize_t ll_getxattr(struct dentry *dentry, struct inode *inode,
455 void *buffer, size_t size) 455 const char *name, void *buffer, size_t size)
456{ 456{
457 struct inode *inode = d_inode(dentry);
458
459 LASSERT(inode); 457 LASSERT(inode);
460 LASSERT(name); 458 LASSERT(name);
461 459
diff --git a/fs/bad_inode.c b/fs/bad_inode.c
index 103f5d7c3083..72e35b721608 100644
--- a/fs/bad_inode.c
+++ b/fs/bad_inode.c
@@ -106,8 +106,8 @@ static int bad_inode_setxattr(struct dentry *dentry, const char *name,
106 return -EIO; 106 return -EIO;
107} 107}
108 108
109static ssize_t bad_inode_getxattr(struct dentry *dentry, const char *name, 109static ssize_t bad_inode_getxattr(struct dentry *dentry, struct inode *inode,
110 void *buffer, size_t size) 110 const char *name, void *buffer, size_t size)
111{ 111{
112 return -EIO; 112 return -EIO;
113} 113}
diff --git a/fs/ceph/super.h b/fs/ceph/super.h
index e705c4d612d7..beb893bb234f 100644
--- a/fs/ceph/super.h
+++ b/fs/ceph/super.h
@@ -795,7 +795,7 @@ extern int ceph_setxattr(struct dentry *, const char *, const void *,
795int __ceph_setxattr(struct dentry *, const char *, const void *, size_t, int); 795int __ceph_setxattr(struct dentry *, const char *, const void *, size_t, int);
796ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t); 796ssize_t __ceph_getxattr(struct inode *, const char *, void *, size_t);
797int __ceph_removexattr(struct dentry *, const char *); 797int __ceph_removexattr(struct dentry *, const char *);
798extern ssize_t ceph_getxattr(struct dentry *, const char *, void *, size_t); 798extern ssize_t ceph_getxattr(struct dentry *, struct inode *, const char *, void *, size_t);
799extern ssize_t ceph_listxattr(struct dentry *, char *, size_t); 799extern ssize_t ceph_listxattr(struct dentry *, char *, size_t);
800extern int ceph_removexattr(struct dentry *, const char *); 800extern int ceph_removexattr(struct dentry *, const char *);
801extern void __ceph_build_xattrs_blob(struct ceph_inode_info *ci); 801extern void __ceph_build_xattrs_blob(struct ceph_inode_info *ci);
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c
index 9410abdef3ce..c6e917d360f7 100644
--- a/fs/ceph/xattr.c
+++ b/fs/ceph/xattr.c
@@ -804,13 +804,13 @@ out:
804 return err; 804 return err;
805} 805}
806 806
807ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, 807ssize_t ceph_getxattr(struct dentry *dentry, struct inode *inode,
808 size_t size) 808 const char *name, void *value, size_t size)
809{ 809{
810 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) 810 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
811 return generic_getxattr(dentry, name, value, size); 811 return generic_getxattr(dentry, inode, name, value, size);
812 812
813 return __ceph_getxattr(d_inode(dentry), name, value, size); 813 return __ceph_getxattr(inode, name, value, size);
814} 814}
815 815
816ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) 816ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size)
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h
index 83aac8ba50b0..c89ecd7a5c39 100644
--- a/fs/cifs/cifsfs.h
+++ b/fs/cifs/cifsfs.h
@@ -123,7 +123,7 @@ extern int cifs_symlink(struct inode *inode, struct dentry *direntry,
123extern int cifs_removexattr(struct dentry *, const char *); 123extern int cifs_removexattr(struct dentry *, const char *);
124extern int cifs_setxattr(struct dentry *, const char *, const void *, 124extern int cifs_setxattr(struct dentry *, const char *, const void *,
125 size_t, int); 125 size_t, int);
126extern ssize_t cifs_getxattr(struct dentry *, const char *, void *, size_t); 126extern ssize_t cifs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t);
127extern ssize_t cifs_listxattr(struct dentry *, char *, size_t); 127extern ssize_t cifs_listxattr(struct dentry *, char *, size_t);
128extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); 128extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
129#ifdef CONFIG_CIFS_NFSD_EXPORT 129#ifdef CONFIG_CIFS_NFSD_EXPORT
diff --git a/fs/cifs/xattr.c b/fs/cifs/xattr.c
index 159547c8a40b..5d57c85703a9 100644
--- a/fs/cifs/xattr.c
+++ b/fs/cifs/xattr.c
@@ -213,8 +213,8 @@ set_ea_exit:
213 return rc; 213 return rc;
214} 214}
215 215
216ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, 216ssize_t cifs_getxattr(struct dentry *direntry, struct inode *inode,
217 void *ea_value, size_t buf_size) 217 const char *ea_name, void *ea_value, size_t buf_size)
218{ 218{
219 ssize_t rc = -EOPNOTSUPP; 219 ssize_t rc = -EOPNOTSUPP;
220#ifdef CONFIG_CIFS_XATTR 220#ifdef CONFIG_CIFS_XATTR
@@ -296,7 +296,7 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name,
296 goto get_ea_exit; /* rc already EOPNOTSUPP */ 296 goto get_ea_exit; /* rc already EOPNOTSUPP */
297 297
298 pacl = pTcon->ses->server->ops->get_acl(cifs_sb, 298 pacl = pTcon->ses->server->ops->get_acl(cifs_sb,
299 d_inode(direntry), full_path, &acllen); 299 inode, full_path, &acllen);
300 if (IS_ERR(pacl)) { 300 if (IS_ERR(pacl)) {
301 rc = PTR_ERR(pacl); 301 rc = PTR_ERR(pacl);
302 cifs_dbg(VFS, "%s: error %zd getting sec desc\n", 302 cifs_dbg(VFS, "%s: error %zd getting sec desc\n",
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index 64026e53722a..543a146ee019 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -1369,7 +1369,9 @@ int ecryptfs_read_xattr_region(char *page_virt, struct inode *ecryptfs_inode)
1369 ssize_t size; 1369 ssize_t size;
1370 int rc = 0; 1370 int rc = 0;
1371 1371
1372 size = ecryptfs_getxattr_lower(lower_dentry, ECRYPTFS_XATTR_NAME, 1372 size = ecryptfs_getxattr_lower(lower_dentry,
1373 ecryptfs_inode_to_lower(ecryptfs_inode),
1374 ECRYPTFS_XATTR_NAME,
1373 page_virt, ECRYPTFS_DEFAULT_EXTENT_SIZE); 1375 page_virt, ECRYPTFS_DEFAULT_EXTENT_SIZE);
1374 if (size < 0) { 1376 if (size < 0) {
1375 if (unlikely(ecryptfs_verbosity > 0)) 1377 if (unlikely(ecryptfs_verbosity > 0))
@@ -1391,6 +1393,7 @@ int ecryptfs_read_and_validate_xattr_region(struct dentry *dentry,
1391 int rc; 1393 int rc;
1392 1394
1393 rc = ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), 1395 rc = ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry),
1396 ecryptfs_inode_to_lower(inode),
1394 ECRYPTFS_XATTR_NAME, file_size, 1397 ECRYPTFS_XATTR_NAME, file_size,
1395 ECRYPTFS_SIZE_AND_MARKER_BYTES); 1398 ECRYPTFS_SIZE_AND_MARKER_BYTES);
1396 if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) 1399 if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES)
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h
index d123fbaa28e0..6ff907f73331 100644
--- a/fs/ecryptfs/ecryptfs_kernel.h
+++ b/fs/ecryptfs/ecryptfs_kernel.h
@@ -607,8 +607,8 @@ ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,
607 unsigned char *src, struct dentry *ecryptfs_dentry); 607 unsigned char *src, struct dentry *ecryptfs_dentry);
608int ecryptfs_truncate(struct dentry *dentry, loff_t new_length); 608int ecryptfs_truncate(struct dentry *dentry, loff_t new_length);
609ssize_t 609ssize_t
610ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, 610ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode,
611 void *value, size_t size); 611 const char *name, void *value, size_t size);
612int 612int
613ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, 613ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
614 size_t size, int flags); 614 size_t size, int flags);
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index 121114e9a464..1ac631cd9d84 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -1033,29 +1033,30 @@ out:
1033} 1033}
1034 1034
1035ssize_t 1035ssize_t
1036ecryptfs_getxattr_lower(struct dentry *lower_dentry, const char *name, 1036ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode,
1037 void *value, size_t size) 1037 const char *name, void *value, size_t size)
1038{ 1038{
1039 int rc = 0; 1039 int rc = 0;
1040 1040
1041 if (!d_inode(lower_dentry)->i_op->getxattr) { 1041 if (!lower_inode->i_op->getxattr) {
1042 rc = -EOPNOTSUPP; 1042 rc = -EOPNOTSUPP;
1043 goto out; 1043 goto out;
1044 } 1044 }
1045 inode_lock(d_inode(lower_dentry)); 1045 inode_lock(lower_inode);
1046 rc = d_inode(lower_dentry)->i_op->getxattr(lower_dentry, name, value, 1046 rc = lower_inode->i_op->getxattr(lower_dentry, lower_inode,
1047 size); 1047 name, value, size);
1048 inode_unlock(d_inode(lower_dentry)); 1048 inode_unlock(lower_inode);
1049out: 1049out:
1050 return rc; 1050 return rc;
1051} 1051}
1052 1052
1053static ssize_t 1053static ssize_t
1054ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value, 1054ecryptfs_getxattr(struct dentry *dentry, struct inode *inode,
1055 size_t size) 1055 const char *name, void *value, size_t size)
1056{ 1056{
1057 return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry), name, 1057 return ecryptfs_getxattr_lower(ecryptfs_dentry_to_lower(dentry),
1058 value, size); 1058 ecryptfs_inode_to_lower(inode),
1059 name, value, size);
1059} 1060}
1060 1061
1061static ssize_t 1062static ssize_t
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c
index 1f5865263b3e..39e4381d3a65 100644
--- a/fs/ecryptfs/mmap.c
+++ b/fs/ecryptfs/mmap.c
@@ -436,7 +436,8 @@ static int ecryptfs_write_inode_size_to_xattr(struct inode *ecryptfs_inode)
436 goto out; 436 goto out;
437 } 437 }
438 inode_lock(lower_inode); 438 inode_lock(lower_inode);
439 size = lower_inode->i_op->getxattr(lower_dentry, ECRYPTFS_XATTR_NAME, 439 size = lower_inode->i_op->getxattr(lower_dentry, lower_inode,
440 ECRYPTFS_XATTR_NAME,
440 xattr_virt, PAGE_CACHE_SIZE); 441 xattr_virt, PAGE_CACHE_SIZE);
441 if (size < 0) 442 if (size < 0)
442 size = 8; 443 size = 8;
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 4b855b65d457..b618527c05c6 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -1759,10 +1759,9 @@ static int fuse_setxattr(struct dentry *entry, const char *name,
1759 return err; 1759 return err;
1760} 1760}
1761 1761
1762static ssize_t fuse_getxattr(struct dentry *entry, const char *name, 1762static ssize_t fuse_getxattr(struct dentry *entry, struct inode *inode,
1763 void *value, size_t size) 1763 const char *name, void *value, size_t size)
1764{ 1764{
1765 struct inode *inode = d_inode(entry);
1766 struct fuse_conn *fc = get_fuse_conn(inode); 1765 struct fuse_conn *fc = get_fuse_conn(inode);
1767 FUSE_ARGS(args); 1766 FUSE_ARGS(args);
1768 struct fuse_getxattr_in inarg; 1767 struct fuse_getxattr_in inarg;
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index bb30f9a72c65..45f516cada78 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -1968,22 +1968,21 @@ static int gfs2_setxattr(struct dentry *dentry, const char *name,
1968 return ret; 1968 return ret;
1969} 1969}
1970 1970
1971static ssize_t gfs2_getxattr(struct dentry *dentry, const char *name, 1971static ssize_t gfs2_getxattr(struct dentry *dentry, struct inode *inode,
1972 void *data, size_t size) 1972 const char *name, void *data, size_t size)
1973{ 1973{
1974 struct inode *inode = d_inode(dentry);
1975 struct gfs2_inode *ip = GFS2_I(inode); 1974 struct gfs2_inode *ip = GFS2_I(inode);
1976 struct gfs2_holder gh; 1975 struct gfs2_holder gh;
1977 int ret; 1976 int ret;
1978 1977
1979 /* For selinux during lookup */ 1978 /* For selinux during lookup */
1980 if (gfs2_glock_is_locked_by_me(ip->i_gl)) 1979 if (gfs2_glock_is_locked_by_me(ip->i_gl))
1981 return generic_getxattr(dentry, name, data, size); 1980 return generic_getxattr(dentry, inode, name, data, size);
1982 1981
1983 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh); 1982 gfs2_holder_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY, &gh);
1984 ret = gfs2_glock_nq(&gh); 1983 ret = gfs2_glock_nq(&gh);
1985 if (ret == 0) { 1984 if (ret == 0) {
1986 ret = generic_getxattr(dentry, name, data, size); 1985 ret = generic_getxattr(dentry, inode, name, data, size);
1987 gfs2_glock_dq(&gh); 1986 gfs2_glock_dq(&gh);
1988 } 1987 }
1989 gfs2_holder_uninit(&gh); 1988 gfs2_holder_uninit(&gh);
diff --git a/fs/hfs/attr.c b/fs/hfs/attr.c
index 8d931b157bbe..064f92f17efc 100644
--- a/fs/hfs/attr.c
+++ b/fs/hfs/attr.c
@@ -56,10 +56,9 @@ out:
56 return res; 56 return res;
57} 57}
58 58
59ssize_t hfs_getxattr(struct dentry *dentry, const char *name, 59ssize_t hfs_getxattr(struct dentry *unused, struct inode *inode,
60 void *value, size_t size) 60 const char *name, void *value, size_t size)
61{ 61{
62 struct inode *inode = d_inode(dentry);
63 struct hfs_find_data fd; 62 struct hfs_find_data fd;
64 hfs_cat_rec rec; 63 hfs_cat_rec rec;
65 struct hfs_cat_file *file; 64 struct hfs_cat_file *file;
diff --git a/fs/hfs/hfs_fs.h b/fs/hfs/hfs_fs.h
index 1f1c7dcbcc2f..79daa097929a 100644
--- a/fs/hfs/hfs_fs.h
+++ b/fs/hfs/hfs_fs.h
@@ -213,8 +213,8 @@ extern void hfs_delete_inode(struct inode *);
213/* attr.c */ 213/* attr.c */
214extern int hfs_setxattr(struct dentry *dentry, const char *name, 214extern int hfs_setxattr(struct dentry *dentry, const char *name,
215 const void *value, size_t size, int flags); 215 const void *value, size_t size, int flags);
216extern ssize_t hfs_getxattr(struct dentry *dentry, const char *name, 216extern ssize_t hfs_getxattr(struct dentry *dentry, struct inode *inode,
217 void *value, size_t size); 217 const char *name, void *value, size_t size);
218extern ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size); 218extern ssize_t hfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
219 219
220/* mdb.c */ 220/* mdb.c */
diff --git a/fs/jfs/jfs_xattr.h b/fs/jfs/jfs_xattr.h
index e8d717dabca3..e69e14f3777b 100644
--- a/fs/jfs/jfs_xattr.h
+++ b/fs/jfs/jfs_xattr.h
@@ -57,7 +57,7 @@ extern int __jfs_setxattr(tid_t, struct inode *, const char *, const void *,
57extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, 57extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t,
58 int); 58 int);
59extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); 59extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t);
60extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); 60extern ssize_t jfs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t);
61extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); 61extern ssize_t jfs_listxattr(struct dentry *, char *, size_t);
62extern int jfs_removexattr(struct dentry *, const char *); 62extern int jfs_removexattr(struct dentry *, const char *);
63 63
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c
index 48b15a6e5558..5becc6a3ff8c 100644
--- a/fs/jfs/xattr.c
+++ b/fs/jfs/xattr.c
@@ -933,8 +933,8 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
933 return size; 933 return size;
934} 934}
935 935
936ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data, 936ssize_t jfs_getxattr(struct dentry *dentry, struct inode *inode,
937 size_t buf_size) 937 const char *name, void *data, size_t buf_size)
938{ 938{
939 int err; 939 int err;
940 940
@@ -944,7 +944,7 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
944 * for it via sb->s_xattr. 944 * for it via sb->s_xattr.
945 */ 945 */
946 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) 946 if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
947 return generic_getxattr(dentry, name, data, buf_size); 947 return generic_getxattr(dentry, inode, name, data, buf_size);
948 948
949 if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) { 949 if (strncmp(name, XATTR_OS2_PREFIX, XATTR_OS2_PREFIX_LEN) == 0) {
950 /* 950 /*
@@ -959,7 +959,7 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
959 return -EOPNOTSUPP; 959 return -EOPNOTSUPP;
960 } 960 }
961 961
962 err = __jfs_getxattr(d_inode(dentry), name, data, buf_size); 962 err = __jfs_getxattr(inode, name, data, buf_size);
963 963
964 return err; 964 return err;
965} 965}
diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c
index 16405ae88d2d..b5247226732b 100644
--- a/fs/kernfs/inode.c
+++ b/fs/kernfs/inode.c
@@ -208,10 +208,10 @@ int kernfs_iop_removexattr(struct dentry *dentry, const char *name)
208 return simple_xattr_set(&attrs->xattrs, name, NULL, 0, XATTR_REPLACE); 208 return simple_xattr_set(&attrs->xattrs, name, NULL, 0, XATTR_REPLACE);
209} 209}
210 210
211ssize_t kernfs_iop_getxattr(struct dentry *dentry, const char *name, void *buf, 211ssize_t kernfs_iop_getxattr(struct dentry *unused, struct inode *inode,
212 size_t size) 212 const char *name, void *buf, size_t size)
213{ 213{
214 struct kernfs_node *kn = dentry->d_fsdata; 214 struct kernfs_node *kn = inode->i_private;
215 struct kernfs_iattrs *attrs; 215 struct kernfs_iattrs *attrs;
216 216
217 attrs = kernfs_iattrs(kn); 217 attrs = kernfs_iattrs(kn);
diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h
index 6762bfbd8207..45c9192c276e 100644
--- a/fs/kernfs/kernfs-internal.h
+++ b/fs/kernfs/kernfs-internal.h
@@ -84,8 +84,8 @@ int kernfs_iop_getattr(struct vfsmount *mnt, struct dentry *dentry,
84int kernfs_iop_setxattr(struct dentry *dentry, const char *name, const void *value, 84int kernfs_iop_setxattr(struct dentry *dentry, const char *name, const void *value,
85 size_t size, int flags); 85 size_t size, int flags);
86int kernfs_iop_removexattr(struct dentry *dentry, const char *name); 86int kernfs_iop_removexattr(struct dentry *dentry, const char *name);
87ssize_t kernfs_iop_getxattr(struct dentry *dentry, const char *name, void *buf, 87ssize_t kernfs_iop_getxattr(struct dentry *dentry, struct inode *inode,
88 size_t size); 88 const char *name, void *buf, size_t size);
89ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size); 89ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size);
90 90
91/* 91/*
diff --git a/fs/libfs.c b/fs/libfs.c
index 0ca80b2af420..03332f4bdedf 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1127,8 +1127,8 @@ static int empty_dir_setxattr(struct dentry *dentry, const char *name,
1127 return -EOPNOTSUPP; 1127 return -EOPNOTSUPP;
1128} 1128}
1129 1129
1130static ssize_t empty_dir_getxattr(struct dentry *dentry, const char *name, 1130static ssize_t empty_dir_getxattr(struct dentry *dentry, struct inode *inode,
1131 void *value, size_t size) 1131 const char *name, void *value, size_t size)
1132{ 1132{
1133 return -EOPNOTSUPP; 1133 return -EOPNOTSUPP;
1134} 1134}
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index a4ff5d0d7db9..c7b31a03dc9c 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -246,8 +246,8 @@ static bool ovl_need_xattr_filter(struct dentry *dentry,
246 return false; 246 return false;
247} 247}
248 248
249ssize_t ovl_getxattr(struct dentry *dentry, const char *name, 249ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode,
250 void *value, size_t size) 250 const char *name, void *value, size_t size)
251{ 251{
252 struct path realpath; 252 struct path realpath;
253 enum ovl_path_type type = ovl_path_real(dentry, &realpath); 253 enum ovl_path_type type = ovl_path_real(dentry, &realpath);
diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
index 6a7090f4a441..99ec4b035237 100644
--- a/fs/overlayfs/overlayfs.h
+++ b/fs/overlayfs/overlayfs.h
@@ -173,8 +173,8 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr);
173int ovl_permission(struct inode *inode, int mask); 173int ovl_permission(struct inode *inode, int mask);
174int ovl_setxattr(struct dentry *dentry, const char *name, 174int ovl_setxattr(struct dentry *dentry, const char *name,
175 const void *value, size_t size, int flags); 175 const void *value, size_t size, int flags);
176ssize_t ovl_getxattr(struct dentry *dentry, const char *name, 176ssize_t ovl_getxattr(struct dentry *dentry, struct inode *inode,
177 void *value, size_t size); 177 const char *name, void *value, size_t size);
178ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size); 178ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
179int ovl_removexattr(struct dentry *dentry, const char *name); 179int ovl_removexattr(struct dentry *dentry, const char *name);
180struct inode *ovl_d_select_inode(struct dentry *dentry, unsigned file_flags); 180struct inode *ovl_d_select_inode(struct dentry *dentry, unsigned file_flags);
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index ef64984c9bbc..14cab381cece 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -274,7 +274,7 @@ static bool ovl_is_opaquedir(struct dentry *dentry)
274 if (!S_ISDIR(inode->i_mode) || !inode->i_op->getxattr) 274 if (!S_ISDIR(inode->i_mode) || !inode->i_op->getxattr)
275 return false; 275 return false;
276 276
277 res = inode->i_op->getxattr(dentry, OVL_XATTR_OPAQUE, &val, 1); 277 res = inode->i_op->getxattr(dentry, inode, OVL_XATTR_OPAQUE, &val, 1);
278 if (res == 1 && val == 'y') 278 if (res == 1 && val == 'y')
279 return true; 279 return true;
280 280
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
index c2a57e193a81..536fb495f2f1 100644
--- a/fs/ubifs/ubifs.h
+++ b/fs/ubifs/ubifs.h
@@ -1734,8 +1734,8 @@ int ubifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
1734/* xattr.c */ 1734/* xattr.c */
1735int ubifs_setxattr(struct dentry *dentry, const char *name, 1735int ubifs_setxattr(struct dentry *dentry, const char *name,
1736 const void *value, size_t size, int flags); 1736 const void *value, size_t size, int flags);
1737ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, 1737ssize_t ubifs_getxattr(struct dentry *dentry, struct inode *host,
1738 size_t size); 1738 const char *name, void *buf, size_t size);
1739ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size); 1739ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size);
1740int ubifs_removexattr(struct dentry *dentry, const char *name); 1740int ubifs_removexattr(struct dentry *dentry, const char *name);
1741int ubifs_init_security(struct inode *dentry, struct inode *inode, 1741int ubifs_init_security(struct inode *dentry, struct inode *inode,
diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c
index b043e044121d..413d650c9476 100644
--- a/fs/ubifs/xattr.c
+++ b/fs/ubifs/xattr.c
@@ -372,10 +372,10 @@ int ubifs_setxattr(struct dentry *dentry, const char *name,
372 return setxattr(d_inode(dentry), name, value, size, flags); 372 return setxattr(d_inode(dentry), name, value, size, flags);
373} 373}
374 374
375ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, 375ssize_t ubifs_getxattr(struct dentry *dentry, struct inode *host,
376 size_t size) 376 const char *name, void *buf, size_t size)
377{ 377{
378 struct inode *inode, *host = d_inode(dentry); 378 struct inode *inode;
379 struct ubifs_info *c = host->i_sb->s_fs_info; 379 struct ubifs_info *c = host->i_sb->s_fs_info;
380 struct qstr nm = QSTR_INIT(name, strlen(name)); 380 struct qstr nm = QSTR_INIT(name, strlen(name));
381 struct ubifs_inode *ui; 381 struct ubifs_inode *ui;
diff --git a/fs/xattr.c b/fs/xattr.c
index 461ba45b7da9..b11945e15fde 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -192,7 +192,7 @@ vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value,
192 if (!inode->i_op->getxattr) 192 if (!inode->i_op->getxattr)
193 return -EOPNOTSUPP; 193 return -EOPNOTSUPP;
194 194
195 error = inode->i_op->getxattr(dentry, name, NULL, 0); 195 error = inode->i_op->getxattr(dentry, inode, name, NULL, 0);
196 if (error < 0) 196 if (error < 0)
197 return error; 197 return error;
198 198
@@ -203,7 +203,7 @@ vfs_getxattr_alloc(struct dentry *dentry, const char *name, char **xattr_value,
203 memset(value, 0, error + 1); 203 memset(value, 0, error + 1);
204 } 204 }
205 205
206 error = inode->i_op->getxattr(dentry, name, value, error); 206 error = inode->i_op->getxattr(dentry, inode, name, value, error);
207 *xattr_value = value; 207 *xattr_value = value;
208 return error; 208 return error;
209} 209}
@@ -236,7 +236,7 @@ vfs_getxattr(struct dentry *dentry, const char *name, void *value, size_t size)
236 } 236 }
237nolsm: 237nolsm:
238 if (inode->i_op->getxattr) 238 if (inode->i_op->getxattr)
239 error = inode->i_op->getxattr(dentry, name, value, size); 239 error = inode->i_op->getxattr(dentry, inode, name, value, size);
240 else 240 else
241 error = -EOPNOTSUPP; 241 error = -EOPNOTSUPP;
242 242
@@ -691,14 +691,15 @@ xattr_resolve_name(const struct xattr_handler **handlers, const char **name)
691 * Find the handler for the prefix and dispatch its get() operation. 691 * Find the handler for the prefix and dispatch its get() operation.
692 */ 692 */
693ssize_t 693ssize_t
694generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size) 694generic_getxattr(struct dentry *dentry, struct inode *inode,
695 const char *name, void *buffer, size_t size)
695{ 696{
696 const struct xattr_handler *handler; 697 const struct xattr_handler *handler;
697 698
698 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name); 699 handler = xattr_resolve_name(dentry->d_sb->s_xattr, &name);
699 if (IS_ERR(handler)) 700 if (IS_ERR(handler))
700 return PTR_ERR(handler); 701 return PTR_ERR(handler);
701 return handler->get(handler, dentry, d_inode(dentry), 702 return handler->get(handler, dentry, inode,
702 name, buffer, size); 703 name, buffer, size);
703} 704}
704 705
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 329ed372d708..1b5fcaeea827 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1702,7 +1702,8 @@ struct inode_operations {
1702 int (*setattr) (struct dentry *, struct iattr *); 1702 int (*setattr) (struct dentry *, struct iattr *);
1703 int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); 1703 int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
1704 int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); 1704 int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
1705 ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); 1705 ssize_t (*getxattr) (struct dentry *, struct inode *,
1706 const char *, void *, size_t);
1706 ssize_t (*listxattr) (struct dentry *, char *, size_t); 1707 ssize_t (*listxattr) (struct dentry *, char *, size_t);
1707 int (*removexattr) (struct dentry *, const char *); 1708 int (*removexattr) (struct dentry *, const char *);
1708 int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, 1709 int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
diff --git a/include/linux/xattr.h b/include/linux/xattr.h
index c11c022298b9..1cc4c578deb9 100644
--- a/include/linux/xattr.h
+++ b/include/linux/xattr.h
@@ -52,7 +52,7 @@ int __vfs_setxattr_noperm(struct dentry *, const char *, const void *, size_t, i
52int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int); 52int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int);
53int vfs_removexattr(struct dentry *, const char *); 53int vfs_removexattr(struct dentry *, const char *);
54 54
55ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size); 55ssize_t generic_getxattr(struct dentry *dentry, struct inode *inode, const char *name, void *buffer, size_t size);
56ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); 56ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
57int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags); 57int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags);
58int generic_removexattr(struct dentry *dentry, const char *name); 58int generic_removexattr(struct dentry *dentry, const char *name);
diff --git a/net/socket.c b/net/socket.c
index 5f77a8e93830..35e4523edada 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -466,7 +466,7 @@ static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)
466#define XATTR_SOCKPROTONAME_SUFFIX "sockprotoname" 466#define XATTR_SOCKPROTONAME_SUFFIX "sockprotoname"
467#define XATTR_NAME_SOCKPROTONAME (XATTR_SYSTEM_PREFIX XATTR_SOCKPROTONAME_SUFFIX) 467#define XATTR_NAME_SOCKPROTONAME (XATTR_SYSTEM_PREFIX XATTR_SOCKPROTONAME_SUFFIX)
468#define XATTR_NAME_SOCKPROTONAME_LEN (sizeof(XATTR_NAME_SOCKPROTONAME)-1) 468#define XATTR_NAME_SOCKPROTONAME_LEN (sizeof(XATTR_NAME_SOCKPROTONAME)-1)
469static ssize_t sockfs_getxattr(struct dentry *dentry, 469static ssize_t sockfs_getxattr(struct dentry *dentry, struct inode *inode,
470 const char *name, void *value, size_t size) 470 const char *name, void *value, size_t size)
471{ 471{
472 const char *proto_name; 472 const char *proto_name;
diff --git a/security/commoncap.c b/security/commoncap.c
index 48071ed7c445..a042077312a5 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -313,7 +313,7 @@ int cap_inode_need_killpriv(struct dentry *dentry)
313 if (!inode->i_op->getxattr) 313 if (!inode->i_op->getxattr)
314 return 0; 314 return 0;
315 315
316 error = inode->i_op->getxattr(dentry, XATTR_NAME_CAPS, NULL, 0); 316 error = inode->i_op->getxattr(dentry, inode, XATTR_NAME_CAPS, NULL, 0);
317 if (error <= 0) 317 if (error <= 0)
318 return 0; 318 return 0;
319 return 1; 319 return 1;
@@ -397,8 +397,8 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data
397 if (!inode || !inode->i_op->getxattr) 397 if (!inode || !inode->i_op->getxattr)
398 return -ENODATA; 398 return -ENODATA;
399 399
400 size = inode->i_op->getxattr((struct dentry *)dentry, XATTR_NAME_CAPS, &caps, 400 size = inode->i_op->getxattr((struct dentry *)dentry, inode,
401 XATTR_CAPS_SZ); 401 XATTR_NAME_CAPS, &caps, XATTR_CAPS_SZ);
402 if (size == -ENODATA || size == -EOPNOTSUPP) 402 if (size == -ENODATA || size == -EOPNOTSUPP)
403 /* no data, that's ok */ 403 /* no data, that's ok */
404 return -ENODATA; 404 return -ENODATA;
diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c
index 84c6d11fc096..b9e26288d30c 100644
--- a/security/integrity/evm/evm_main.c
+++ b/security/integrity/evm/evm_main.c
@@ -82,7 +82,7 @@ static int evm_find_protected_xattrs(struct dentry *dentry)
82 return -EOPNOTSUPP; 82 return -EOPNOTSUPP;
83 83
84 for (xattr = evm_config_xattrnames; *xattr != NULL; xattr++) { 84 for (xattr = evm_config_xattrnames; *xattr != NULL; xattr++) {
85 error = inode->i_op->getxattr(dentry, *xattr, NULL, 0); 85 error = inode->i_op->getxattr(dentry, inode, *xattr, NULL, 0);
86 if (error < 0) { 86 if (error < 0) {
87 if (error == -ENODATA) 87 if (error == -ENODATA)
88 continue; 88 continue;
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 889cd59ca5a7..469f5c75bd4b 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -506,7 +506,8 @@ static int sb_finish_set_opts(struct super_block *sb)
506 rc = -EOPNOTSUPP; 506 rc = -EOPNOTSUPP;
507 goto out; 507 goto out;
508 } 508 }
509 rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0); 509 rc = root_inode->i_op->getxattr(root, root_inode,
510 XATTR_NAME_SELINUX, NULL, 0);
510 if (rc < 0 && rc != -ENODATA) { 511 if (rc < 0 && rc != -ENODATA) {
511 if (rc == -EOPNOTSUPP) 512 if (rc == -EOPNOTSUPP)
512 printk(KERN_WARNING "SELinux: (dev %s, type " 513 printk(KERN_WARNING "SELinux: (dev %s, type "
@@ -1412,13 +1413,13 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent
1412 goto out_unlock; 1413 goto out_unlock;
1413 } 1414 }
1414 context[len] = '\0'; 1415 context[len] = '\0';
1415 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, 1416 rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX,
1416 context, len); 1417 context, len);
1417 if (rc == -ERANGE) { 1418 if (rc == -ERANGE) {
1418 kfree(context); 1419 kfree(context);
1419 1420
1420 /* Need a larger buffer. Query for the right size. */ 1421 /* Need a larger buffer. Query for the right size. */
1421 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX, 1422 rc = inode->i_op->getxattr(dentry, inode, XATTR_NAME_SELINUX,
1422 NULL, 0); 1423 NULL, 0);
1423 if (rc < 0) { 1424 if (rc < 0) {
1424 dput(dentry); 1425 dput(dentry);
@@ -1432,7 +1433,7 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent
1432 goto out_unlock; 1433 goto out_unlock;
1433 } 1434 }
1434 context[len] = '\0'; 1435 context[len] = '\0';
1435 rc = inode->i_op->getxattr(dentry, 1436 rc = inode->i_op->getxattr(dentry, inode,
1436 XATTR_NAME_SELINUX, 1437 XATTR_NAME_SELINUX,
1437 context, len); 1438 context, len);
1438 } 1439 }
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index 50bcca26c0b7..ff2b8c3cf7a9 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -272,7 +272,7 @@ static struct smack_known *smk_fetch(const char *name, struct inode *ip,
272 if (buffer == NULL) 272 if (buffer == NULL)
273 return ERR_PTR(-ENOMEM); 273 return ERR_PTR(-ENOMEM);
274 274
275 rc = ip->i_op->getxattr(dp, name, buffer, SMK_LONGLABEL); 275 rc = ip->i_op->getxattr(dp, ip, name, buffer, SMK_LONGLABEL);
276 if (rc < 0) 276 if (rc < 0)
277 skp = ERR_PTR(rc); 277 skp = ERR_PTR(rc);
278 else if (rc == 0) 278 else if (rc == 0)
@@ -3519,7 +3519,7 @@ static void smack_d_instantiate(struct dentry *opt_dentry, struct inode *inode)
3519 TRANS_TRUE, TRANS_TRUE_SIZE, 3519 TRANS_TRUE, TRANS_TRUE_SIZE,
3520 0); 3520 0);
3521 } else { 3521 } else {
3522 rc = inode->i_op->getxattr(dp, 3522 rc = inode->i_op->getxattr(dp, inode,
3523 XATTR_NAME_SMACKTRANSMUTE, trattr, 3523 XATTR_NAME_SMACKTRANSMUTE, trattr,
3524 TRANS_TRUE_SIZE); 3524 TRANS_TRUE_SIZE);
3525 if (rc >= 0 && strncmp(trattr, TRANS_TRUE, 3525 if (rc >= 0 && strncmp(trattr, TRANS_TRUE,