From ee4b50278e4471b7c64e619e13699c560502b81e Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Tue, 5 Jul 2022 14:24:03 +0300 Subject: [PATCH] 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 --- lustre/mdt/mdt_io.c | 28 +++++++++++++++++----------- lustre/ofd/ofd_io.c | 27 ++++++++++++++++----------- lustre/osd-ldiskfs/osd_handler.c | 2 ++ 3 files changed, 35 insertions(+), 22 deletions(-) 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 */ -- 1.8.3.1