ocfs2: reduce ioctl stack usage
On 32-bit architectures with KASAN_STACK enabled, the total stack usage of the ocfs2_ioctl function grows beyond the warning limit: fs/ocfs2/ioctl.c: In function 'ocfs2_ioctl': fs/ocfs2/ioctl.c:934:1: error: the frame size of 1448 bytes is larger than 1400 bytes [-Werror=frame-larger-than=] Move each of the variables into a basic block, and mark ocfs2_info_handle() as noinline_for_stack, in order to have the variable share stack slots. Link: https://lkml.kernel.org/r/20230417205631.1956027-1-arnd@kernel.org Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com> Reviewed-by: Mark Fasheh <mark@fasheh.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Junxiao Bi <junxiao.bi@oracle.com> Cc: Changwei Ge <gechangwei@live.cn> Cc: Gang He <ghe@suse.com> Cc: Jun Piao <piaojun@huawei.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
522dc4e5f5
commit
09d49eb90f
|
@ -803,8 +803,8 @@ bail:
|
|||
* a better backward&forward compatibility, since a small piece of
|
||||
* request will be less likely to be broken if disk layout get changed.
|
||||
*/
|
||||
static int ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info,
|
||||
int compat_flag)
|
||||
static noinline_for_stack int
|
||||
ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info, int compat_flag)
|
||||
{
|
||||
int i, status = 0;
|
||||
u64 req_addr;
|
||||
|
@ -840,27 +840,26 @@ bail:
|
|||
long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = file_inode(filp);
|
||||
int new_clusters;
|
||||
int status;
|
||||
struct ocfs2_space_resv sr;
|
||||
struct ocfs2_new_group_input input;
|
||||
struct reflink_arguments args;
|
||||
const char __user *old_path;
|
||||
const char __user *new_path;
|
||||
bool preserve;
|
||||
struct ocfs2_info info;
|
||||
void __user *argp = (void __user *)arg;
|
||||
int status;
|
||||
|
||||
switch (cmd) {
|
||||
case OCFS2_IOC_RESVSP:
|
||||
case OCFS2_IOC_RESVSP64:
|
||||
case OCFS2_IOC_UNRESVSP:
|
||||
case OCFS2_IOC_UNRESVSP64:
|
||||
{
|
||||
struct ocfs2_space_resv sr;
|
||||
|
||||
if (copy_from_user(&sr, (int __user *) arg, sizeof(sr)))
|
||||
return -EFAULT;
|
||||
|
||||
return ocfs2_change_file_space(filp, cmd, &sr);
|
||||
}
|
||||
case OCFS2_IOC_GROUP_EXTEND:
|
||||
{
|
||||
int new_clusters;
|
||||
|
||||
if (!capable(CAP_SYS_RESOURCE))
|
||||
return -EPERM;
|
||||
|
||||
|
@ -873,8 +872,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
status = ocfs2_group_extend(inode, new_clusters);
|
||||
mnt_drop_write_file(filp);
|
||||
return status;
|
||||
}
|
||||
case OCFS2_IOC_GROUP_ADD:
|
||||
case OCFS2_IOC_GROUP_ADD64:
|
||||
{
|
||||
struct ocfs2_new_group_input input;
|
||||
|
||||
if (!capable(CAP_SYS_RESOURCE))
|
||||
return -EPERM;
|
||||
|
||||
|
@ -887,7 +890,14 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
status = ocfs2_group_add(inode, &input);
|
||||
mnt_drop_write_file(filp);
|
||||
return status;
|
||||
}
|
||||
case OCFS2_IOC_REFLINK:
|
||||
{
|
||||
struct reflink_arguments args;
|
||||
const char __user *old_path;
|
||||
const char __user *new_path;
|
||||
bool preserve;
|
||||
|
||||
if (copy_from_user(&args, argp, sizeof(args)))
|
||||
return -EFAULT;
|
||||
old_path = (const char __user *)(unsigned long)args.old_path;
|
||||
|
@ -895,11 +905,16 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
preserve = (args.preserve != 0);
|
||||
|
||||
return ocfs2_reflink_ioctl(inode, old_path, new_path, preserve);
|
||||
}
|
||||
case OCFS2_IOC_INFO:
|
||||
{
|
||||
struct ocfs2_info info;
|
||||
|
||||
if (copy_from_user(&info, argp, sizeof(struct ocfs2_info)))
|
||||
return -EFAULT;
|
||||
|
||||
return ocfs2_info_handle(inode, &info, 0);
|
||||
}
|
||||
case FITRIM:
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
|
|
Loading…
Reference in New Issue