当我上传一个文件(比如 755M)时,proftpd 报告“设备上没有剩余空间”
lftp localhost:/> put test.bin put:访问失败:552 791230988:设备上没有剩余空间(test.bin)
但是我运行 /bin/df -h,我可以看到仍然有 414G 可用。我的 ftp 根目录位于 /home/ftproot
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda4 ext4 1.8T 1.3T 414G 75% /home
所以我认为proftpd源代码存在一些错误。
在我检查了代码之后,找到了根本原因。
proftpd-dfsg-1.3.5~rc3/modules/mod_xfer.c +2381
2380 } else {
2381 if (requested_sz > avail_sz) {
2382 pr_log_debug(DEBUG5, "%s requested %" PR_LU " bytes, only %" PR_LU
2383 " bytes available on '%s'", cmd->argv[0], (pr_off_t) requested_sz,
2384 (pr_off_t) avail_sz, path);
2385 pr_response_add_err(R_552, "%s: %s", cmd->arg, strerror(ENOSPC));
2386 return PR_ERROR(cmd);
2387 }
2388 }
2389 }
在第 2381 行中,requesed_sz(791,230,988) 的单位是字节,但 avail_sz(435,293,500) 的单位是 kb
参见:proftpd-dfsg-1.3.5~rc3/src/fsio.c +4263
4259 /* In order to return a size in KB, as get_fs_size() does, we need
4260 * to divide by 1024.
4261 */
4262 *fs_size = (((off_t) fs.f_bavail * (off_t) fs.f_frsize) / 1024);
为了修复这个错误:
if (requested_sz > avail_sz) {
必须修改为
if (requested_sz > avail_sz * 1024) {
但是我不知道如何向 proftpd 开发团队报告错误,谁可以提交它 proftpd?