]> xenbits.xensource.com Git - libvirt.git/commitdiff
virlockspace: Allow caller to specify start and length offset in virLockSpaceAcquireR...
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 14 Aug 2018 10:25:36 +0000 (12:25 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 18 Sep 2018 15:12:53 +0000 (17:12 +0200)
So far the virLockSpaceAcquireResource() locks the first byte in
the underlying file. But caller might want to lock other range.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/locking/lock_daemon_dispatch.c
src/util/virlockspace.c
src/util/virlockspace.h
tests/virlockspacetest.c

index 1b479db55dd47489a202911979bc951693777fc5..10248ec0b576870cfe09f34e734ea7eaa24ee66d 100644 (file)
@@ -50,6 +50,8 @@ virLockSpaceProtocolDispatchAcquireResource(virNetServerPtr server ATTRIBUTE_UNU
         virNetServerClientGetPrivateData(client);
     virLockSpacePtr lockspace;
     unsigned int newFlags;
+    off_t start = 0;
+    off_t len = 1;
 
     virMutexLock(&priv->lock);
 
@@ -84,6 +86,7 @@ virLockSpaceProtocolDispatchAcquireResource(virNetServerPtr server ATTRIBUTE_UNU
     if (virLockSpaceAcquireResource(lockspace,
                                     args->name,
                                     priv->ownerPid,
+                                    start, len,
                                     newFlags) < 0)
         goto cleanup;
 
index 3364c843aa72d344a69955f23a1d45ea11732241..60bfef4c5f1ee21ba24b8af976579f1f555c7b7e 100644 (file)
@@ -115,8 +115,10 @@ static void virLockSpaceResourceFree(virLockSpaceResourcePtr res)
 static virLockSpaceResourcePtr
 virLockSpaceResourceNew(virLockSpacePtr lockspace,
                         const char *resname,
-                        unsigned int flags,
-                        pid_t owner)
+                        pid_t owner,
+                        off_t start,
+                        off_t len,
+                        unsigned int flags)
 {
     virLockSpaceResourcePtr res;
     bool shared = !!(flags & VIR_LOCK_SPACE_ACQUIRE_SHARED);
@@ -157,7 +159,7 @@ virLockSpaceResourceNew(virLockSpacePtr lockspace,
                 goto error;
             }
 
-            if (virFileLock(res->fd, shared, 0, 1, false) < 0) {
+            if (virFileLock(res->fd, shared, start, len, false) < 0) {
                 if (errno == EACCES || errno == EAGAIN) {
                     virReportError(VIR_ERR_RESOURCE_BUSY,
                                    _("Lockspace resource '%s' is locked"),
@@ -204,7 +206,7 @@ virLockSpaceResourceNew(virLockSpacePtr lockspace,
             goto error;
         }
 
-        if (virFileLock(res->fd, shared, 0, 1, false) < 0) {
+        if (virFileLock(res->fd, shared, start, len, false) < 0) {
             if (errno == EACCES || errno == EAGAIN) {
                 virReportError(VIR_ERR_RESOURCE_BUSY,
                                _("Lockspace resource '%s' is locked"),
@@ -612,6 +614,8 @@ int virLockSpaceDeleteResource(virLockSpacePtr lockspace,
 int virLockSpaceAcquireResource(virLockSpacePtr lockspace,
                                 const char *resname,
                                 pid_t owner,
+                                off_t start,
+                                off_t len,
                                 unsigned int flags)
 {
     int ret = -1;
@@ -641,7 +645,8 @@ int virLockSpaceAcquireResource(virLockSpacePtr lockspace,
         goto cleanup;
     }
 
-    if (!(res = virLockSpaceResourceNew(lockspace, resname, flags, owner)))
+    if (!(res = virLockSpaceResourceNew(lockspace, resname,
+                                        owner, start, len, flags)))
         goto cleanup;
 
     if (virHashAddEntry(lockspace->resources, resname, res) < 0) {
index 041cf203968ae0c8f331e15cf4a1789399138afe..24f2c89be6bd34a1f28f1b4c551182942291b537 100644 (file)
@@ -22,6 +22,8 @@
 #ifndef __VIR_LOCK_SPACE_H__
 # define __VIR_LOCK_SPACE_H__
 
+# include <sys/types.h>
+
 # include "internal.h"
 # include "virjson.h"
 
@@ -50,6 +52,8 @@ typedef enum {
 int virLockSpaceAcquireResource(virLockSpacePtr lockspace,
                                 const char *resname,
                                 pid_t owner,
+                                off_t start,
+                                off_t len,
                                 unsigned int flags);
 
 int virLockSpaceReleaseResource(virLockSpacePtr lockspace,
index 75ad98a02cc0903fc739e40c1e862d83718f831e..2409809353bcb7eedf84c6f363af5a42022445ab 100644 (file)
@@ -99,6 +99,8 @@ static int testLockSpaceResourceLockExcl(const void *args ATTRIBUTE_UNUSED)
 {
     virLockSpacePtr lockspace;
     int ret = -1;
+    const off_t start = 0;
+    const off_t len = 1;
 
     rmdir(LOCKSPACE_DIR);
 
@@ -111,13 +113,13 @@ static int testLockSpaceResourceLockExcl(const void *args ATTRIBUTE_UNUSED)
     if (virLockSpaceCreateResource(lockspace, "foo") < 0)
         goto cleanup;
 
-    if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), 0) < 0)
+    if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), start, len, 0) < 0)
         goto cleanup;
 
     if (!virFileExists(LOCKSPACE_DIR "/foo"))
         goto cleanup;
 
-    if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), 0) == 0)
+    if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), start, len, 0) == 0)
         goto cleanup;
 
     if (virLockSpaceDeleteResource(lockspace, "foo") == 0)
@@ -145,6 +147,8 @@ static int testLockSpaceResourceLockExclAuto(const void *args ATTRIBUTE_UNUSED)
 {
     virLockSpacePtr lockspace;
     int ret = -1;
+    const off_t start = 0;
+    const off_t len = 1;
 
     rmdir(LOCKSPACE_DIR);
 
@@ -158,6 +162,7 @@ static int testLockSpaceResourceLockExclAuto(const void *args ATTRIBUTE_UNUSED)
         goto cleanup;
 
     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
+                                    start, len,
                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) < 0)
         goto cleanup;
 
@@ -183,6 +188,8 @@ static int testLockSpaceResourceLockShr(const void *args ATTRIBUTE_UNUSED)
 {
     virLockSpacePtr lockspace;
     int ret = -1;
+    const off_t start = 0;
+    const off_t len = 1;
 
     rmdir(LOCKSPACE_DIR);
 
@@ -196,13 +203,16 @@ static int testLockSpaceResourceLockShr(const void *args ATTRIBUTE_UNUSED)
         goto cleanup;
 
     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
+                                    start, len,
                                     VIR_LOCK_SPACE_ACQUIRE_SHARED) < 0)
         goto cleanup;
 
-    if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(), 0) == 0)
+    if (virLockSpaceAcquireResource(lockspace, "foo",
+                                    geteuid(), start, len, 0) == 0)
         goto cleanup;
 
     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
+                                    start, len,
                                     VIR_LOCK_SPACE_ACQUIRE_SHARED) < 0)
         goto cleanup;
 
