static int gfs2_security_init(struct gfs2_inode *dip, struct gfs2_inode *ip) { int err; size_t len; void *value; char *name; struct gfs2_ea_request er; err = security_inode_init_security(&ip->i_inode, &dip->i_inode, &name, &value, &len); if (err) { if (err == -EOPNOTSUPP) return 0; return err; } memset(&er, 0, sizeof(struct gfs2_ea_request)); er.er_type = GFS2_EATYPE_SECURITY; er.er_name = name; er.er_data = value; er.er_name_len = strlen(name); er.er_data_len = len; err = gfs2_ea_set_i(ip, &er); kfree(value); kfree(name); return err; }
static int security_eo_set(struct gfs2_inode *ip, struct gfs2_ea_request *er) { struct inode *inode = &ip->i_inode; int error = permission(inode, MAY_WRITE, NULL); if (error) return error; return gfs2_ea_set_i(ip, er); }
static int system_eo_set(struct gfs2_inode *ip, struct gfs2_ea_request *er) { int remove = 0; int error; if (GFS2_ACL_IS_ACCESS(er->er_name, er->er_name_len)) { if (!(er->er_flags & GFS2_ERF_MODE)) { er->er_mode = ip->i_inode.i_mode; er->er_flags |= GFS2_ERF_MODE; } error = gfs2_acl_validate_set(ip, 1, er, &remove, &er->er_mode); if (error) return error; error = gfs2_ea_set_i(ip, er); if (error) return error; if (remove) gfs2_ea_remove_i(ip, er); return 0; } else if (GFS2_ACL_IS_DEFAULT(er->er_name, er->er_name_len)) { error = gfs2_acl_validate_set(ip, 0, er, &remove, NULL); if (error) return error; if (!remove) error = gfs2_ea_set_i(ip, er); else { error = gfs2_ea_remove_i(ip, er); if (error == -ENODATA) error = 0; } return error; } return -EPERM; }
static int user_eo_set(struct gfs2_inode *ip, struct gfs2_ea_request *er) { struct inode *inode = &ip->i_inode; if (S_ISREG(inode->i_mode) || (S_ISDIR(inode->i_mode) && !(inode->i_mode & S_ISVTX))) { int error = permission(inode, MAY_WRITE, NULL); if (error) return error; } else return -EPERM; return gfs2_ea_set_i(ip, er); }
static int user_eo_set(struct gfs2_inode *ip, struct gfs2_ea_request *er) { return gfs2_ea_set_i(ip, er); }