|
@@ -120,12 +120,11 @@ static void wake_up_inode(struct inode *inode)
|
|
|
* These are initializations that need to be done on every inode
|
|
|
* allocation as the fields are not initialised by slab allocation.
|
|
|
*/
|
|
|
-struct inode *inode_init_always(struct super_block *sb, struct inode *inode)
|
|
|
+int inode_init_always(struct super_block *sb, struct inode *inode)
|
|
|
{
|
|
|
static const struct address_space_operations empty_aops;
|
|
|
static struct inode_operations empty_iops;
|
|
|
static const struct file_operations empty_fops;
|
|
|
-
|
|
|
struct address_space *const mapping = &inode->i_data;
|
|
|
|
|
|
inode->i_sb = sb;
|
|
@@ -152,7 +151,7 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode)
|
|
|
inode->dirtied_when = 0;
|
|
|
|
|
|
if (security_inode_alloc(inode))
|
|
|
- goto out_free_inode;
|
|
|
+ goto out;
|
|
|
|
|
|
/* allocate and initialize an i_integrity */
|
|
|
if (ima_inode_alloc(inode))
|
|
@@ -198,16 +197,12 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode)
|
|
|
inode->i_fsnotify_mask = 0;
|
|
|
#endif
|
|
|
|
|
|
- return inode;
|
|
|
+ return 0;
|
|
|
|
|
|
out_free_security:
|
|
|
security_inode_free(inode);
|
|
|
-out_free_inode:
|
|
|
- if (inode->i_sb->s_op->destroy_inode)
|
|
|
- inode->i_sb->s_op->destroy_inode(inode);
|
|
|
- else
|
|
|
- kmem_cache_free(inode_cachep, (inode));
|
|
|
- return NULL;
|
|
|
+out:
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
EXPORT_SYMBOL(inode_init_always);
|
|
|
|
|
@@ -220,9 +215,18 @@ static struct inode *alloc_inode(struct super_block *sb)
|
|
|
else
|
|
|
inode = kmem_cache_alloc(inode_cachep, GFP_KERNEL);
|
|
|
|
|
|
- if (inode)
|
|
|
- return inode_init_always(sb, inode);
|
|
|
- return NULL;
|
|
|
+ if (!inode)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ if (unlikely(inode_init_always(sb, inode))) {
|
|
|
+ if (inode->i_sb->s_op->destroy_inode)
|
|
|
+ inode->i_sb->s_op->destroy_inode(inode);
|
|
|
+ else
|
|
|
+ kmem_cache_free(inode_cachep, inode);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return inode;
|
|
|
}
|
|
|
|
|
|
void destroy_inode(struct inode *inode)
|