-/*-------------------------------------------------------------------------*
- * File: fs/jffs2/acl.c
- * POSIX ACL support on JFFS2 FileSystem
+/*
+ * JFFS2 -- Journalling Flash File System, Version 2.
*
- * Implemented by KaiGai Kohei <kaigai@ak.jp.nec.com>
- * Copyright (C) 2006 NEC Corporation
+ * Copyright (C) 2006 NEC Corporation
*
- * For licensing information, see the file 'LICENCE' in the jffs2 directory.
- *-------------------------------------------------------------------------*/
+ * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
+ *
+ * For licensing information, see the file 'LICENCE' in this directory.
+ *
+ */
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/fs.h>
static size_t jffs2_acl_size(int count)
{
if (count <= 4) {
- return sizeof(jffs2_acl_header)
- + count * sizeof(jffs2_acl_entry_short);
+ return sizeof(struct jffs2_acl_header)
+ + count * sizeof(struct jffs2_acl_entry_short);
} else {
- return sizeof(jffs2_acl_header)
- + 4 * sizeof(jffs2_acl_entry_short)
- + (count - 4) * sizeof(jffs2_acl_entry);
+ return sizeof(struct jffs2_acl_header)
+ + 4 * sizeof(struct jffs2_acl_entry_short)
+ + (count - 4) * sizeof(struct jffs2_acl_entry);
}
}
{
size_t s;
- size -= sizeof(jffs2_acl_header);
- s = size - 4 * sizeof(jffs2_acl_entry_short);
+ size -= sizeof(struct jffs2_acl_header);
+ s = size - 4 * sizeof(struct jffs2_acl_entry_short);
if (s < 0) {
- if (size % sizeof(jffs2_acl_entry_short))
+ if (size % sizeof(struct jffs2_acl_entry_short))
return -1;
- return size / sizeof(jffs2_acl_entry_short);
+ return size / sizeof(struct jffs2_acl_entry_short);
} else {
- if (s % sizeof(jffs2_acl_entry))
+ if (s % sizeof(struct jffs2_acl_entry))
return -1;
- return s / sizeof(jffs2_acl_entry) + 4;
+ return s / sizeof(struct jffs2_acl_entry) + 4;
}
}
-static struct posix_acl *jffs2_acl_from_medium(const void *value, size_t size)
+static struct posix_acl *jffs2_acl_from_medium(void *value, size_t size)
{
- const char *end = (char *)value + size;
+ void *end = value + size;
+ struct jffs2_acl_header *header = value;
+ struct jffs2_acl_entry *entry;
struct posix_acl *acl;
uint32_t ver;
int i, count;
if (!value)
return NULL;
- if (size < sizeof(jffs2_acl_header))
+ if (size < sizeof(struct jffs2_acl_header))
return ERR_PTR(-EINVAL);
- ver = je32_to_cpu(((jffs2_acl_header *)value)->a_version);
+ ver = je32_to_cpu(header->a_version);
if (ver != JFFS2_ACL_VERSION) {
JFFS2_WARNING("Invalid ACL version. (=%u)\n", ver);
return ERR_PTR(-EINVAL);
}
- value = (char *)value + sizeof(jffs2_acl_header);
+ value += sizeof(struct jffs2_acl_header);
count = jffs2_acl_count(size);
if (count < 0)
return ERR_PTR(-EINVAL);
return ERR_PTR(-ENOMEM);
for (i=0; i < count; i++) {
- jffs2_acl_entry *entry = (jffs2_acl_entry *)value;
- if ((char *)value + sizeof(jffs2_acl_entry_short) > end)
+ entry = value;
+ if (value + sizeof(struct jffs2_acl_entry_short) > end)
goto fail;
acl->a_entries[i].e_tag = je16_to_cpu(entry->e_tag);
acl->a_entries[i].e_perm = je16_to_cpu(entry->e_perm);
case ACL_GROUP_OBJ:
case ACL_MASK:
case ACL_OTHER:
- value = (char *)value + sizeof(jffs2_acl_entry_short);
+ value += sizeof(struct jffs2_acl_entry_short);
acl->a_entries[i].e_id = ACL_UNDEFINED_ID;
break;
case ACL_USER:
case ACL_GROUP:
- value = (char *)value + sizeof(jffs2_acl_entry);
- if ((char *)value > end)
+ value += sizeof(struct jffs2_acl_entry);
+ if (value > end)
goto fail;
acl->a_entries[i].e_id = je32_to_cpu(entry->e_id);
break;
static void *jffs2_acl_to_medium(const struct posix_acl *acl, size_t *size)
{
- jffs2_acl_header *jffs2_acl;
- char *e;
+ struct jffs2_acl_header *header;
+ struct jffs2_acl_entry *entry;
+ void *e;
size_t i;
*size = jffs2_acl_size(acl->a_count);
- jffs2_acl = (jffs2_acl_header *)kmalloc(sizeof(jffs2_acl_header)
- + acl->a_count * sizeof(jffs2_acl_entry),
- GFP_KERNEL);
- if (!jffs2_acl)
+ header = kmalloc(sizeof(*header) + acl->a_count * sizeof(*entry), GFP_KERNEL);
+ if (!header)
return ERR_PTR(-ENOMEM);
- jffs2_acl->a_version = cpu_to_je32(JFFS2_ACL_VERSION);
- e = (char *)jffs2_acl + sizeof(jffs2_acl_header);
+ header->a_version = cpu_to_je32(JFFS2_ACL_VERSION);
+ e = header + 1;
for (i=0; i < acl->a_count; i++) {
- jffs2_acl_entry *entry = (jffs2_acl_entry *)e;
+ entry = e;
entry->e_tag = cpu_to_je16(acl->a_entries[i].e_tag);
entry->e_perm = cpu_to_je16(acl->a_entries[i].e_perm);
switch(acl->a_entries[i].e_tag) {
case ACL_USER:
case ACL_GROUP:
entry->e_id = cpu_to_je32(acl->a_entries[i].e_id);
- e += sizeof(jffs2_acl_entry);
+ e += sizeof(struct jffs2_acl_entry);
break;
case ACL_USER_OBJ:
case ACL_GROUP_OBJ:
case ACL_MASK:
case ACL_OTHER:
- e += sizeof(jffs2_acl_entry_short);
+ e += sizeof(struct jffs2_acl_entry_short);
break;
default:
goto fail;
}
}
- return (char *)jffs2_acl;
+ return header;
fail:
- kfree(jffs2_acl);
+ kfree(header);
return ERR_PTR(-EINVAL);
}