From: Alex Zhuravlev Date: Tue, 5 Jul 2022 11:24:03 +0000 (+0300) Subject: LU-15993 ofd: don't leak pages if nodemap fails X-Git-Tag: 2.15.51~40 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=ee4b50278e4471b7c64e619e13699c560502b81e;p=fs%2Flustre-release.git LU-15993 ofd: don't leak pages if nodemap fails ofd_commitrw() shouldn't exit w/o calling ofd_commitrw_write(), otherwise the pages taken in ofd_preprw() are leaked. same in mdt_obd_commitrw() Fixes: bbfdc7c167 ("LU-14739 quota: fix quota with root squash enabled") Signed-off-by: Alex Zhuravlev Change-Id: Icd60c7ab80c5a7b65603d7da0d2e83872dc6b97f Reviewed-on: https://review.whamcloud.com/47873 Reviewed-by: Sebastien Buisson Tested-by: jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/mdt/mdt_io.c b/lustre/mdt/mdt_io.c index 3892589..38b7ad1 100644 --- a/lustre/mdt/mdt_io.c +++ b/lustre/mdt/mdt_io.c @@ -761,18 +761,24 @@ int mdt_obd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp, struct lu_nodemap *nodemap; __u32 mapped_uid, mapped_gid, mapped_projid; + mapped_uid = oa->o_uid; + mapped_gid = oa->o_gid; + mapped_projid = oa->o_projid; nodemap = nodemap_get_from_exp(exp); - if (IS_ERR(nodemap)) - RETURN(PTR_ERR(nodemap)); - mapped_uid = nodemap_map_id(nodemap, NODEMAP_UID, - NODEMAP_FS_TO_CLIENT, - oa->o_uid); - mapped_gid = nodemap_map_id(nodemap, NODEMAP_GID, - NODEMAP_FS_TO_CLIENT, - oa->o_gid); - mapped_projid = nodemap_map_id(nodemap, NODEMAP_PROJID, - NODEMAP_FS_TO_CLIENT, - oa->o_projid); + if (!IS_ERR(nodemap)) { + mapped_uid = nodemap_map_id(nodemap, NODEMAP_UID, + NODEMAP_FS_TO_CLIENT, + oa->o_uid); + mapped_gid = nodemap_map_id(nodemap, NODEMAP_GID, + NODEMAP_FS_TO_CLIENT, + oa->o_gid); + mapped_projid = nodemap_map_id(nodemap, NODEMAP_PROJID, + NODEMAP_FS_TO_CLIENT, + oa->o_projid); + } else if (old_rc == 0) { + old_rc = PTR_ERR(nodemap); + } + if (!IS_ERR_OR_NULL(nodemap)) { /* do not bypass quota enforcement if squashed uid */ if (unlikely(mapped_uid == nodemap->nm_squash_uid)) { diff --git a/lustre/ofd/ofd_io.c b/lustre/ofd/ofd_io.c index 8b79362..71fe365 100644 --- a/lustre/ofd/ofd_io.c +++ b/lustre/ofd/ofd_io.c @@ -1443,18 +1443,23 @@ int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp, ofd_counter_incr(exp, LPROC_OFD_STATS_WRITE, jobid, ktime_us_delta(ktime_get(), kstart)); + mapped_uid = oa->o_uid; + mapped_gid = oa->o_gid; + mapped_projid = oa->o_projid; nodemap = nodemap_get_from_exp(exp); - if (IS_ERR(nodemap)) - RETURN(PTR_ERR(nodemap)); - mapped_uid = nodemap_map_id(nodemap, NODEMAP_UID, - NODEMAP_FS_TO_CLIENT, - oa->o_uid); - mapped_gid = nodemap_map_id(nodemap, NODEMAP_GID, - NODEMAP_FS_TO_CLIENT, - oa->o_gid); - mapped_projid = nodemap_map_id(nodemap, NODEMAP_PROJID, - NODEMAP_FS_TO_CLIENT, - oa->o_projid); + if (!IS_ERR(nodemap)) { + mapped_uid = nodemap_map_id(nodemap, NODEMAP_UID, + NODEMAP_FS_TO_CLIENT, + oa->o_uid); + mapped_gid = nodemap_map_id(nodemap, NODEMAP_GID, + NODEMAP_FS_TO_CLIENT, + oa->o_gid); + mapped_projid = nodemap_map_id(nodemap, NODEMAP_PROJID, + NODEMAP_FS_TO_CLIENT, + oa->o_projid); + } else if (old_rc == 0) { + old_rc = PTR_ERR(nodemap); + } if (!IS_ERR_OR_NULL(nodemap)) { /* do not bypass quota enforcement if squashed uid */ diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 5e1c8bd..8d45211 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -7762,6 +7762,8 @@ static void osd_key_exit(const struct lu_context *ctx, LASSERT(info->oti_r_locks == 0); LASSERT(info->oti_w_locks == 0); LASSERT(info->oti_txns == 0); + LASSERTF(info->oti_dio_pages_used == 0, "%d\n", + info->oti_dio_pages_used); } /* type constructor/destructor: osd_type_init, osd_type_fini */