diff options
| -rw-r--r-- | fs/gfs2/inode.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 81a921165941..57c43ac47925 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/gfs2_ondisk.h> | 17 | #include <linux/gfs2_ondisk.h> |
| 18 | #include <linux/crc32.h> | 18 | #include <linux/crc32.h> |
| 19 | #include <linux/lm_interface.h> | 19 | #include <linux/lm_interface.h> |
| 20 | #include <linux/security.h> | ||
| 20 | 21 | ||
| 21 | #include "gfs2.h" | 22 | #include "gfs2.h" |
| 22 | #include "incore.h" | 23 | #include "incore.h" |
| @@ -806,6 +807,39 @@ fail: | |||
| 806 | return error; | 807 | return error; |
| 807 | } | 808 | } |
| 808 | 809 | ||
| 810 | static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip) | ||
| 811 | { | ||
| 812 | int err; | ||
| 813 | size_t len; | ||
| 814 | void *value; | ||
| 815 | char *name; | ||
| 816 | struct gfs2_ea_request er; | ||
| 817 | |||
| 818 | err = security_inode_init_security(&ip->i_inode, &dip->i_inode, | ||
| 819 | &name, &value, &len); | ||
| 820 | |||
| 821 | if (err) { | ||
| 822 | if (err == -EOPNOTSUPP) | ||
| 823 | return 0; | ||
| 824 | return err; | ||
| 825 | } | ||
| 826 | |||
| 827 | memset(&er, 0, sizeof(struct gfs2_ea_request)); | ||
| 828 | |||
| 829 | er.er_type = GFS2_EATYPE_SECURITY; | ||
| 830 | er.er_name = name; | ||
| 831 | er.er_data = value; | ||
| 832 | er.er_name_len = strlen(name); | ||
| 833 | er.er_data_len = len; | ||
| 834 | |||
| 835 | err = gfs2_ea_set_i(ip, &er); | ||
| 836 | |||
| 837 | kfree(value); | ||
| 838 | kfree(name); | ||
| 839 | |||
| 840 | return err; | ||
| 841 | } | ||
| 842 | |||
| 809 | /** | 843 | /** |
| 810 | * gfs2_createi - Create a new inode | 844 | * gfs2_createi - Create a new inode |
| 811 | * @ghs: An array of two holders | 845 | * @ghs: An array of two holders |
| @@ -897,6 +931,10 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name, | |||
| 897 | if (error) | 931 | if (error) |
| 898 | goto fail_iput; | 932 | goto fail_iput; |
| 899 | 933 | ||
| 934 | error = gfs2_security_init(dip, GFS2_I(inode)); | ||
| 935 | if (error) | ||
| 936 | goto fail_iput; | ||
| 937 | |||
| 900 | error = link_dinode(dip, name, GFS2_I(inode)); | 938 | error = link_dinode(dip, name, GFS2_I(inode)); |
| 901 | if (error) | 939 | if (error) |
| 902 | goto fail_iput; | 940 | goto fail_iput; |
