summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2020-06-11 07:57:14 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-07-05 16:17:12 +0200
commitd0d073f12aaf09e856dc779cdf36410e3c8c68ea (patch)
tree762a131236160f88ff573da91f4058cbe75b112f
parentb31478f0ba4dcb4f9cc3e1c3c404c106702b4ccf (diff)
downloadbarebox-d0d073f12aaf09e856dc779cdf36410e3c8c68ea.tar.gz
barebox-d0d073f12aaf09e856dc779cdf36410e3c8c68ea.tar.xz
fs: Add destroy_inode callbacks to filesystems
Several filesystems rely on the default function which frees the struct inode * rather than the filesystem specific inode which the inode is embedded in. This works because the inode is the first element in the filesystem specific inode. Let's not depend on this behaviour and for clarity add the destroy_inode callbacks to all filesystems. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--fs/cramfs/cramfs.c10
-rw-r--r--fs/devfs.c8
-rw-r--r--fs/nfs.c8
-rw-r--r--fs/ramfs.c8
-rw-r--r--fs/squashfs/squashfs.c10
5 files changed, 43 insertions, 1 deletions
diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c
index 99cbdb920c..3ea6bd437e 100644
--- a/fs/cramfs/cramfs.c
+++ b/fs/cramfs/cramfs.c
@@ -333,6 +333,15 @@ static struct inode *cramfs_alloc_inode(struct super_block *sb)
return &info->i_inode;
}
+static void cramfs_destroy_inode(struct inode *inode)
+{
+ struct cramfs_inode_info *info;
+
+ info = to_cramfs_inode_info(inode);
+
+ free(info);
+}
+
static int cramfs_iterate(struct file *file, struct dir_context *ctx)
{
struct dentry *dentry = file->f_path.dentry;
@@ -427,6 +436,7 @@ static const struct inode_operations cramfs_symlink_inode_operations =
static const struct super_operations cramfs_ops = {
.alloc_inode = cramfs_alloc_inode,
+ .destroy_inode = cramfs_destroy_inode,
};
static int cramfs_probe(struct device_d *dev)
diff --git a/fs/devfs.c b/fs/devfs.c
index b503f277ac..df229cca48 100644
--- a/fs/devfs.c
+++ b/fs/devfs.c
@@ -200,6 +200,13 @@ static struct inode *devfs_alloc_inode(struct super_block *sb)
return &node->inode;
}
+static void devfs_destroy_inode(struct inode *inode)
+{
+ struct devfs_inode *node = container_of(inode, struct devfs_inode, inode);
+
+ free(node);
+}
+
static int devfs_iterate(struct file *file, struct dir_context *ctx)
{
struct cdev *cdev;
@@ -314,6 +321,7 @@ static const struct inode_operations devfs_dir_inode_operations =
static const struct super_operations devfs_ops = {
.alloc_inode = devfs_alloc_inode,
+ .destroy_inode = devfs_destroy_inode,
};
static int devfs_probe(struct device_d *dev)
diff --git a/fs/nfs.c b/fs/nfs.c
index 15ddab7915..6c4637281d 100644
--- a/fs/nfs.c
+++ b/fs/nfs.c
@@ -1202,6 +1202,13 @@ static struct inode *nfs_alloc_inode(struct super_block *sb)
return &node->inode;
}
+static void nfs_destroy_inode(struct inode *inode)
+{
+ struct nfs_inode *node = nfsi(inode);
+
+ free(node);
+}
+
static const struct inode_operations nfs_file_inode_operations;
static const struct file_operations nfs_dir_operations;
static const struct inode_operations nfs_dir_inode_operations;
@@ -1273,6 +1280,7 @@ static const struct inode_operations nfs_dir_inode_operations =
static const struct super_operations nfs_ops = {
.alloc_inode = nfs_alloc_inode,
+ .destroy_inode = nfs_destroy_inode,
};
static char *rootnfsopts;
diff --git a/fs/ramfs.c b/fs/ramfs.c
index 5328775ee0..341b6130de 100644
--- a/fs/ramfs.c
+++ b/fs/ramfs.c
@@ -396,8 +396,16 @@ static struct inode *ramfs_alloc_inode(struct super_block *sb)
return &node->inode;
}
+static void ramfs_destroy_inode(struct inode *inode)
+{
+ struct ramfs_inode *node = to_ramfs_inode(inode);
+
+ free(node);
+}
+
static const struct super_operations ramfs_ops = {
.alloc_inode = ramfs_alloc_inode,
+ .destroy_inode = ramfs_destroy_inode,
};
static int ramfs_probe(struct device_d *dev)
diff --git a/fs/squashfs/squashfs.c b/fs/squashfs/squashfs.c
index 38aff6d5b8..69451f7b84 100644
--- a/fs/squashfs/squashfs.c
+++ b/fs/squashfs/squashfs.c
@@ -76,8 +76,16 @@ static struct inode *squashfs_alloc_inode(struct super_block *sb)
return &node->vfs_inode;
}
+static void squashfs_destroy_inode(struct inode *inode)
+{
+ struct squashfs_inode_info *node = squashfs_i(inode);
+
+ free(node);
+}
+
static const struct super_operations squashfs_super_ops = {
- .alloc_inode = squashfs_alloc_inode,
+ .alloc_inode = squashfs_alloc_inode,
+ .destroy_inode = squashfs_destroy_inode,
};
static int squashfs_probe(struct device_d *dev)