/* todo: file size may exceed PAGE_SIZE */ ssize_t sysaufs_si_show(struct kobject *kobj, struct attribute *attr, char *buf) { ssize_t err; long l; aufs_bindex_t bend; struct au_sbinfo *sbinfo; struct super_block *sb; struct seq_file *seq; char *name; struct attribute **cattr; sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); sb = sbinfo->si_sb; si_noflush_read_lock(sb); seq = au_seq(buf, PAGE_SIZE); err = PTR_ERR(seq); if (IS_ERR(seq)) goto out; name = (void *)attr->name; cattr = sysaufs_si_attrs; while (*cattr) { if (!strcmp(name, (*cattr)->name)) { err = container_of(*cattr, struct sysaufs_si_attr, attr) ->show(seq, sb); goto out_seq; } cattr++; }
/* 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; struct super_block *sb; struct seq_file *seq; char *name; struct attribute **cattr; sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); sb = sbinfo->si_sb; /* * prevent a race condition between sysfs and aufs. * for instance, sysfs_file_read() calls sysfs_get_active_two() which * prohibits maintaining the sysfs entries. * hew we acquire read lock after sysfs_get_active_two(). * on the other hand, the remount process may maintain the sysfs/aufs * entries after acquiring write lock. * it can cause a deadlock. * simply we gave up processing read here. */ err = -EBUSY; if (unlikely(!si_noflush_read_trylock(sb))) goto out; seq = au_seq(buf, PAGE_SIZE); err = PTR_ERR(seq); if (IS_ERR(seq)) goto out_unlock; name = (void *)attr->name; cattr = sysaufs_si_attrs; while (*cattr) { if (!strcmp(name, (*cattr)->name)) { err = container_of(*cattr, struct sysaufs_si_attr, attr) ->show(seq, sb); goto out_seq; } cattr++; }