Whamcloud - gitweb
LU-15993 ofd: don't leak pages if nodemap fails 73/47873/4
authorAlex Zhuravlev <bzzz@whamcloud.com>
Tue, 5 Jul 2022 11:24:03 +0000 (14:24 +0300)
committerOleg Drokin <green@whamcloud.com>
Mon, 18 Jul 2022 05:36:21 +0000 (05:36 +0000)
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 <bzzz@whamcloud.com>
Change-Id: Icd60c7ab80c5a7b65603d7da0d2e83872dc6b97f
Reviewed-on: https://review.whamcloud.com/47873
Reviewed-by: Sebastien Buisson <sbuisson@ddn.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdt/mdt_io.c
lustre/ofd/ofd_io.c
lustre/osd-ldiskfs/osd_handler.c

index 3892589..38b7ad1 100644 (file)
@@ -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)) {
index 8b79362..71fe365 100644 (file)
@@ -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 */
index 5e1c8bd..8d45211 100644 (file)
@@ -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 */