On Wed, Aug 07, 2019 at 02:02:05PM +0300, Dan Carpenter wrote: > On Tue, Aug 06, 2019 at 11:40:05AM -0700, Hridya Valsaraju wrote: > > @@ -467,6 +466,9 @@ static int binderfs_fill_super(struct super_block *sb, > > void *data, int silent) > > int ret; > > struct binderfs_info *info; > > struct inode *inode = NULL; > > + struct binderfs_device device_info = { 0 }; > > + const char *name; > > + size_t len; > > > > sb->s_blocksize = PAGE_SIZE; > > sb->s_blocksize_bits = PAGE_SHIFT; > > @@ -521,7 +523,24 @@ static int binderfs_fill_super(struct super_block *sb, > > void *data, int silent) > > if (!sb->s_root) > > return -ENOMEM; > > > > - return binderfs_binder_ctl_create(sb); > > + ret = binderfs_binder_ctl_create(sb); > > + if (ret) > > + return ret; > > + > > + name = binder_devices_param; > > + for (len = strcspn(name, ","); len > 0; len = strcspn(name, ",")) { > > + strscpy(device_info.name, name, len + 1); > > + ret = binderfs_binder_device_create(inode, NULL, &device_info); > > + if (ret) > > + return ret; > > We should probably clean up before returning... The error handling code > would probably be tricky to write though and it's not super common.
struct dentry *mount_nodev(struct file_system_type *fs_type, int flags, void *data, int (*fill_super)(struct super_block *, void *, int)) { <snip> error = fill_super(s, data, flags & SB_SILENT ? 1 : 0); if (error) { deactivate_locked_super(s); return ERR_PTR(error); } <snip> } deactivate_locked_super() will call fs->kill_sb(s) which calls binderfs_kill_super() which calls kill_litter_super() the latter will destory any remaining dentries and then calls generic_shutdown_super() which calls evict_inodes() which calls evict(inode) which calls the binderfs specific binderfs_evict_inode() and get rid of the rest. So manually cleaning up is not needed, imho. Christian