Whamcloud - gitweb
LU-14214 ofd: fix locking in ofd_object_fallocate() 69/40969/2
authorAlex Zhuravlev <bzzz@whamcloud.com>
Tue, 15 Dec 2020 05:44:59 +0000 (08:44 +0300)
committerOleg Drokin <green@whamcloud.com>
Tue, 22 Dec 2020 05:28:32 +0000 (05:28 +0000)
the rule is that locks are taken after transaction start.

Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: I5252be0033611f03b355c1f98e21422cdde55c9e
Reviewed-on: https://review.whamcloud.com/40969
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Wang Shilong <wshilong@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/ofd/ofd_objects.c

index 5ac4b74..8c1b21a 100644 (file)
@@ -770,26 +770,25 @@ int ofd_object_fallocate(const struct lu_env *env, struct ofd_object *fo,
 
        ENTRY;
 
 
        ENTRY;
 
-       ofd_write_lock(env, fo);
        if (!ofd_object_exists(fo))
        if (!ofd_object_exists(fo))
-               GOTO(unlock, rc = -ENOENT);
+               RETURN(-ENOENT);
 
        /* VBR: version recovery check */
        rc = ofd_version_get_check(info, fo);
        if (rc != 0)
 
        /* VBR: version recovery check */
        rc = ofd_version_get_check(info, fo);
        if (rc != 0)
-               GOTO(unlock, rc);
+               RETURN(rc);
 
        if (ff != NULL) {
                rc = ofd_object_ff_load(env, fo);
                if (rc == -ENODATA)
                        ff_needed = true;
                else if (rc < 0)
 
        if (ff != NULL) {
                rc = ofd_object_ff_load(env, fo);
                if (rc == -ENODATA)
                        ff_needed = true;
                else if (rc < 0)
-                       GOTO(unlock, rc);
+                       RETURN(rc);
        }
 
        th = ofd_trans_create(env, ofd);
        if (IS_ERR(th))
        }
 
        th = ofd_trans_create(env, ofd);
        if (IS_ERR(th))
-               GOTO(unlock, rc = PTR_ERR(th));
+               RETURN(PTR_ERR(th));
 
        rc = dt_declare_attr_set(env, dob, la, th);
        if (rc)
 
        rc = dt_declare_attr_set(env, dob, la, th);
        if (rc)
@@ -803,13 +802,17 @@ int ofd_object_fallocate(const struct lu_env *env, struct ofd_object *fo,
        if (rc)
                GOTO(stop, rc);
 
        if (rc)
                GOTO(stop, rc);
 
+       ofd_write_lock(env, fo);
+       if (!ofd_object_exists(fo))
+               GOTO(unlock, rc = -ENOENT);
+
        rc = dt_falloc(env, dob, start, end, mode, th);
        if (rc)
        rc = dt_falloc(env, dob, start, end, mode, th);
        if (rc)
-               GOTO(stop, rc);
+               GOTO(unlock, rc);
 
        rc = dt_attr_set(env, dob, la, th);
        if (rc)
 
        rc = dt_attr_set(env, dob, la, th);
        if (rc)
-               GOTO(stop, rc);
+               GOTO(unlock, rc);
 
        if (ff_needed) {
                rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf,
 
        if (ff_needed) {
                rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf,
@@ -817,10 +820,10 @@ int ofd_object_fallocate(const struct lu_env *env, struct ofd_object *fo,
                if (!rc)
                        filter_fid_le_to_cpu(&fo->ofo_ff, ff, sizeof(*ff));
        }
                if (!rc)
                        filter_fid_le_to_cpu(&fo->ofo_ff, ff, sizeof(*ff));
        }
-stop:
-       ofd_trans_stop(env, ofd, th, rc);
 unlock:
        ofd_write_unlock(env, fo);
 unlock:
        ofd_write_unlock(env, fo);
+stop:
+       ofd_trans_stop(env, ofd, th, rc);
        RETURN(rc);
 }
 
        RETURN(rc);
 }