rangelock.c (204076) | rangelock.c (225787) |
---|---|
1/*- 2 * Copyright (c) 2010 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Pawel Jakub Dawidek under sponsorship from 6 * the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2010 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Pawel Jakub Dawidek under sponsorship from 6 * the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sbin/hastd/rangelock.c 204076 2010-02-18 23:16:19Z pjd $"); | 31__FBSDID("$FreeBSD: head/sbin/hastd/rangelock.c 225787 2011-09-27 08:50:37Z pjd $"); |
32 33#include <sys/queue.h> 34 | 32 33#include <sys/queue.h> 34 |
35#include <assert.h> | |
36#include <stdbool.h> 37#include <stdlib.h> 38#include <unistd.h> 39 | 35#include <stdbool.h> 36#include <stdlib.h> 37#include <unistd.h> 38 |
39#include <pjdlog.h> 40 |
|
40#include "rangelock.h" 41 | 41#include "rangelock.h" 42 |
43#ifndef PJDLOG_ASSERT 44#include <assert.h> 45#define PJDLOG_ASSERT(...) assert(__VA_ARGS__) 46#endif 47 |
|
42#define RANGELOCKS_MAGIC 0x94310c 43struct rangelocks { 44 int rls_magic; /* Magic value. */ 45 TAILQ_HEAD(, rlock) rls_locks; /* List of locked ranges. */ 46}; 47 48struct rlock { 49 off_t rl_start; 50 off_t rl_end; 51 TAILQ_ENTRY(rlock) rl_next; 52}; 53 54int 55rangelock_init(struct rangelocks **rlsp) 56{ 57 struct rangelocks *rls; 58 | 48#define RANGELOCKS_MAGIC 0x94310c 49struct rangelocks { 50 int rls_magic; /* Magic value. */ 51 TAILQ_HEAD(, rlock) rls_locks; /* List of locked ranges. */ 52}; 53 54struct rlock { 55 off_t rl_start; 56 off_t rl_end; 57 TAILQ_ENTRY(rlock) rl_next; 58}; 59 60int 61rangelock_init(struct rangelocks **rlsp) 62{ 63 struct rangelocks *rls; 64 |
59 assert(rlsp != NULL); | 65 PJDLOG_ASSERT(rlsp != NULL); |
60 61 rls = malloc(sizeof(*rls)); 62 if (rls == NULL) 63 return (-1); 64 65 TAILQ_INIT(&rls->rls_locks); 66 67 rls->rls_magic = RANGELOCKS_MAGIC; 68 *rlsp = rls; 69 70 return (0); 71} 72 73void 74rangelock_free(struct rangelocks *rls) 75{ 76 struct rlock *rl; 77 | 66 67 rls = malloc(sizeof(*rls)); 68 if (rls == NULL) 69 return (-1); 70 71 TAILQ_INIT(&rls->rls_locks); 72 73 rls->rls_magic = RANGELOCKS_MAGIC; 74 *rlsp = rls; 75 76 return (0); 77} 78 79void 80rangelock_free(struct rangelocks *rls) 81{ 82 struct rlock *rl; 83 |
78 assert(rls->rls_magic == RANGELOCKS_MAGIC); | 84 PJDLOG_ASSERT(rls->rls_magic == RANGELOCKS_MAGIC); |
79 80 rls->rls_magic = 0; 81 82 while ((rl = TAILQ_FIRST(&rls->rls_locks)) != NULL) { 83 TAILQ_REMOVE(&rls->rls_locks, rl, rl_next); 84 free(rl); 85 } 86 free(rls); 87} 88 89int 90rangelock_add(struct rangelocks *rls, off_t offset, off_t length) 91{ 92 struct rlock *rl; 93 | 85 86 rls->rls_magic = 0; 87 88 while ((rl = TAILQ_FIRST(&rls->rls_locks)) != NULL) { 89 TAILQ_REMOVE(&rls->rls_locks, rl, rl_next); 90 free(rl); 91 } 92 free(rls); 93} 94 95int 96rangelock_add(struct rangelocks *rls, off_t offset, off_t length) 97{ 98 struct rlock *rl; 99 |
94 assert(rls->rls_magic == RANGELOCKS_MAGIC); | 100 PJDLOG_ASSERT(rls->rls_magic == RANGELOCKS_MAGIC); |
95 96 rl = malloc(sizeof(*rl)); 97 if (rl == NULL) 98 return (-1); 99 rl->rl_start = offset; 100 rl->rl_end = offset + length; 101 TAILQ_INSERT_TAIL(&rls->rls_locks, rl, rl_next); 102 return (0); 103} 104 105void 106rangelock_del(struct rangelocks *rls, off_t offset, off_t length) 107{ 108 struct rlock *rl; 109 | 101 102 rl = malloc(sizeof(*rl)); 103 if (rl == NULL) 104 return (-1); 105 rl->rl_start = offset; 106 rl->rl_end = offset + length; 107 TAILQ_INSERT_TAIL(&rls->rls_locks, rl, rl_next); 108 return (0); 109} 110 111void 112rangelock_del(struct rangelocks *rls, off_t offset, off_t length) 113{ 114 struct rlock *rl; 115 |
110 assert(rls->rls_magic == RANGELOCKS_MAGIC); | 116 PJDLOG_ASSERT(rls->rls_magic == RANGELOCKS_MAGIC); |
111 112 TAILQ_FOREACH(rl, &rls->rls_locks, rl_next) { 113 if (rl->rl_start == offset && rl->rl_end == offset + length) 114 break; 115 } | 117 118 TAILQ_FOREACH(rl, &rls->rls_locks, rl_next) { 119 if (rl->rl_start == offset && rl->rl_end == offset + length) 120 break; 121 } |
116 assert(rl != NULL); | 122 PJDLOG_ASSERT(rl != NULL); |
117 TAILQ_REMOVE(&rls->rls_locks, rl, rl_next); 118 free(rl); 119} 120 121bool 122rangelock_islocked(struct rangelocks *rls, off_t offset, off_t length) 123{ 124 struct rlock *rl; 125 | 123 TAILQ_REMOVE(&rls->rls_locks, rl, rl_next); 124 free(rl); 125} 126 127bool 128rangelock_islocked(struct rangelocks *rls, off_t offset, off_t length) 129{ 130 struct rlock *rl; 131 |
126 assert(rls->rls_magic == RANGELOCKS_MAGIC); | 132 PJDLOG_ASSERT(rls->rls_magic == RANGELOCKS_MAGIC); |
127 128 TAILQ_FOREACH(rl, &rls->rls_locks, rl_next) { 129 if (rl->rl_start >= offset && rl->rl_start < offset + length) 130 break; 131 else if (rl->rl_end > offset && rl->rl_end <= offset + length) 132 break; 133 else if (rl->rl_start < offset && rl->rl_end > offset + length) 134 break; 135 } 136 return (rl != NULL); 137} | 133 134 TAILQ_FOREACH(rl, &rls->rls_locks, rl_next) { 135 if (rl->rl_start >= offset && rl->rl_start < offset + length) 136 break; 137 else if (rl->rl_end > offset && rl->rl_end <= offset + length) 138 break; 139 else if (rl->rl_start < offset && rl->rl_end > offset + length) 140 break; 141 } 142 return (rl != NULL); 143} |