dovecot, virtiofs, fchown, invalid argument
Hello!
Dovecot version: 2.3.16 (7e2e900c1a)
dovecon -n
deliver_log_format = from=%{from}, envelope_sender=%{from_envelope},
subject=%{subject}, msgid=%m, size=%{size}, delivery_time=%{delivery_time}ms, %$ dict { acl = mysql:/etc/dovecot/dovecot-share-folder.conf lastlogin = mysql:/etc/dovecot/dovecot-last-login.conf quotadict = mysql:/etc/dovecot/dovecot-used-quota.conf } first_valid_uid = 2000 last_valid_uid = 2000 listen = * [::] lock_method = dotlock login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k session=<%{session}> mail_gid = 2000 mail_location = maildir:%Lh/Maildir/:INDEX=%Lh/Maildir/ mail_plugins = quota mailbox_alias acl mail_log notify mail_uid = 2000 managesieve_notify_capability = mailto managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext namespace { inbox = yes location = mailbox Archive { auto = no special_use = \Archive } mailbox Archives { auto = no special_use = \Archive } mailbox "Deleted Messages" { auto = no special_use = \Trash } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox "Junk E-mail" { auto = no special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox "Sent Items" { auto = no special_use = \Sent } mailbox "Sent Messages" { auto = no special_use = \Sent } mailbox Spam { auto = no special_use = \Junk } mailbox Trash { auto = subscribe special_use = \Trash } prefix = separator = / type = private } namespace { list = children location = maildir:%%Lh/Maildir/:INDEX=%%Lh/Maildir/Shared/%%Ld/%%Ln prefix = Shared/%%u/ separator = / subscriptions = yes type = shared } passdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } passdb { args = /etc/dovecot/dovecot-master-users driver = passwd-file master = yes } plugin { acl = vfile acl_shared_dict = proxy::acl last_login_dict = proxy::lastlogin last_login_key = # hidden, use -P to show it mail_log_events = delete undelete expunge copy mailbox_create mailbox_delete mailbox_rename mail_log_fields = uid box msgid size from subject flags mailbox_alias_new = Sent Messages mailbox_alias_new2 = Sent Items mailbox_alias_old = Sent mailbox_alias_old2 = Sent quota = dict:user::proxy::quotadict quota_grace = 10%% quota_status_nouser = DUNNO quota_status_overquota = 552 5.2.2 Mailbox is full quota_status_success = DUNNO quota_warning = storage=100%% quota-warning 100 %u quota_warning2 = storage=95%% quota-warning 95 %u quota_warning3 = storage=90%% quota-warning 90 %u quota_warning4 = storage=85%% quota-warning 85 %u sieve = ~/sieve/dovecot.sieve sieve_before = /var/vmail/sieve/dovecot.sieve sieve_dir = ~/sieve sieve_global_dir = /var/vmail/sieve sieve_max_redirects = 30 sieve_vacation_send_from_recipient = yes } protocols = pop3 imap sieve lmtp service auth { unix_listener /var/spool/postfix/private/dovecot-auth { group = postfix mode = 0666 user = postfix } unix_listener auth-master { group = vmail mode = 0666 user = vmail } unix_listener auth-userdb { group = vmail mode = 0660 user = vmail } } service decode2text { executable = script /usr/libexec/dovecot/decode2text.sh unix_listener decode2text { mode = 0666 } user = dovecot } service dict { unix_listener dict { group = vmail mode = 0660 user = vmail } } service imap-login { process_limit = 500 service_count = 1 } service indexer-worker { process_limit = 0 vsz_limit = 2 G } service lmtp { executable = lmtp -L inet_listener lmtp { address = 127.0.0.1 port = 24 } process_min_avail = 5 unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix } user = vmail } service managesieve-login { inet_listener sieve { address = 127.0.0.1 port = 4190 } } service pop3-login { service_count = 1 } service quota-status { client_limit = 1 executable = quota-status -p postfix inet_listener { address = 127.0.0.1 port = 12340 } } service quota-warning { executable = script /usr/local/bin/dovecot-quota-warning.sh unix_listener quota-warning { group = vmail mode = 0660 user = vmail } } service stats { fifo_listener stats-mail { group = vmail mode = 0664 user = vmail } inet_listener { address = 127.0.0.1 port = 24242 } unix_listener stats-writer { group = vmail mode = 0660 user = vmail } } ssl = required ssl_cert = </etc/pki/tls/certs/iRedMail.crt ssl_cipher_list = EECDH+CHACHA20:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH ssl_dh = # hidden, use -P to show it ssl_key = # hidden, use -P to show it ssl_prefer_server_ciphers = yes syslog_facility = local5 userdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } protocol lda { lda_mailbox_autocreate = yes lda_mailbox_autosubscribe = yes mail_plugins = quota mailbox_alias acl mail_log notify sieve last_login } protocol lmtp { lmtp_save_to_detail_mailbox = yes mail_plugins = quota mailbox_alias acl mail_log notify sieve last_login recipient_delimiter = + } protocol imap { imap_client_workarounds = tb-extra-mailbox-sep mail_max_userip_connections = 30 mail_plugins = quota mailbox_alias acl mail_log notify imap_quota imap_acl last_login } protocol pop3 { mail_max_userip_connections = 30 mail_plugins = quota mailbox_alias acl mail_log notify last_login pop3_client_workarounds = outlook-no-nuls oe-ns-eoh pop3_uidl_format = %08Xu%08Xv }
We are using virtiofs share mounted to /var/vmail When dovecot tries to make a directory structure, it fails with error - fchown: Invalid argument
strace doveadm mailbox create -u testuser@testdomain.com Trash ... mkdir("/var/vmail/vmail1/ testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash", 0700) = 0 umask(077) = 000 openat(AT_FDCWD, "/var/vmail/vmail1/ testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash", O_RDONLY) = 11 fchown(11, -1, -1) = -1 EINVAL (Invalid argument) close(11) = 0 rmdir("/var/vmail/vmail1/ testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash") = 0 ... So there is no permission issue, directory successfully created. It seems that virtiofs not allowing uid=-1 and gid=-1
I write a small C program for testing. And when using fchown($FileDescriptor, 2000, 2000) there is no error.
I can't find a way to tell dovecot to use uid & gid 2000 when he tries to do fchown.
If I create a directory structure manually, everything works well.
Maybe we can make some parameter in config, telling that we are using virtiofs and skip EINVAL when doing fchown...
On 26. Nov 2024, at 15.34, Кирилл Шигапов via dovecot <dovecot@dovecot.org> wrote:
We are using virtiofs share mounted to /var/vmail When dovecot tries to make a directory structure, it fails with error - fchown: Invalid argument
strace doveadm mailbox create -u testuser@testdomain.com <mailto:testuser@testdomain.com> Trash ... mkdir("/var/vmail/vmail1/ testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash <http://testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash>", 0700) = 0 umask(077) = 000 openat(AT_FDCWD, "/var/vmail/vmail1/ testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash <http://testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash>", O_RDONLY) = 11 fchown(11, -1, -1) = -1 EINVAL (Invalid argument) close(11) = 0 rmdir("/var/vmail/vmail1/ testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash <http://testdomain.com/t/e/s/testuser-2024.11.25.12.58.50//Maildir/.Trash>") = 0 ... So there is no permission issue, directory successfully created. It seems that virtiofs not allowing uid=-1 and gid=-1
I write a small C program for testing. And when using fchown($FileDescriptor, 2000, 2000) there is no error.
Did you try to fchown() a directory file descriptor or a regular file? I've a feeling it doesn't work for directory fds.
I can't find a way to tell dovecot to use uid & gid 2000 when he tries to do fchown.
If I create a directory structure manually, everything works well.
Maybe we can make some parameter in config, telling that we are using virtiofs and skip EINVAL when doing fchown...
It's completely unnecessary to do fchown(fd, -1, -1). It doesn't do anything. This patch perhaps helps? : diff --git a/src/lib/mkdir-parents.c b/src/lib/mkdir-parents.c index 64f660df3e..f2de0ccd09 100644 --- a/src/lib/mkdir-parents.c +++ b/src/lib/mkdir-parents.c @@ -34,6 +34,11 @@ mkdir_chown_full(const char *path, mode_t mode, uid_t uid, umask(old_mask); if (ret < 0) break; + if (uid == (uid_t)-1 && gid == (gid_t)-1) { + /* no changes to owner/group */ + return 0; + } + fd = open(path, O_RDONLY); if (fd != -1) break;
As I can see, this patch already commited in git repository. Thank you! Is there any info, when the new release will be available with this patch ?
participants (3)
-
k.shigapov@gmail.com
-
Timo Sirainen
-
Кирилл Шигапов