dovecot: Added dotlock_try mbox lock.
dovecot at dovecot.org
dovecot at dovecot.org
Mon Aug 6 19:29:20 EEST 2007
details: http://hg.dovecot.org/dovecot/rev/66971adb55e5
changeset: 6178:66971adb55e5
user: Timo Sirainen <tss at iki.fi>
date: Mon Aug 06 19:29:16 2007 +0300
description:
Added dotlock_try mbox lock.
diffstat:
2 files changed, 23 insertions(+), 2 deletions(-)
dovecot-example.conf | 2 ++
src/lib-storage/index/mbox/mbox-lock.c | 23 +++++++++++++++++++++--
diffs (80 lines):
diff -r abec53314897 -r 66971adb55e5 dovecot-example.conf
--- a/dovecot-example.conf Mon Aug 06 19:07:36 2007 +0300
+++ b/dovecot-example.conf Mon Aug 06 19:29:16 2007 +0300
@@ -453,6 +453,8 @@
# dotlock: Create <mailbox>.lock file. This is the oldest and most NFS-safe
# solution. If you want to use /var/mail/ like directory, the users
# will need write access to that directory.
+# dotlock_try: Same as dotlock, but if it fails because of permissions or
+# because there isn't enough disk space, just skip it.
# fcntl : Use this if possible. Works with NFS too if lockd is used.
# flock : May not exist in all systems. Doesn't work with NFS.
# lockf : May not exist in all systems. Doesn't work with NFS.
diff -r abec53314897 -r 66971adb55e5 src/lib-storage/index/mbox/mbox-lock.c
--- a/src/lib-storage/index/mbox/mbox-lock.c Mon Aug 06 19:07:36 2007 +0300
+++ b/src/lib-storage/index/mbox/mbox-lock.c Mon Aug 06 19:29:16 2007 +0300
@@ -30,6 +30,7 @@
enum mbox_lock_type {
MBOX_LOCK_DOTLOCK,
+ MBOX_LOCK_DOTLOCK_TRY,
MBOX_LOCK_FCNTL,
MBOX_LOCK_FLOCK,
MBOX_LOCK_LOCKF,
@@ -56,6 +57,8 @@ struct mbox_lock_data {
static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
time_t max_wait_time);
+static int mbox_lock_dotlock_try(struct mbox_lock_context *ctx, int lock_type,
+ time_t max_wait_time);
static int mbox_lock_fcntl(struct mbox_lock_context *ctx, int lock_type,
time_t max_wait_time);
#ifdef HAVE_FLOCK
@@ -73,6 +76,7 @@ static int mbox_lock_lockf(struct mbox_l
struct mbox_lock_data lock_data[] = {
{ MBOX_LOCK_DOTLOCK, "dotlock", mbox_lock_dotlock },
+ { MBOX_LOCK_DOTLOCK_TRY, "dotlock_try", mbox_lock_dotlock_try },
{ MBOX_LOCK_FCNTL, "fcntl", mbox_lock_fcntl },
{ MBOX_LOCK_FLOCK, "flock", mbox_lock_flock },
{ MBOX_LOCK_LOCKF, "lockf", mbox_lock_lockf },
@@ -229,8 +233,8 @@ static bool dotlock_callback(unsigned in
return TRUE;
}
-static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
- time_t max_wait_time __attr_unused__)
+static int
+mbox_lock_dotlock_int(struct mbox_lock_context *ctx, int lock_type, bool try)
{
struct mbox_mailbox *mbox = ctx->mbox;
struct dotlock_settings set;
@@ -263,6 +267,9 @@ static int mbox_lock_dotlock(struct mbox
ret = file_dotlock_create(&set, mbox->path, 0, &mbox->mbox_dotlock);
if (ret < 0) {
+ if ((ENOSPACE(errno) || errno == EACCES) && try)
+ return 1;
+
mbox_set_syscall_error(mbox, "file_lock_dotlock()");
return -1;
}
@@ -276,6 +283,18 @@ static int mbox_lock_dotlock(struct mbox
if (mbox_file_open_latest(ctx, lock_type) < 0)
return -1;
return 1;
+}
+
+static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
+ time_t max_wait_time __attr_unused__)
+{
+ return mbox_lock_dotlock_int(ctx, lock_type, FALSE);
+}
+
+static int mbox_lock_dotlock_try(struct mbox_lock_context *ctx, int lock_type,
+ time_t max_wait_time __attr_unused__)
+{
+ return mbox_lock_dotlock_int(ctx, lock_type, TRUE);
}
#ifdef HAVE_FLOCK
More information about the dovecot-cvs
mailing list