Whamcloud - gitweb
LU-2749 ofd: check return value of ofd_seq_load
authorNathaniel Clark <nathaniel.l.clark@intel.com>
Mon, 4 Feb 2013 21:07:38 +0000 (16:07 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 8 Feb 2013 23:23:28 +0000 (18:23 -0500)
Return value ofd_seq_load was not always checked for both NULL and
errno.  This caused a NULL pointer dereference.

Signed-off-by: Nathaniel Clark <nathaniel.l.clark@intel.com>
Change-Id: Ib2e1658f16ba2012c9410966c08201cab7a5aa5c
Reviewed-on: http://review.whamcloud.com/5263
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: wangdi <di.wang@intel.com>
lustre/ofd/ofd_fs.c
lustre/ofd/ofd_io.c
lustre/ofd/ofd_obd.c

index b1c7c98..9b61f58 100644 (file)
@@ -252,6 +252,10 @@ void ofd_seqs_fini(const struct lu_env *env, struct ofd_device *ofd)
        return;
 }
 
+/**
+ *
+ * \retval the seq with seq number or errno (never NULL)
+ */
 struct ofd_seq *ofd_seq_load(const struct lu_env *env, struct ofd_device *ofd,
                             obd_seq seq)
 {
@@ -323,7 +327,7 @@ struct ofd_seq *ofd_seq_load(const struct lu_env *env, struct ofd_device *ofd,
        }
 
        oseq = ofd_seq_add(env, ofd, oseq);
-       RETURN(oseq);
+       RETURN((oseq != NULL) ? oseq : ERR_PTR(-ENOENT));
 cleanup:
        ofd_seq_put(env, oseq);
        return ERR_PTR(rc);
index 7f72a17..043c7ed 100644 (file)
@@ -223,9 +223,10 @@ int ofd_preprw(const struct lu_env* env, int cmd, struct obd_export *exp,
        if (OBD_FAIL_CHECK(OBD_FAIL_OST_ENOENT)) {
                struct ofd_seq          *oseq;
                oseq = ofd_seq_load(env, ofd, oa->o_seq);
-               if (oseq == NULL) {
-                       CERROR("%s: Can not find seq for "LPU64":"LPU64"\n",
-                               ofd_name(ofd), oa->o_seq, oa->o_id);
+               if (IS_ERR(oseq)) {
+                       CERROR("%s: Can not find seq for "LPU64":"LPU64
+                              ": rc = %ld\n", ofd_name(ofd), oa->o_seq,
+                              oa->o_id, PTR_ERR(oseq));
                        RETURN(-EINVAL);
                }
 
index be76426..c20c071 100644 (file)
@@ -577,7 +577,7 @@ static int ofd_get_info(const struct lu_env *env, struct obd_export *exp,
                ofd_info_init(env, exp);
                oseq = ofd_seq_load(env, ofd,
                                    (obd_seq)exp->exp_filter_data.fed_group);
-               LASSERT(oseq != NULL);
+               LASSERT(!IS_ERR(oseq));
                if (last_id) {
                        if (*vallen < sizeof(*last_id)) {
                                ofd_seq_put(env, oseq);
@@ -1183,8 +1183,9 @@ int ofd_create(const struct lu_env *env, struct obd_export *exp,
               seq, oa->o_id);
 
        oseq = ofd_seq_load(env, ofd, seq);
-       if (oseq == NULL) {
-               CERROR("%s: Can't find oseq "LPX64"\n", ofd_name(ofd), seq);
+       if (IS_ERR(oseq)) {
+               CERROR("%s: Can't find FID Sequence "LPX64": rc = %ld\n",
+                      ofd_name(ofd), seq, PTR_ERR(oseq));
                RETURN(-EINVAL);
        }