From: Timo Sirainen Date: Tue, 23 Nov 2010 15:59:09 +0000 (+0000) Subject: lib-storage: If disable_reflink_copy_to=TRUE, disable hardlink/refcount copying. X-Git-Tag: 2.0.8~53 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7f735cb86b2d8abd8f230089065eacfc24e9e5d6;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: If disable_reflink_copy_to=TRUE, disable hardlink/refcount copying. --- diff --git a/src/lib-storage/index/dbox-multi/mdbox-save.c b/src/lib-storage/index/dbox-multi/mdbox-save.c index 1f69f1b678..f21507ae49 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-save.c +++ b/src/lib-storage/index/dbox-multi/mdbox-save.c @@ -408,7 +408,8 @@ int mdbox_copy(struct mail_save_context *_ctx, struct mail *mail) ctx->ctx.finished = TRUE; - if (mail->box->storage != _ctx->transaction->box->storage) + if (mail->box->storage != _ctx->transaction->box->storage || + _ctx->transaction->box->disable_reflink_copy_to) return mail_storage_copy(_ctx, mail); src_mbox = (struct mdbox_mailbox *)mail->box; diff --git a/src/lib-storage/index/dbox-single/sdbox-copy.c b/src/lib-storage/index/dbox-single/sdbox-copy.c index e71a789a0f..3e438f05ed 100644 --- a/src/lib-storage/index/dbox-single/sdbox-copy.c +++ b/src/lib-storage/index/dbox-single/sdbox-copy.c @@ -138,13 +138,6 @@ sdbox_copy_hardlink(struct mail_save_context *_ctx, struct mail *mail) return 1; } -static bool -sdbox_compatible_file_modes(struct mailbox *box1, struct mailbox *box2) -{ - return box1->file_create_mode == box2->file_create_mode && - box1->file_create_gid == box2->file_create_gid; -} - int sdbox_copy(struct mail_save_context *_ctx, struct mail *mail) { struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx; @@ -155,7 +148,7 @@ int sdbox_copy(struct mail_save_context *_ctx, struct mail *mail) i_assert((_t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0); ctx->finished = TRUE; - if (sdbox_compatible_file_modes(&mbox->box, mail->box)) { + if (mail_storage_copy_can_use_hardlink(mail->box, &mbox->box)) { T_BEGIN { ret = sdbox_copy_hardlink(_ctx, mail); } T_END; diff --git a/src/lib-storage/index/maildir/maildir-copy.c b/src/lib-storage/index/maildir/maildir-copy.c index 2703ea1736..52f0d56fd5 100644 --- a/src/lib-storage/index/maildir/maildir-copy.c +++ b/src/lib-storage/index/maildir/maildir-copy.c @@ -122,13 +122,6 @@ maildir_copy_hardlink(struct mail_save_context *ctx, struct mail *mail) return 1; } -static bool -maildir_compatible_file_modes(struct mailbox *box1, struct mailbox *box2) -{ - return box1->file_create_mode == box2->file_create_mode && - box1->file_create_gid == box2->file_create_gid; -} - int maildir_copy(struct mail_save_context *ctx, struct mail *mail) { struct mailbox_transaction_context *_t = ctx->transaction; @@ -138,7 +131,7 @@ int maildir_copy(struct mail_save_context *ctx, struct mail *mail) i_assert((_t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0); if (mbox->storage->set->maildir_copy_with_hardlinks && - maildir_compatible_file_modes(&mbox->box, mail->box)) { + mail_storage_copy_can_use_hardlink(mail->box, &mbox->box)) { T_BEGIN { ret = maildir_copy_hardlink(ctx, mail); } T_END; diff --git a/src/lib-storage/mail-copy.c b/src/lib-storage/mail-copy.c index 8efb0e2dc8..287bee2a3c 100644 --- a/src/lib-storage/mail-copy.c +++ b/src/lib-storage/mail-copy.c @@ -74,3 +74,11 @@ int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail) } return mailbox_save_finish(&ctx); } + +bool mail_storage_copy_can_use_hardlink(struct mailbox *src, + struct mailbox *dest) +{ + return src->file_create_mode == src->file_create_mode && + src->file_create_gid == src->file_create_gid && + !dest->disable_reflink_copy_to; +} diff --git a/src/lib-storage/mail-copy.h b/src/lib-storage/mail-copy.h index 0f937ffe25..94f6919671 100644 --- a/src/lib-storage/mail-copy.h +++ b/src/lib-storage/mail-copy.h @@ -3,7 +3,13 @@ struct mail; struct mail_save_context; +struct mailbox; int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail); +/* Returns TRUE if mail can be copied using hard linking from src to dest. + (Assuming the storage itself supports this.) */ +bool mail_storage_copy_can_use_hardlink(struct mailbox *src, + struct mailbox *dest); + #endif diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 720ff4dc33..a72024e512 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -284,6 +284,10 @@ struct mailbox { unsigned int inbox_user:1; /* TRUE if this is an INBOX for this namespace (user or shared) */ unsigned int inbox_any:1; + /* When copying to this mailbox, require that mailbox_copy() uses + mailbox_save_*() to actually save a new physical copy rather than + simply incrementing a reference count (e.g. via hard link) */ + unsigned int disable_reflink_copy_to:1; }; struct mail_vfuncs {