/*
- * Copyright (C) 2005-2012 Junjiro R. Okajima
+ * Copyright (C) 2005-2013 Junjiro R. Okajima
*
* This program, aufs is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* unlinked.
*/
static int sysaufs_si_br(struct seq_file *seq, struct super_block *sb,
- aufs_bindex_t bindex)
+ aufs_bindex_t bindex, int idx)
{
int err;
struct path path;
root = sb->s_root;
di_read_lock_parent(root, !AuLock_IR);
br = au_sbr(sb, bindex);
- path.mnt = br->br_mnt;
- path.dentry = au_h_dptr(root, bindex);
- au_seq_path(seq, &path);
- di_read_unlock(root, !AuLock_IR);
- perm = au_optstr_br_perm(br->br_perm);
- if (perm) {
- err = seq_printf(seq, "=%s\n", perm);
- kfree(perm);
+
+ switch (idx) {
+ case AuBrSysfs_BR:
+ path.mnt = au_br_mnt(br);
+ path.dentry = au_h_dptr(root, bindex);
+ au_seq_path(seq, &path);
+ di_read_unlock(root, !AuLock_IR);
+ perm = au_optstr_br_perm(br->br_perm);
+ if (perm) {
+ err = seq_printf(seq, "=%s\n", perm);
+ kfree(perm);
+ if (err == -1)
+ err = -E2BIG;
+ } else
+ err = -ENOMEM;
+ break;
+ case AuBrSysfs_BRID:
+ err = seq_printf(seq, "%d\n", br->br_id);
+ di_read_unlock(root, !AuLock_IR);
if (err == -1)
err = -E2BIG;
- } else
- err = -ENOMEM;
+ break;
+ }
+
return err;
}
return seq;
}
-#define SysaufsBr_PREFIX "br"
+#define SysaufsBr_PREFIX "br"
+#define SysaufsBrid_PREFIX "brid"
/* todo: file size may exceed PAGE_SIZE */
ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr,
char *buf)
{
ssize_t err;
+ int idx;
long l;
aufs_bindex_t bend;
struct au_sbinfo *sbinfo;
cattr++;
}
- bend = au_sbend(sb);
- if (!strncmp(name, SysaufsBr_PREFIX, sizeof(SysaufsBr_PREFIX) - 1)) {
+ if (!strncmp(name, SysaufsBrid_PREFIX,
+ sizeof(SysaufsBrid_PREFIX) - 1)) {
+ idx = AuBrSysfs_BRID;
+ name += sizeof(SysaufsBrid_PREFIX) - 1;
+ } else if (!strncmp(name, SysaufsBr_PREFIX,
+ sizeof(SysaufsBr_PREFIX) - 1)) {
+ idx = AuBrSysfs_BR;
name += sizeof(SysaufsBr_PREFIX) - 1;
- err = kstrtol(name, 10, &l);
- if (!err) {
- if (l <= bend)
- err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l);
- else
- err = -ENOENT;
- }
- goto out_seq;
+ } else
+ BUG();
+
+ err = kstrtol(name, 10, &l);
+ if (!err) {
+ bend = au_sbend(sb);
+ if (l <= bend)
+ err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l, idx);
+ else
+ err = -ENOENT;
}
- BUG();
out_seq:
if (!err) {
void sysaufs_br_init(struct au_branch *br)
{
- struct attribute *attr = &br->br_attr;
-
- sysfs_attr_init(attr);
- attr->name = br->br_name;
- attr->mode = S_IRUGO;
+ int i;
+ struct au_brsysfs *br_sysfs;
+ struct attribute *attr;
+
+ br_sysfs = br->br_sysfs;
+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) {
+ attr = &br_sysfs->attr;
+ sysfs_attr_init(attr);
+ attr->name = br_sysfs->name;
+ attr->mode = S_IRUGO;
+ br_sysfs++;
+ }
}
void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex)
{
struct au_branch *br;
struct kobject *kobj;
+ struct au_brsysfs *br_sysfs;
+ int i;
aufs_bindex_t bend;
dbgaufs_brs_del(sb, bindex);
bend = au_sbend(sb);
for (; bindex <= bend; bindex++) {
br = au_sbr(sb, bindex);
- sysfs_remove_file(kobj, &br->br_attr);
+ br_sysfs = br->br_sysfs;
+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) {
+ sysfs_remove_file(kobj, &br_sysfs->attr);
+ br_sysfs++;
+ }
}
}
void sysaufs_brs_add(struct super_block *sb, aufs_bindex_t bindex)
{
- int err;
+ int err, i;
aufs_bindex_t bend;
struct kobject *kobj;
struct au_branch *br;
+ struct au_brsysfs *br_sysfs;
dbgaufs_brs_add(sb, bindex);
bend = au_sbend(sb);
for (; bindex <= bend; bindex++) {
br = au_sbr(sb, bindex);
- snprintf(br->br_name, sizeof(br->br_name), SysaufsBr_PREFIX
- "%d", bindex);
- err = sysfs_create_file(kobj, &br->br_attr);
- if (unlikely(err))
- pr_warning("failed %s under sysfs(%d)\n",
- br->br_name, err);
+ br_sysfs = br->br_sysfs;
+ snprintf(br_sysfs[AuBrSysfs_BR].name, sizeof(br_sysfs->name),
+ SysaufsBr_PREFIX "%d", bindex);
+ snprintf(br_sysfs[AuBrSysfs_BRID].name, sizeof(br_sysfs->name),
+ SysaufsBrid_PREFIX "%d", bindex);
+ for (i = 0; i < ARRAY_SIZE(br->br_sysfs); i++) {
+ err = sysfs_create_file(kobj, &br_sysfs->attr);
+ if (unlikely(err))
+ pr_warn("failed %s under sysfs(%d)\n",
+ br_sysfs->name, err);
+ br_sysfs++;
+ }
}
}