convert ibmasmfs

static contents for each "service processor", whatever the fuck it is.
Congruent subdirectories of root, created at mount time, taken out
by kill_litter_super().  All dentries created with d_alloc_name() and are
left pinned.  The odd part is that the list of service providers is
assumed to be unchanging - no locking, nothing to handle removals or
extra elements added later on.

... and it's a PCI device.  If you ever tell it to remove an instance,
you are fucked - it doesn't bother with removing its directory from filesystem,
it has a strange check that presumably wanted to be a check for removed
devices, but it had never been fleshed out.

Anyway, d_add() -> d_make_persistent()+dput() in ibmasmfs_create_dir() and
ibmasmfs_create_file(), and make the latter return int - no need to even
borrow that dentry, callers completely ignore it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2024-02-26 02:06:37 -05:00
parent ea800a515f
commit e6ef35deec
1 changed files with 10 additions and 8 deletions

View File

@ -103,7 +103,7 @@ static struct file_system_type ibmasmfs_type = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "ibmasmfs", .name = "ibmasmfs",
.init_fs_context = ibmasmfs_init_fs_context, .init_fs_context = ibmasmfs_init_fs_context,
.kill_sb = kill_litter_super, .kill_sb = kill_anon_super,
}; };
MODULE_ALIAS_FS("ibmasmfs"); MODULE_ALIAS_FS("ibmasmfs");
@ -144,7 +144,7 @@ static struct inode *ibmasmfs_make_inode(struct super_block *sb, int mode)
return ret; return ret;
} }
static struct dentry *ibmasmfs_create_file(struct dentry *parent, static int ibmasmfs_create_file(struct dentry *parent,
const char *name, const char *name,
const struct file_operations *fops, const struct file_operations *fops,
void *data, void *data,
@ -155,19 +155,20 @@ static struct dentry *ibmasmfs_create_file(struct dentry *parent,
dentry = d_alloc_name(parent, name); dentry = d_alloc_name(parent, name);
if (!dentry) if (!dentry)
return NULL; return -ENOMEM;
inode = ibmasmfs_make_inode(parent->d_sb, S_IFREG | mode); inode = ibmasmfs_make_inode(parent->d_sb, S_IFREG | mode);
if (!inode) { if (!inode) {
dput(dentry); dput(dentry);
return NULL; return -ENOMEM;
} }
inode->i_fop = fops; inode->i_fop = fops;
inode->i_private = data; inode->i_private = data;
d_add(dentry, inode); d_make_persistent(dentry, inode);
return dentry; dput(dentry);
return 0;
} }
static struct dentry *ibmasmfs_create_dir(struct dentry *parent, static struct dentry *ibmasmfs_create_dir(struct dentry *parent,
@ -189,8 +190,9 @@ static struct dentry *ibmasmfs_create_dir(struct dentry *parent,
inode->i_op = &simple_dir_inode_operations; inode->i_op = &simple_dir_inode_operations;
inode->i_fop = ibmasmfs_dir_ops; inode->i_fop = ibmasmfs_dir_ops;
d_add(dentry, inode); d_make_persistent(dentry, inode);
return dentry; dput(dentry);
return dentry; // borrowed
} }
int ibmasmfs_register(void) int ibmasmfs_register(void)