Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6178:66971adb55e5 HEAD
Added dotlock_try mbox lock.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 06 Aug 2007 19:29:16 +0300 |
parents | abec53314897 |
children | 5c6af3b74d5f |
files | dovecot-example.conf src/lib-storage/index/mbox/mbox-lock.c |
diffstat | 2 files changed, 23 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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.
--- 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 @@ 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 @@ 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 @@ 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 @@ 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; } @@ -278,6 +285,18 @@ 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 static int mbox_lock_flock(struct mbox_lock_context *ctx, int lock_type, time_t max_wait_time)