Skip to content

Commit

Permalink
JFS: Implement jfs_init_security
Browse files Browse the repository at this point in the history
This atomically initializes the security xattr when an object is created

Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
  • Loading branch information
Dave Kleikamp committed Sep 1, 2005
1 parent 4f4b401 commit 1d15b10
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 0 deletions.
10 changes: 10 additions & 0 deletions fs/jfs/jfs_xattr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 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 */
22 changes: 22 additions & 0 deletions fs/jfs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,12 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
if (rc)
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))) {
jfs_err("jfs_create: dtSearch returned %d", rc);
txAbort(tid, 0);
Expand Down Expand Up @@ -239,6 +245,12 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
if (rc)
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))) {
jfs_err("jfs_mkdir: dtSearch returned %d", rc);
txAbort(tid, 0);
Expand Down Expand Up @@ -906,6 +918,10 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
down(&JFS_IP(dip)->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->xflag |= COMMIT_CREATE;
tblk->ino = ip->i_ino;
Expand Down Expand Up @@ -1349,6 +1365,12 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
if (rc)
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))) {
txAbort(tid, 0);
goto out3;
Expand Down
36 changes: 36 additions & 0 deletions fs/jfs/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <linux/xattr.h>
#include <linux/posix_acl_xattr.h>
#include <linux/quotaops.h>
#include <linux/security.h>
#include "jfs_incore.h"
#include "jfs_superblock.h"
#include "jfs_dmap.h"
Expand Down Expand Up @@ -1148,3 +1149,38 @@ int jfs_removexattr(struct dentry *dentry, const char *name)

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

0 comments on commit 1d15b10

Please sign in to comment.