@@ -237,6 +247,8 @@ static int testLockSpaceResourceLockShrAuto(const void *args ATTRIBUTE_UNUSED)
 {
     virLockSpacePtr lockspace;
     int ret = -1;
+    const off_t start = 0;
+    const off_t len = 1;
 
     rmdir(LOCKSPACE_DIR);
 
@@ -250,6 +262,7 @@ static int testLockSpaceResourceLockShrAuto(const void *args ATTRIBUTE_UNUSED)
         goto cleanup;
 
     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
+                                    start, len,
                                     VIR_LOCK_SPACE_ACQUIRE_SHARED |
                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) < 0)
         goto cleanup;
@@ -258,6 +271,7 @@ static int testLockSpaceResourceLockShrAuto(const void *args ATTRIBUTE_UNUSED)
         goto cleanup;
 
     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
+                                    start, len,
                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) == 0)
         goto cleanup;
 
@@ -265,6 +279,7 @@ static int testLockSpaceResourceLockShrAuto(const void *args ATTRIBUTE_UNUSED)
         goto cleanup;
 
     if (virLockSpaceAcquireResource(lockspace, "foo", geteuid(),
+                                    start, len,
                                     VIR_LOCK_SPACE_ACQUIRE_SHARED |
                                     VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE) < 0)
         goto cleanup;
@@ -297,6 +312,8 @@ static int testLockSpaceResourceLockPath(const void *args ATTRIBUTE_UNUSED)
 {
     virLockSpacePtr lockspace;
     int ret = -1;
+    const off_t start = 0;
+    const off_t len = 1;
 
     rmdir(LOCKSPACE_DIR);
 
@@ -309,13 +326,15 @@ static int testLockSpaceResourceLockPath(const void *args ATTRIBUTE_UNUSED)
     if (virLockSpaceCreateResource(lockspace, LOCKSPACE_DIR "/foo") < 0)
         goto cleanup;
 
-    if (virLockSpaceAcquireResource(lockspace, LOCKSPACE_DIR "/foo", geteuid(), 0) < 0)
+    if (virLockSpaceAcquireResource(lockspace, LOCKSPACE_DIR "/foo",
+                                    geteuid(), start, len, 0) < 0)
         goto cleanup;
 
     if (!virFileExists(LOCKSPACE_DIR "/foo"))
         goto cleanup;
 
-    if (virLockSpaceAcquireResource(lockspace, LOCKSPACE_DIR "/foo", geteuid(), 0) == 0)
+    if (virLockSpaceAcquireResource(lockspace, LOCKSPACE_DIR "/foo",
+                                    geteuid(), start, len, 0) == 0)
         goto cleanup;
 
     if (virLockSpaceDeleteResource(lockspace, LOCKSPACE_DIR "/foo") == 0)