]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: create a default lock for mtab update
authorKarel Zak <kzak@redhat.com>
Mon, 28 Mar 2011 10:40:24 +0000 (12:40 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 28 Mar 2011 10:40:24 +0000 (12:40 +0200)
Now it's necessary to explicitly create a lock for mnt_update_table().
It seems better to create the lock in mnt_update_table() by default to
skip this extra step.

Reported-by: Jan Engelhardt <jengelh@medozas.de>
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/tab_update.c

index 47a3e5fe917ec64de7d736a28f82c607c1c5ecb8..9a56b67381a20d268a62066cd017bf082512f371 100644 (file)
@@ -85,7 +85,8 @@ void mnt_free_update(struct libmnt_update *upd)
 /*
  * Returns 0 on success, 1 if not file available, -1 in case of error.
  */
-int mnt_update_set_filename(struct libmnt_update *upd, const char *filename, int userspace_only)
+int mnt_update_set_filename(struct libmnt_update *upd, const char *filename,
+                           int userspace_only)
 {
        const char *path = NULL;
        int rw = 0;
@@ -785,6 +786,7 @@ static int update_modify_options(struct libmnt_update *upd, struct libmnt_lock *
  */
 int mnt_update_table(struct libmnt_update *upd, struct libmnt_lock *lc)
 {
+       struct libmnt_lock *lc0 = lc;
        int rc = -EINVAL;
 
        assert(upd);
@@ -799,6 +801,9 @@ int mnt_update_table(struct libmnt_update *upd, struct libmnt_lock *lc)
                DBG(UPDATE, mnt_fs_print_debug(upd->fs, stderr));
        }
 
+       if (!lc && !upd->userspace_only)
+               lc = mnt_new_lock(upd->filename, 0);
+
        if (!upd->fs && upd->target)
                rc = update_remove_entry(upd, lc);      /* umount */
        else if (upd->mountflags & MS_MOVE)
@@ -811,6 +816,10 @@ int mnt_update_table(struct libmnt_update *upd, struct libmnt_lock *lc)
        upd->ready = FALSE;
        DBG(UPDATE, mnt_debug_h(upd, "%s: update tab: done [rc=%d]",
                                upd->filename, rc));
+
+       if (lc != lc0)
+                mnt_free_lock(lc);
+
        return rc;
 }