Commit 71480663 authored by Carlos Maiolino's avatar Carlos Maiolino Committed by Christian Brauner
Browse files

shmem: make shmem_get_inode() return ERR_PTR instead of NULL



Make shmem_get_inode() return ERR_PTR instead of NULL on error. This will be
useful later when we introduce quota support.

There should be no functional change.

Signed-off-by: default avatarLukas Czerner <lczerner@redhat.com>
Signed-off-by: default avatarCarlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Message-Id: <20230725144510.253763-3-cem@kernel.org>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent c7e263ab
Loading
Loading
Loading
Loading
+119 −92
Original line number Diff line number Diff line
@@ -2365,12 +2365,20 @@ static struct inode *shmem_get_inode(struct mnt_idmap *idmap, struct super_block
	struct shmem_inode_info *info;
	struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
	ino_t ino;
	int err;

	err = shmem_reserve_inode(sb, &ino);
	if (err)
		return ERR_PTR(err);

	if (shmem_reserve_inode(sb, &ino))
		return NULL;

	inode = new_inode(sb);
	if (inode) {

	if (!inode) {
		shmem_free_inode(sb);
		return ERR_PTR(-ENOSPC);
	}

	inode->i_ino = ino;
	inode_init_owner(idmap, inode, dir, mode);
	inode->i_blocks = 0;
@@ -2389,6 +2397,7 @@ static struct inode *shmem_get_inode(struct mnt_idmap *idmap, struct super_block
		shmem_set_inode_flags(inode, info->fsflags);
	INIT_LIST_HEAD(&info->shrinklist);
	INIT_LIST_HEAD(&info->swaplist);
	INIT_LIST_HEAD(&info->swaplist);
	if (sbinfo->noswap)
		mapping_set_unevictable(inode->i_mapping);
	simple_xattrs_init(&info->xattrs);
@@ -2424,8 +2433,6 @@ static struct inode *shmem_get_inode(struct mnt_idmap *idmap, struct super_block
	}

	lockdep_annotate_inode_mutex_key(inode);
	} else
		shmem_free_inode(sb);
	return inode;
}

@@ -3074,10 +3081,13 @@ shmem_mknod(struct mnt_idmap *idmap, struct inode *dir,
	    struct dentry *dentry, umode_t mode, dev_t dev)
{
	struct inode *inode;
	int error = -ENOSPC;
	int error;

	inode = shmem_get_inode(idmap, dir->i_sb, dir, mode, dev, VM_NORESERVE);
	if (inode) {

	if (IS_ERR(inode))
		return PTR_ERR(inode);

	error = simple_acl_create(dir, inode);
	if (error)
		goto out_iput;
@@ -3093,8 +3103,8 @@ shmem_mknod(struct mnt_idmap *idmap, struct inode *dir,
	inode_inc_iversion(dir);
	d_instantiate(dentry, inode);
	dget(dentry); /* Extra count - pin the dentry in core */
	}
	return error;

out_iput:
	iput(inode);
	return error;
@@ -3105,10 +3115,15 @@ shmem_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
	      struct file *file, umode_t mode)
{
	struct inode *inode;
	int error = -ENOSPC;
	int error;

	inode = shmem_get_inode(idmap, dir->i_sb, dir, mode, 0, VM_NORESERVE);
	if (inode) {

	if (IS_ERR(inode)) {
		error = PTR_ERR(inode);
		goto err_out;
	}

	error = security_inode_init_security(inode, dir,
					     NULL,
					     shmem_initxattrs, NULL);
@@ -3118,7 +3133,8 @@ shmem_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
	if (error)
		goto out_iput;
	d_tmpfile(file, inode);
	}

err_out:
	return finish_open_simple(file, error);
out_iput:
	iput(inode);
@@ -3293,8 +3309,9 @@ static int shmem_symlink(struct mnt_idmap *idmap, struct inode *dir,

	inode = shmem_get_inode(idmap, dir->i_sb, dir, S_IFLNK | 0777, 0,
				VM_NORESERVE);
	if (!inode)
		return -ENOSPC;

	if (IS_ERR(inode))
		return PTR_ERR(inode);

	error = security_inode_init_security(inode, dir, &dentry->d_name,
					     shmem_initxattrs, NULL);
@@ -3932,12 +3949,13 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc)
	struct shmem_options *ctx = fc->fs_private;
	struct inode *inode;
	struct shmem_sb_info *sbinfo;
	int error = -ENOMEM;

	/* Round up to L1_CACHE_BYTES to resist false sharing */
	sbinfo = kzalloc(max((int)sizeof(struct shmem_sb_info),
				L1_CACHE_BYTES), GFP_KERNEL);
	if (!sbinfo)
		return -ENOMEM;
		return error;

	sb->s_fs_info = sbinfo;

@@ -4000,8 +4018,10 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc)

	inode = shmem_get_inode(&nop_mnt_idmap, sb, NULL, S_IFDIR | sbinfo->mode, 0,
				VM_NORESERVE);
	if (!inode)
	if (IS_ERR(inode)) {
		error = PTR_ERR(inode);
		goto failed;
	}
	inode->i_uid = sbinfo->uid;
	inode->i_gid = sbinfo->gid;
	sb->s_root = d_make_root(inode);
@@ -4011,7 +4031,7 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc)

failed:
	shmem_put_super(sb);
	return -ENOMEM;
	return error;
}

static int shmem_get_tree(struct fs_context *fc)
@@ -4380,10 +4400,16 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);
#define shmem_vm_ops				generic_file_vm_ops
#define shmem_anon_vm_ops			generic_file_vm_ops
#define shmem_file_operations			ramfs_file_operations
#define shmem_get_inode(idmap, sb, dir, mode, dev, flags) ramfs_get_inode(sb, dir, mode, dev)
#define shmem_acct_size(flags, size)		0
#define shmem_unacct_size(flags, size)		do {} while (0)

static inline struct inode *shmem_get_inode(struct mnt_idmap *idmap, struct super_block *sb, struct inode *dir,
					    umode_t mode, dev_t dev, unsigned long flags)
{
	struct inode *inode = ramfs_get_inode(sb, dir, mode, dev);
	return inode ? inode : ERR_PTR(-ENOSPC);
}

#endif /* CONFIG_SHMEM */

/* common code */
@@ -4408,9 +4434,10 @@ static struct file *__shmem_file_setup(struct vfsmount *mnt, const char *name, l

	inode = shmem_get_inode(&nop_mnt_idmap, mnt->mnt_sb, NULL,
				S_IFREG | S_IRWXUGO, 0, flags);
	if (unlikely(!inode)) {

	if (IS_ERR(inode)) {
		shmem_unacct_size(flags, size);
		return ERR_PTR(-ENOSPC);
		return ERR_CAST(inode);
	}
	inode->i_flags |= i_flags;
	inode->i_size = size;