Re: [PATCH 6/6] Add interface to advertise ext4 features in sysfs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 10 Jan 2011, Eric Sandeen wrote:

> On 09/15/2010 11:36 AM, Lukas Czerner wrote:
> > User-space should have the opportunity to check what features doest ext4
> > support in each particular copy. This adds easy interface by creating new
> > "features" directory in sys/fs/ext4/. In that directory files
> > advertising feature names can be created.
> > 
> > Add lazy_itable_init to the feature list.
> 
> This seems to break unloading/reloading in .37; near as I can
> tell /sys/fs/ext4 never gets unregistered on module unload.

That's not good, I'll look at it.

Thanks!
-Lukas

> 
> -Eric
> 
> > Signed-off-by: Lukas Czerner <lczerner@xxxxxxxxxx>
> > ---
> >  fs/ext4/ext4.h  |    5 +++++
> >  fs/ext4/super.c |   50 +++++++++++++++++++++++++++++++++++++++++++++++++-
> >  2 files changed, 54 insertions(+), 1 deletions(-)
> > 
> > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> > index 0df3977..9ecac2e 100644
> > --- a/fs/ext4/ext4.h
> > +++ b/fs/ext4/ext4.h
> > @@ -1502,6 +1502,11 @@ struct ext4_li_request {
> >  	unsigned long		lr_next_sched;
> >  };
> >  
> > +struct ext4_features {
> > +	struct kobject f_kobj;
> > +	struct completion f_kobj_unregister;
> > +};
> > +
> >  /*
> >   * Function prototypes
> >   */
> > diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> > index 3e285eb..b817eba 100644
> > --- a/fs/ext4/super.c
> > +++ b/fs/ext4/super.c
> > @@ -57,6 +57,7 @@ struct proc_dir_entry *ext4_proc_root;
> >  static struct kset *ext4_kset;
> >  struct ext4_lazy_init *ext4_li_info;
> >  struct mutex ext4_li_mtx;
> > +struct ext4_features *ext4_feat;
> >  
> >  static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
> >  			     unsigned long journal_devnum);
> > @@ -2349,6 +2350,7 @@ static struct ext4_attr ext4_attr_##_name = {			\
> >  #define EXT4_ATTR(name, mode, show, store) \
> >  static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store)
> >  
> > +#define EXT4_INFO_ATTR(name) EXT4_ATTR(name, 0444, NULL, NULL)
> >  #define EXT4_RO_ATTR(name) EXT4_ATTR(name, 0444, name##_show, NULL)
> >  #define EXT4_RW_ATTR(name) EXT4_ATTR(name, 0644, name##_show, name##_store)
> >  #define EXT4_RW_ATTR_SBI_UI(name, elname)	\
> > @@ -2385,6 +2387,14 @@ static struct attribute *ext4_attrs[] = {
> >  	NULL,
> >  };
> >  
> > +/* Features this copy of ext4 supports */
> > +EXT4_INFO_ATTR(lazy_itable_init);
> > +
> > +static struct attribute *ext4_feat_attrs[] = {
> > +	ATTR_LIST(lazy_itable_init),
> > +	NULL,
> > +};
> > +
> >  static ssize_t ext4_attr_show(struct kobject *kobj,
> >  			      struct attribute *attr, char *buf)
> >  {
> > @@ -2413,7 +2423,6 @@ static void ext4_sb_release(struct kobject *kobj)
> >  	complete(&sbi->s_kobj_unregister);
> >  }
> >  
> > -
> >  static const struct sysfs_ops ext4_attr_ops = {
> >  	.show	= ext4_attr_show,
> >  	.store	= ext4_attr_store,
> > @@ -2425,6 +2434,17 @@ static struct kobj_type ext4_ktype = {
> >  	.release	= ext4_sb_release,
> >  };
> >  
> > +static void ext4_feat_release(struct kobject *kobj)
> > +{
> > +	complete(&ext4_feat->f_kobj_unregister);
> > +}
> > +
> > +static struct kobj_type ext4_feat_ktype = {
> > +	.default_attrs	= ext4_feat_attrs,
> > +	.sysfs_ops	= &ext4_attr_ops,
> > +	.release	= ext4_feat_release,
> > +};
> > +
> >  /*
> >   * Check whether this filesystem can be mounted based on
> >   * the features present and the RDONLY/RDWR mount requested.
> > @@ -4581,6 +4601,30 @@ static struct file_system_type ext4_fs_type = {
> >  	.fs_flags	= FS_REQUIRES_DEV,
> >  };
> >  
> > +int __init ext4_init_feat_adverts(void)
> > +{
> > +	struct ext4_features *ef;
> > +	int ret = -ENOMEM;
> > +
> > +	ef = kzalloc(sizeof(struct ext4_features), GFP_KERNEL);
> > +	if (!ef)
> > +		goto out;
> > +
> > +	ef->f_kobj.kset = ext4_kset;
> > +	init_completion(&ef->f_kobj_unregister);
> > +	ret = kobject_init_and_add(&ef->f_kobj, &ext4_feat_ktype, NULL,
> > +				   "features");
> > +	if (ret) {
> > +		kfree(ef);
> > +		goto out;
> > +	}
> > +
> > +	ext4_feat = ef;
> > +	ret = 0;
> > +out:
> > +	return ret;
> > +}
> > +
> >  static int __init init_ext4_fs(void)
> >  {
> >  	int err;
> > @@ -4593,6 +4637,9 @@ static int __init init_ext4_fs(void)
> >  	if (!ext4_kset)
> >  		goto out4;
> >  	ext4_proc_root = proc_mkdir("fs/ext4", NULL);
> > +
> > +	err = ext4_init_feat_adverts();
> > +
> >  	err = init_ext4_mballoc();
> >  	if (err)
> >  		goto out3;
> > @@ -4621,6 +4668,7 @@ out1:
> >  out2:
> >  	exit_ext4_mballoc();
> >  out3:
> > +	kfree(ext4_feat);
> >  	remove_proc_entry("fs/ext4", NULL);
> >  	kset_unregister(ext4_kset);
> >  out4:
> 
> 

-- 
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux