mirror of
https://gitee.com/openharmony/kernel_linux
synced 2025-04-14 21:30:42 +00:00
JFS: Implement jfs_init_security
This atomically initializes the security xattr when an object is created Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
This commit is contained in:
parent
4f4b401bfa
commit
1d15b10f95
@ -61,4 +61,14 @@ extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t);
|
|||||||
extern ssize_t jfs_listxattr(struct dentry *, char *, size_t);
|
extern ssize_t jfs_listxattr(struct dentry *, char *, size_t);
|
||||||
extern int jfs_removexattr(struct dentry *, const char *);
|
extern int jfs_removexattr(struct dentry *, const char *);
|
||||||
|
|
||||||
|
#ifdef CONFIG_JFS_SECURITY
|
||||||
|
extern int jfs_init_security(tid_t, struct inode *, struct inode *);
|
||||||
|
#else
|
||||||
|
static inline int jfs_init_security(tid_t tid, struct inode *inode,
|
||||||
|
struct inode *dir)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* H_JFS_XATTR */
|
#endif /* H_JFS_XATTR */
|
||||||
|
@ -111,6 +111,12 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto out3;
|
goto out3;
|
||||||
|
|
||||||
|
rc = jfs_init_security(tid, ip, dip);
|
||||||
|
if (rc) {
|
||||||
|
txAbort(tid, 0);
|
||||||
|
goto out3;
|
||||||
|
}
|
||||||
|
|
||||||
if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) {
|
if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) {
|
||||||
jfs_err("jfs_create: dtSearch returned %d", rc);
|
jfs_err("jfs_create: dtSearch returned %d", rc);
|
||||||
txAbort(tid, 0);
|
txAbort(tid, 0);
|
||||||
@ -239,6 +245,12 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto out3;
|
goto out3;
|
||||||
|
|
||||||
|
rc = jfs_init_security(tid, ip, dip);
|
||||||
|
if (rc) {
|
||||||
|
txAbort(tid, 0);
|
||||||
|
goto out3;
|
||||||
|
}
|
||||||
|
|
||||||
if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) {
|
if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE))) {
|
||||||
jfs_err("jfs_mkdir: dtSearch returned %d", rc);
|
jfs_err("jfs_mkdir: dtSearch returned %d", rc);
|
||||||
txAbort(tid, 0);
|
txAbort(tid, 0);
|
||||||
@ -906,6 +918,10 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
|
|||||||
down(&JFS_IP(dip)->commit_sem);
|
down(&JFS_IP(dip)->commit_sem);
|
||||||
down(&JFS_IP(ip)->commit_sem);
|
down(&JFS_IP(ip)->commit_sem);
|
||||||
|
|
||||||
|
rc = jfs_init_security(tid, ip, dip);
|
||||||
|
if (rc)
|
||||||
|
goto out3;
|
||||||
|
|
||||||
tblk = tid_to_tblock(tid);
|
tblk = tid_to_tblock(tid);
|
||||||
tblk->xflag |= COMMIT_CREATE;
|
tblk->xflag |= COMMIT_CREATE;
|
||||||
tblk->ino = ip->i_ino;
|
tblk->ino = ip->i_ino;
|
||||||
@ -1349,6 +1365,12 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto out3;
|
goto out3;
|
||||||
|
|
||||||
|
rc = jfs_init_security(tid, ip, dir);
|
||||||
|
if (rc) {
|
||||||
|
txAbort(tid, 0);
|
||||||
|
goto out3;
|
||||||
|
}
|
||||||
|
|
||||||
if ((rc = dtSearch(dir, &dname, &ino, &btstack, JFS_CREATE))) {
|
if ((rc = dtSearch(dir, &dname, &ino, &btstack, JFS_CREATE))) {
|
||||||
txAbort(tid, 0);
|
txAbort(tid, 0);
|
||||||
goto out3;
|
goto out3;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <linux/xattr.h>
|
#include <linux/xattr.h>
|
||||||
#include <linux/posix_acl_xattr.h>
|
#include <linux/posix_acl_xattr.h>
|
||||||
#include <linux/quotaops.h>
|
#include <linux/quotaops.h>
|
||||||
|
#include <linux/security.h>
|
||||||
#include "jfs_incore.h"
|
#include "jfs_incore.h"
|
||||||
#include "jfs_superblock.h"
|
#include "jfs_superblock.h"
|
||||||
#include "jfs_dmap.h"
|
#include "jfs_dmap.h"
|
||||||
@ -1148,3 +1149,38 @@ int jfs_removexattr(struct dentry *dentry, const char *name)
|
|||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_JFS_SECURITY
|
||||||
|
int jfs_init_security(tid_t tid, struct inode *inode, struct inode *dir)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
size_t len;
|
||||||
|
void *value;
|
||||||
|
char *suffix;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
rc = security_inode_init_security(inode, dir, &suffix, &value, &len);
|
||||||
|
if (rc) {
|
||||||
|
if (rc == -EOPNOTSUPP)
|
||||||
|
return 0;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
name = kmalloc(XATTR_SECURITY_PREFIX_LEN + 1 + strlen(suffix),
|
||||||
|
GFP_NOFS);
|
||||||
|
if (!name) {
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto kmalloc_failed;
|
||||||
|
}
|
||||||
|
strcpy(name, XATTR_SECURITY_PREFIX);
|
||||||
|
strcpy(name + XATTR_SECURITY_PREFIX_LEN, suffix);
|
||||||
|
|
||||||
|
rc = __jfs_setxattr(tid, inode, name, value, len, 0);
|
||||||
|
|
||||||
|
kfree(name);
|
||||||
|
kmalloc_failed:
|
||||||
|
kfree(suffix);
|
||||||
|
kfree(value);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user