mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 04:06:22 +00:00
aa98d7cf59
This attached patches provide xattr support including POSIX-ACL and SELinux support on JFFS2 (version.5). There are some significant differences from previous version posted at last December. The biggest change is addition of EBS(Erase Block Summary) support. Currently, both kernel and usermode utility (sumtool) can recognize xattr nodes which have JFFS2_NODETYPE_XATTR/_XREF nodetype. In addition, some bugs are fixed. - A potential race condition was fixed. - Unexpected fail when updating a xattr by same name/value pair was fixed. - A bug when removing xattr name/value pair was fixed. The fundamental structures (such as using two new nodetypes and exclusion mechanism by rwsem) are unchanged. But most of implementation were reviewed and updated if necessary. Espacially, we had to change several internal implementations related to load_xattr_datum() to avoid a potential race condition. [1/2] xattr_on_jffs2.kernel.version-5.patch [2/2] xattr_on_jffs2.utils.version-5.patch Signed-off-by: KaiGai Kohei <kaigai@ak.jp.nec.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
82 lines
2.2 KiB
C
82 lines
2.2 KiB
C
/*-------------------------------------------------------------------------*
|
|
* File: fs/jffs2/security.c
|
|
* Security Labels support on JFFS2 FileSystem
|
|
*
|
|
* Implemented by KaiGai Kohei <kaigai@ak.jp.nec.com>
|
|
* Copyright (C) 2006 NEC Corporation
|
|
*
|
|
* For licensing information, see the file 'LICENCE' in the jffs2 directory.
|
|
*-------------------------------------------------------------------------*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/time.h>
|
|
#include <linux/pagemap.h>
|
|
#include <linux/highmem.h>
|
|
#include <linux/crc32.h>
|
|
#include <linux/jffs2.h>
|
|
#include <linux/xattr.h>
|
|
#include <linux/mtd/mtd.h>
|
|
#include <linux/security.h>
|
|
#include "nodelist.h"
|
|
|
|
/* ---- Initial Security Label Attachment -------------- */
|
|
int jffs2_init_security(struct inode *inode, struct inode *dir)
|
|
{
|
|
int rc;
|
|
size_t len;
|
|
void *value;
|
|
char *name;
|
|
|
|
rc = security_inode_init_security(inode, dir, &name, &value, &len);
|
|
if (rc) {
|
|
if (rc == -EOPNOTSUPP)
|
|
return 0;
|
|
return rc;
|
|
}
|
|
rc = do_jffs2_setxattr(inode, JFFS2_XPREFIX_SECURITY, name, value, len, 0);
|
|
|
|
kfree(name);
|
|
kfree(value);
|
|
return rc;
|
|
}
|
|
|
|
/* ---- XATTR Handler for "security.*" ----------------- */
|
|
static int jffs2_security_getxattr(struct inode *inode, const char *name,
|
|
void *buffer, size_t size)
|
|
{
|
|
if (!strcmp(name, ""))
|
|
return -EINVAL;
|
|
|
|
return do_jffs2_getxattr(inode, JFFS2_XPREFIX_SECURITY, name, buffer, size);
|
|
}
|
|
|
|
static int jffs2_security_setxattr(struct inode *inode, const char *name, const void *buffer,
|
|
size_t size, int flags)
|
|
{
|
|
if (!strcmp(name, ""))
|
|
return -EINVAL;
|
|
|
|
return do_jffs2_setxattr(inode, JFFS2_XPREFIX_SECURITY, name, buffer, size, flags);
|
|
}
|
|
|
|
static size_t jffs2_security_listxattr(struct inode *inode, char *list, size_t list_size,
|
|
const char *name, size_t name_len)
|
|
{
|
|
size_t retlen = XATTR_SECURITY_PREFIX_LEN + name_len + 1;
|
|
|
|
if (list && retlen <= list_size) {
|
|
strcpy(list, XATTR_SECURITY_PREFIX);
|
|
strcpy(list + XATTR_SECURITY_PREFIX_LEN, name);
|
|
}
|
|
|
|
return retlen;
|
|
}
|
|
|
|
struct xattr_handler jffs2_security_xattr_handler = {
|
|
.prefix = XATTR_SECURITY_PREFIX,
|
|
.list = jffs2_security_listxattr,
|
|
.set = jffs2_security_setxattr,
|
|
.get = jffs2_security_getxattr
|
|
};
|