From nobody Wed Feb 11 16:30:17 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 87098C7EE24 for ; Sat, 6 May 2023 15:09:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232628AbjEFPJY (ORCPT ); Sat, 6 May 2023 11:09:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45818 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231830AbjEFPJW (ORCPT ); Sat, 6 May 2023 11:09:22 -0400 Received: from mail-pf1-x434.google.com (mail-pf1-x434.google.com [IPv6:2607:f8b0:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A525E1157B; Sat, 6 May 2023 08:09:19 -0700 (PDT) Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-64115e652eeso25653214b3a.0; Sat, 06 May 2023 08:09:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1683385759; x=1685977759; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qF8GDeVIxyqlJEAfd0RcDDRRi9wR9sAYdpzmsClyNvE=; b=nHr4+3jU7Qavm5W04l5x1287DlXrE+tyxBSvJm42iij5SAri4RknRKSUGKQPCM+j5K rk/d1yj/966tKVSY5CAlnEgpcQmJP5y9oXWvA3asP2fs8HFYc8JwHbEk/22TpvJn6o9n KYZVKm+RThNcRNuYJiYiaq/gEFTI0HXkJbQkwH3X6egT7h4cGB3FVZYejXJqZBXNGf6a 3+g/SQUlkNBw6yAmGtAGPa3jpsfQpCxxAAMdI9PjIZMsKMUzjnQPneN3iP81Lq6aUXW2 dUdy/lAUGXdLfmwpsaj1St+MhHogwZb+Csi/CcrabRAPm+1bwXw8SF+NFdjl3cp+Vv+C bV1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683385759; x=1685977759; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qF8GDeVIxyqlJEAfd0RcDDRRi9wR9sAYdpzmsClyNvE=; b=KQTdoo6g2AHuHz7mVz7AkB3bVNXuZoJQLaEJOf+D4UYgiOeBAZAPWJjAsbuG7frVST vyJCnX8Lt0sISd0Q4iqWhtc9I7WTBs+5Gk/JG/lJbLzy72Oox1cId5rTLE7+eSxhfg41 4q0652M/L/c5VYXjs9jSCnNrEgP+CDjKdxmsMt5JchjsnFwM+2rdxGCGgCcM7wLmeNH3 nMKuBfguIZpav3N6Fld3TiNf+yPwjwReeAttqk5+hbh5K0bVCMrXM4wC2TIqxnzZI//4 1PeWQbq91aSo7QGEp+GC1A3DfD1FlHQELo7eZaOb+61jP24B3scoXw44hcjYXLPegoE0 8laA== X-Gm-Message-State: AC+VfDztbJ7lB1LsfdpY1knDnnlknAD9gKHotQYwWUvJxaGdHg0R8RMl ngPH8R+DlRZFYruZYb7362I= X-Google-Smtp-Source: ACHHUZ7yrrFvsmZLxYpRQvwebKg4YynQZdND3cQLzZjomKfjgRuMl4mVVOciLBKkrL3SCEw7iHQvKA== X-Received: by 2002:a05:6a20:144f:b0:ef:8de0:6a5 with SMTP id a15-20020a056a20144f00b000ef8de006a5mr6083765pzi.3.1683385758731; Sat, 06 May 2023 08:09:18 -0700 (PDT) Received: from localhost.localdomain ([47.98.195.232]) by smtp.gmail.com with ESMTPSA id y15-20020aa7854f000000b0063db25e140bsm3347182pfn.32.2023.05.06.08.09.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 May 2023 08:09:18 -0700 (PDT) From: wenjun93 X-Google-Original-From: wenjun93 To: miklos@szeredi.hu Cc: linux-unionfs@vger.kernel.org, linux-kernel@vger.kernel.org, wenjun93 Subject: [PATCH v2] overlayfs: clean error handling Date: Sat, 6 May 2023 23:09:11 +0800 Message-Id: <20230506150911.1983249-1-gwj1235@yeah.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Remove PTR_ERR from unused code path and assign error value where it exactly happens. This cleans the code and also helps to reduce=20 the possibility of incorrect err settings when it's set globally and is forgotten to be overwrite in custom development. Signed-off-by: wenjun93 --- fs/overlayfs/copy_up.c | 20 ++++---- fs/overlayfs/dir.c | 101 ++++++++++++++++++++++++----------------- fs/overlayfs/export.c | 22 +++++---- fs/overlayfs/namei.c | 34 ++++++++------ fs/overlayfs/readdir.c | 5 +- fs/overlayfs/super.c | 80 ++++++++++++++++++-------------- fs/overlayfs/util.c | 2 +- 7 files changed, 154 insertions(+), 110 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index f658cc8ea492..2ec25bcacf8f 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -507,9 +507,10 @@ static int ovl_create_index(struct dentry *dentry, str= uct dentry *origin, return err; =20 temp =3D ovl_create_temp(ofs, indexdir, OVL_CATTR(S_IFDIR | 0)); - err =3D PTR_ERR(temp); - if (IS_ERR(temp)) + if (IS_ERR(temp)) { + err =3D PTR_ERR(temp); goto free_name; + } =20 err =3D ovl_set_upper_fh(ofs, upper, temp); if (err) @@ -705,9 +706,10 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx = *c) }; =20 /* workdir and destdir could be the same when copying up to indexdir */ - err =3D -EIO; - if (lock_rename(c->workdir, c->destdir) !=3D NULL) + if (lock_rename(c->workdir, c->destdir) !=3D NULL) { + err =3D -EIO; goto unlock; + } =20 err =3D ovl_prep_cu_creds(c->dentry, &cc); if (err) @@ -716,9 +718,10 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx = *c) temp =3D ovl_create_temp(ofs, c->workdir, &cattr); ovl_revert_cu_creds(&cc); =20 - err =3D PTR_ERR(temp); - if (IS_ERR(temp)) + if (IS_ERR(temp)) { + err =3D PTR_ERR(temp); goto unlock; + } =20 /* * Copy up data first and then xattrs. Writing data after @@ -741,9 +744,10 @@ static int ovl_copy_up_workdir(struct ovl_copy_up_ctx = *c) =20 upper =3D ovl_lookup_upper(ofs, c->destname.name, c->destdir, c->destname.len); - err =3D PTR_ERR(upper); - if (IS_ERR(upper)) + if (IS_ERR(upper)) { + err =3D PTR_ERR(upper); goto cleanup; + } =20 err =3D ovl_do_rename(ofs, wdir, temp, udir, upper, 0); dput(upper); diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index fc25fb95d5fc..e083bb343ffa 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -115,9 +115,10 @@ int ovl_cleanup_and_whiteout(struct ovl_fs *ofs, struc= t inode *dir, int flags =3D 0; =20 whiteout =3D ovl_whiteout(ofs); - err =3D PTR_ERR(whiteout); - if (IS_ERR(whiteout)) + if (IS_ERR(whiteout)) { + err =3D PTR_ERR(whiteout); return err; + } =20 if (d_is_dir(dentry)) flags =3D RENAME_EXCHANGE; @@ -176,9 +177,10 @@ struct dentry *ovl_create_real(struct ovl_fs *ofs, str= uct inode *dir, if (IS_ERR(newdentry)) return newdentry; =20 - err =3D -ESTALE; - if (newdentry->d_inode) + if (newdentry->d_inode) { + err =3D -ESTALE; goto out; + } =20 if (attr->hardlink) { err =3D ovl_do_link(ofs, attr->hardlink, dir, newdentry); @@ -336,9 +338,10 @@ static int ovl_create_upper(struct dentry *dentry, str= uct inode *inode, ovl_lookup_upper(ofs, dentry->d_name.name, upperdir, dentry->d_name.len), attr); - err =3D PTR_ERR(newdentry); - if (IS_ERR(newdentry)) + if (IS_ERR(newdentry)) { + err =3D PTR_ERR(newdentry); goto out_unlock; + } =20 if (ovl_type_merge(dentry->d_parent) && d_is_dir(newdentry) && !ovl_allow_offline_changes(ofs)) { @@ -394,9 +397,10 @@ static struct dentry *ovl_clear_empty(struct dentry *d= entry, goto out_unlock; =20 opaquedir =3D ovl_create_temp(ofs, workdir, OVL_CATTR(stat.mode)); - err =3D PTR_ERR(opaquedir); - if (IS_ERR(opaquedir)) + if (IS_ERR(opaquedir)) { + err =3D PTR_ERR(opaquedir); goto out_unlock; + } =20 err =3D ovl_copy_xattr(dentry->d_sb, &upperpath, opaquedir); if (err) @@ -473,18 +477,21 @@ static int ovl_create_over_whiteout(struct dentry *de= ntry, struct inode *inode, =20 upper =3D ovl_lookup_upper(ofs, dentry->d_name.name, upperdir, dentry->d_name.len); - err =3D PTR_ERR(upper); - if (IS_ERR(upper)) + if (IS_ERR(upper)) { + err =3D PTR_ERR(upper); goto out_unlock; + } =20 - err =3D -ESTALE; - if (d_is_negative(upper) || !IS_WHITEOUT(d_inode(upper))) + if (d_is_negative(upper) || !IS_WHITEOUT(d_inode(upper))) { + err =3D -ESTALE; goto out_dput; + } =20 newdentry =3D ovl_create_temp(ofs, workdir, cattr); - err =3D PTR_ERR(newdentry); - if (IS_ERR(newdentry)) + if (IS_ERR(newdentry)) { + err =3D PTR_ERR(newdentry); goto out_dput; + } =20 /* * mode could have been mutilated due to umask (e.g. sgid directory) @@ -577,10 +584,11 @@ static int ovl_create_or_link(struct dentry *dentry, = struct inode *inode, } =20 if (!attr->hardlink) { - err =3D -ENOMEM; override_cred =3D prepare_creds(); - if (!override_cred) + if (!override_cred) { + err =3D -ENOMEM; goto out_revert_creds; + } /* * In the creation cases(create, mkdir, mknod, symlink), * ovl should transfer current's fs{u,g}id to underlying @@ -632,10 +640,11 @@ static int ovl_create_object(struct dentry *dentry, i= nt mode, dev_t rdev, goto out; =20 /* Preallocate inode to be used by ovl_get_inode() */ - err =3D -ENOMEM; inode =3D ovl_new_inode(dentry->d_sb, mode, rdev); - if (!inode) + if (!inode) { + err =3D -ENOMEM; goto out_drop_write; + } =20 spin_lock(&inode->i_lock); inode->i_state |=3D I_CREATING; @@ -759,9 +768,10 @@ static int ovl_remove_and_whiteout(struct dentry *dent= ry, =20 if (!list_empty(list)) { opaquedir =3D ovl_clear_empty(dentry, list); - err =3D PTR_ERR(opaquedir); - if (IS_ERR(opaquedir)) + if (IS_ERR(opaquedir)) { + err =3D PTR_ERR(opaquedir); goto out; + } } =20 err =3D ovl_lock_rename_workdir(workdir, upperdir); @@ -770,14 +780,15 @@ static int ovl_remove_and_whiteout(struct dentry *den= try, =20 upper =3D ovl_lookup_upper(ofs, dentry->d_name.name, upperdir, dentry->d_name.len); - err =3D PTR_ERR(upper); - if (IS_ERR(upper)) + if (IS_ERR(upper)) { + err =3D PTR_ERR(upper); goto out_unlock; + } =20 - err =3D -ESTALE; if ((opaquedir && upper !=3D opaquedir) || (!opaquedir && ovl_dentry_upper(dentry) && !ovl_matches_upper(dentry, upper))) { + err =3D -ESTALE; goto out_dput_upper; } =20 @@ -810,22 +821,25 @@ static int ovl_remove_upper(struct dentry *dentry, bo= ol is_dir, =20 if (!list_empty(list)) { opaquedir =3D ovl_clear_empty(dentry, list); - err =3D PTR_ERR(opaquedir); - if (IS_ERR(opaquedir)) + if (IS_ERR(opaquedir)) { + err =3D PTR_ERR(opaquedir); goto out; + } } =20 inode_lock_nested(dir, I_MUTEX_PARENT); upper =3D ovl_lookup_upper(ofs, dentry->d_name.name, upperdir, dentry->d_name.len); - err =3D PTR_ERR(upper); - if (IS_ERR(upper)) + if (IS_ERR(upper)) { + err =3D PTR_ERR(upper); goto out_unlock; + } =20 - err =3D -ESTALE; if ((opaquedir && upper !=3D opaquedir) || - (!opaquedir && !ovl_matches_upper(dentry, upper))) + (!opaquedir && !ovl_matches_upper(dentry, upper))) { + err =3D -ESTALE; goto out_dput_upper; + } =20 if (is_dir) err =3D ovl_do_rmdir(ofs, dir, upper); @@ -1098,18 +1112,18 @@ static int ovl_rename(struct mnt_idmap *idmap, stru= ct inode *olddir, struct ovl_fs *ofs =3D OVL_FS(old->d_sb); LIST_HEAD(list); =20 - err =3D -EINVAL; - if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE)) + if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE)) { + err =3D -EINVAL; goto out; + } =20 flags &=3D ~RENAME_NOREPLACE; =20 /* Don't copy up directory trees */ - err =3D -EXDEV; - if (!ovl_can_move(old)) - goto out; - if (!overwrite && !ovl_can_move(new)) + if (!ovl_can_move(old) || (!overwrite && !ovl_can_move(new))) { + err =3D -EXDEV; goto out; + } =20 if (overwrite && new_is_dir && !ovl_pure_upper(new)) { err =3D ovl_check_empty_dir(new, &list); @@ -1159,8 +1173,8 @@ static int ovl_rename(struct mnt_idmap *idmap, struct= inode *olddir, =20 if (!list_empty(&list)) { opaquedir =3D ovl_clear_empty(new, &list); - err =3D PTR_ERR(opaquedir); if (IS_ERR(opaquedir)) { + err =3D PTR_ERR(opaquedir); opaquedir =3D NULL; goto out_revert_creds; } @@ -1192,19 +1206,22 @@ static int ovl_rename(struct mnt_idmap *idmap, stru= ct inode *olddir, =20 olddentry =3D ovl_lookup_upper(ofs, old->d_name.name, old_upperdir, old->d_name.len); - err =3D PTR_ERR(olddentry); - if (IS_ERR(olddentry)) + if (IS_ERR(olddentry)) { + err =3D PTR_ERR(olddentry); goto out_unlock; + } =20 - err =3D -ESTALE; - if (!ovl_matches_upper(old, olddentry)) + if (!ovl_matches_upper(old, olddentry)) { + err =3D -ESTALE; goto out_dput_old; + } =20 newdentry =3D ovl_lookup_upper(ofs, new->d_name.name, new_upperdir, new->d_name.len); - err =3D PTR_ERR(newdentry); - if (IS_ERR(newdentry)) + if (IS_ERR(newdentry)) { + err =3D PTR_ERR(newdentry); goto out_dput_old; + } =20 old_opaque =3D ovl_dentry_is_opaque(old); new_opaque =3D ovl_dentry_is_opaque(new); diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c index defd4e231ad2..00183ebf8d28 100644 --- a/fs/overlayfs/export.c +++ b/fs/overlayfs/export.c @@ -379,10 +379,11 @@ static struct dentry *ovl_lookup_real_one(struct dent= ry *connected, * connected real path from the top. */ inode_lock_nested(dir, I_MUTEX_PARENT); - err =3D -ECHILD; parent =3D dget_parent(real); - if (ovl_dentry_real_at(connected, layer->idx) !=3D parent) + if (ovl_dentry_real_at(connected, layer->idx) !=3D parent) { + err =3D -ECHILD; goto fail; + } =20 /* * We also need to take a snapshot of real dentry name to protect us @@ -716,9 +717,10 @@ static struct dentry *ovl_lower_fh_to_d(struct super_b= lock *sb, if (!d_is_dir(origin.dentry) || !(origin.dentry->d_flags & DCACHE_DISCONNECTED)) { inode =3D ovl_lookup_inode(sb, origin.dentry, false); - err =3D PTR_ERR(inode); - if (IS_ERR(inode)) + if (IS_ERR(inode)) { + err =3D PTR_ERR(inode); goto out_err; + } if (inode) { dentry =3D d_find_any_alias(inode); iput(inode); @@ -730,8 +732,8 @@ static struct dentry *ovl_lower_fh_to_d(struct super_bl= ock *sb, /* Then lookup indexed upper/whiteout by origin fh */ if (ofs->indexdir) { index =3D ovl_get_index_fh(ofs, fh); - err =3D PTR_ERR(index); if (IS_ERR(index)) { + err =3D PTR_ERR(index); index =3D NULL; goto out_err; } @@ -741,9 +743,10 @@ static struct dentry *ovl_lower_fh_to_d(struct super_b= lock *sb, if (index && d_is_dir(index)) { struct dentry *upper =3D ovl_index_upper(ofs, index, true); =20 - err =3D PTR_ERR(upper); - if (IS_ERR_OR_NULL(upper)) + if (IS_ERR_OR_NULL(upper)) { + err =3D PTR_ERR(upper); goto out_err; + } =20 dentry =3D ovl_get_dentry(sb, upper, NULL, NULL); dput(upper); @@ -810,9 +813,10 @@ static struct dentry *ovl_fh_to_dentry(struct super_bl= ock *sb, struct fid *fid, int err; =20 fh =3D ovl_fid_to_fh(fid, len, fh_type); - err =3D PTR_ERR(fh); - if (IS_ERR(fh)) + if (IS_ERR(fh)) { + err =3D PTR_ERR(fh); goto out_err; + } =20 err =3D ovl_check_fh_len(fh, len); if (err) diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index cfb3420b7df0..665e9f19d8de 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -462,8 +462,8 @@ int ovl_verify_set_fh(struct ovl_fs *ofs, struct dentry= *dentry, int err; =20 fh =3D ovl_encode_real_fh(ofs, real, is_upper); - err =3D PTR_ERR(fh); if (IS_ERR(fh)) { + err =3D PTR_ERR(fh); fh =3D NULL; goto fail; } @@ -533,19 +533,22 @@ int ovl_verify_index(struct ovl_fs *ofs, struct dentr= y *index) if (!d_inode(index)) return 0; =20 - err =3D -EINVAL; - if (index->d_name.len < sizeof(struct ovl_fb)*2) + if (index->d_name.len < sizeof(struct ovl_fb)*2) { + err =3D -EINVAL; goto fail; + } =20 - err =3D -ENOMEM; len =3D index->d_name.len / 2; fh =3D kzalloc(len + OVL_FH_WIRE_OFFSET, GFP_KERNEL); - if (!fh) + if (!fh) { + err =3D -ENOMEM; goto fail; + } =20 - err =3D -EINVAL; - if (hex2bin(fh->buf, index->d_name.name, len)) + if (hex2bin(fh->buf, index->d_name.name, len)) { + err =3D -EINVAL; goto fail; + } =20 err =3D ovl_check_fb_len(&fh->fb, len); if (err) @@ -905,11 +908,12 @@ struct dentry *ovl_lookup(struct inode *dir, struct d= entry *dentry, } =20 if (!d.stop && poe->numlower) { - err =3D -ENOMEM; stack =3D kcalloc(ofs->numlayer - 1, sizeof(struct ovl_path), GFP_KERNEL); - if (!stack) + if (!stack) { + err =3D -ENOMEM; goto out_put_upper; + } } =20 for (i =3D 0; !d.stop && i < poe->numlower; i++) { @@ -994,10 +998,10 @@ struct dentry *ovl_lookup(struct inode *dir, struct d= entry *dentry, * Only following redirects when redirects are enabled disables * this attack vector when not necessary. */ - err =3D -EPERM; if (d.redirect && !ofs->config.redirect_follow) { pr_warn_ratelimited("refusing to follow redirect for (%pd2)\n", dentry); + err =3D -EPERM; goto out_put; } =20 @@ -1068,9 +1072,10 @@ struct dentry *ovl_lookup(struct inode *dir, struct = dentry *dentry, } =20 oe =3D ovl_alloc_entry(ctr); - err =3D -ENOMEM; - if (!oe) + if (!oe) { + err =3D -ENOMEM; goto out_put; + } =20 memcpy(oe->lowerstack, stack, sizeof(struct ovl_path) * ctr); dentry->d_fsdata =3D oe; @@ -1115,9 +1120,10 @@ struct dentry *ovl_lookup(struct inode *dir, struct = dentry *dentry, }; =20 inode =3D ovl_get_inode(dentry->d_sb, &oip); - err =3D PTR_ERR(inode); - if (IS_ERR(inode)) + if (IS_ERR(inode)) { + err =3D PTR_ERR(inode); goto out_free_oe; + } if (upperdentry && !uppermetacopy) ovl_set_flag(OVL_UPPERDATA, inode); } diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c index b6952b21a7ee..ad5363ac3a68 100644 --- a/fs/overlayfs/readdir.c +++ b/fs/overlayfs/readdir.c @@ -764,9 +764,10 @@ static int ovl_iterate(struct file *file, struct dir_c= ontext *ctx) struct ovl_dir_cache *cache; =20 cache =3D ovl_cache_get(dentry); - err =3D PTR_ERR(cache); - if (IS_ERR(cache)) + if (IS_ERR(cache)) { + err =3D PTR_ERR(cache); goto out; + } =20 od->cache =3D cache; ovl_seek_cursor(od, ctx->pos); diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index f97ad8b40dbb..f683ff46edaf 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -801,9 +801,10 @@ static struct dentry *ovl_workdir_create(struct ovl_fs= *ofs, goto out_dput; =20 /* Weird filesystem returning with hashed negative (kernfs)? */ - err =3D -EINVAL; - if (d_really_is_negative(work)) + if (d_really_is_negative(work)) { + err =3D -EINVAL; goto out_dput; + } =20 /* * Try to remove POSIX ACL xattrs from workdir. We are good if: @@ -1130,8 +1131,8 @@ static int ovl_get_upper(struct super_block *sb, stru= ct ovl_fs *ofs, goto out; =20 upper_mnt =3D clone_private_mount(upperpath); - err =3D PTR_ERR(upper_mnt); if (IS_ERR(upper_mnt)) { + err =3D PTR_ERR(upper_mnt); pr_err("failed to clone upperpath\n"); goto out; } @@ -1184,13 +1185,14 @@ static int ovl_check_rename_whiteout(struct ovl_fs = *ofs) inode_lock_nested(dir, I_MUTEX_PARENT); =20 temp =3D ovl_create_temp(ofs, workdir, OVL_CATTR(S_IFREG | 0)); - err =3D PTR_ERR(temp); - if (IS_ERR(temp)) + if (IS_ERR(temp)) { + err =3D PTR_ERR(temp); goto out_unlock; + } =20 dest =3D ovl_lookup_temp(ofs, workdir); - err =3D PTR_ERR(dest); if (IS_ERR(dest)) { + err =3D PTR_ERR(dest); dput(temp); goto out_unlock; } @@ -1205,9 +1207,10 @@ static int ovl_check_rename_whiteout(struct ovl_fs *= ofs) } =20 whiteout =3D ovl_lookup_upper(ofs, name.name.name, workdir, name.name.len= ); - err =3D PTR_ERR(whiteout); - if (IS_ERR(whiteout)) + if (IS_ERR(whiteout)) { + err =3D PTR_ERR(whiteout); goto cleanup_temp; + } =20 err =3D ovl_is_whiteout(whiteout); =20 @@ -1284,9 +1287,10 @@ static int ovl_make_workdir(struct super_block *sb, = struct ovl_fs *ofs, return err; =20 workdir =3D ovl_workdir_create(ofs, OVL_WORKDIR_NAME, false); - err =3D PTR_ERR(workdir); - if (IS_ERR_OR_NULL(workdir)) + if (IS_ERR_OR_NULL(workdir)) { + err =3D PTR_ERR(workdir); goto out; + } =20 ofs->workdir =3D workdir; =20 @@ -1598,10 +1602,11 @@ static int ovl_get_layers(struct super_block *sb, s= truct ovl_fs *ofs, int err; unsigned int i; =20 - err =3D -ENOMEM; ofs->fs =3D kcalloc(numlower + 1, sizeof(struct ovl_sb), GFP_KERNEL); - if (ofs->fs =3D=3D NULL) + if (ofs->fs =3D=3D NULL) { + err =3D -ENOMEM; goto out; + } =20 /* idx/fsid 0 are reserved for upper fs even with lower only overlay */ ofs->numfs++; @@ -1652,8 +1657,8 @@ static int ovl_get_layers(struct super_block *sb, str= uct ovl_fs *ofs, } =20 mnt =3D clone_private_mount(&stack[i]); - err =3D PTR_ERR(mnt); if (IS_ERR(mnt)) { + err =3D PTR_ERR(mnt); pr_err("failed to clone lowerpath\n"); iput(trap); goto out; @@ -1729,7 +1734,6 @@ static struct ovl_entry *ovl_get_lowerstack(struct su= per_block *sb, if (!stack) return ERR_PTR(-ENOMEM); =20 - err =3D -EINVAL; for (i =3D 0; i < numlower; i++) { err =3D ovl_lower_dir(lower, &stack[i], ofs, &sb->s_stack_depth); if (err) @@ -1738,10 +1742,10 @@ static struct ovl_entry *ovl_get_lowerstack(struct = super_block *sb, lower =3D strchr(lower, '\0') + 1; } =20 - err =3D -EINVAL; sb->s_stack_depth++; if (sb->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) { pr_err("maximum fs stacking depth exceeded\n"); + err =3D -EINVAL; goto out_err; } =20 @@ -1749,10 +1753,11 @@ static struct ovl_entry *ovl_get_lowerstack(struct = super_block *sb, if (err) goto out_err; =20 - err =3D -ENOMEM; oe =3D ovl_alloc_entry(numlower); - if (!oe) + if (!oe) { + err =3D -ENOMEM; goto out_err; + } =20 for (i =3D 0; i < numlower; i++) { oe->lowerstack[i].dentry =3D dget(stack[i].dentry); @@ -1894,21 +1899,24 @@ static int ovl_fill_super(struct super_block *sb, v= oid *data, int silent) unsigned int numlower; int err; =20 - err =3D -EIO; - if (WARN_ON(sb->s_user_ns !=3D current_user_ns())) + if (WARN_ON(sb->s_user_ns !=3D current_user_ns())) { + err =3D -EIO; goto out; + } =20 sb->s_d_op =3D &ovl_dentry_operations; =20 - err =3D -ENOMEM; ofs =3D kzalloc(sizeof(struct ovl_fs), GFP_KERNEL); - if (!ofs) + if (!ofs) { + err =3D -ENOMEM; goto out; + } =20 - err =3D -ENOMEM; ofs->creator_cred =3D cred =3D prepare_creds(); - if (!cred) + if (!cred) { + err =3D -ENOMEM; goto out_err; + } =20 /* Is there a reason anyone would want not to share whiteouts? */ ofs->share_whiteout =3D true; @@ -1922,30 +1930,32 @@ static int ovl_fill_super(struct super_block *sb, v= oid *data, int silent) if (err) goto out_err; =20 - err =3D -EINVAL; if (!ofs->config.lowerdir) { if (!silent) pr_err("missing 'lowerdir'\n"); + err =3D -EINVAL; goto out_err; } =20 - err =3D -ENOMEM; splitlower =3D kstrdup(ofs->config.lowerdir, GFP_KERNEL); - if (!splitlower) + if (!splitlower) { + err =3D -ENOMEM; goto out_err; + } =20 - err =3D -EINVAL; numlower =3D ovl_split_lowerdirs(splitlower); if (numlower > OVL_MAX_STACK) { pr_err("too many lower directories, limit is %d\n", OVL_MAX_STACK); + err =3D -EINVAL; goto out_err; } =20 - err =3D -ENOMEM; layers =3D kcalloc(numlower + 1, sizeof(struct ovl_layer), GFP_KERNEL); - if (!layers) + if (!layers) { + err =3D -ENOMEM; goto out_err; + } =20 ofs->layers =3D layers; /* Layer 0 is reserved for upper even if there's no upper */ @@ -1969,9 +1979,9 @@ static int ovl_fill_super(struct super_block *sb, voi= d *data, int silent) if (ofs->config.upperdir) { struct super_block *upper_sb; =20 - err =3D -EINVAL; if (!ofs->config.workdir) { pr_err("missing 'workdir'\n"); + err =3D -EINVAL; goto out_err; } =20 @@ -2000,9 +2010,10 @@ static int ovl_fill_super(struct super_block *sb, vo= id *data, int silent) sb->s_time_gran =3D upper_sb->s_time_gran; } oe =3D ovl_get_lowerstack(sb, splitlower, numlower, ofs, layers); - err =3D PTR_ERR(oe); - if (IS_ERR(oe)) + if (IS_ERR(oe)) { + err =3D PTR_ERR(oe); goto out_err; + } =20 /* If the upper fs is nonexistent, we mark overlayfs r/o too */ if (!ovl_upper_mnt(ofs)) @@ -2054,10 +2065,11 @@ static int ovl_fill_super(struct super_block *sb, v= oid *data, int silent) sb->s_flags |=3D SB_POSIXACL; sb->s_iflags |=3D SB_I_SKIP_SYNC; =20 - err =3D -ENOMEM; root_dentry =3D ovl_get_root(sb, upperpath.dentry, oe); - if (!root_dentry) + if (!root_dentry) { + err =3D -ENOMEM; goto out_free_oe; + } =20 mntput(upperpath.mnt); kfree(splitlower); diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 923d66d131c1..4b9f09a274ae 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -851,8 +851,8 @@ static void ovl_cleanup_index(struct dentry *dentry) =20 inode_lock_nested(dir, I_MUTEX_PARENT); index =3D ovl_lookup_upper(ofs, name.name, indexdir, name.len); - err =3D PTR_ERR(index); if (IS_ERR(index)) { + err =3D PTR_ERR(index); index =3D NULL; } else if (ovl_index_all(dentry->d_sb)) { /* Whiteout orphan index to block future open by handle */ --=20 2.27.0