The current release of CUPS does not have this problem. And unfortunately we do not have time to re-develop "fixes" for old CUPS releases that we no longer support in order to work around a design deficiency in a Linux-specific monitoring application which should not be using 15-minute lease times in the first place.
On Nov 8, 2013, at 7:14 AM, Hao-Ran Liu <1244...@bugs.launchpad.net> wrote: > I think a fix for this bug could be limited in this function: > cupsdCloseCreatedConfFile(). Is there any concern if the logics of > secure erase (overwrite_data() and fsync()) are removed from > cupsdCloseCreatedConfFile()? > > It's desirable to have a small diff so that we could have a SRU for > precise. > > -- > You received this bug notification because you are subscribed to the bug > report. > https://bugs.launchpad.net/bugs/1244205 > > Title: > cupsd wakes up the hard disk every 14 minutes > > Status in The Ubuntu Power Consumption Project: > New > Status in “cups” package in Ubuntu: > New > Status in “indicator-printers” package in Ubuntu: > New > > Bug description: > cupsd calls fsync() on /etc/subscriptions.conf.N every 14~15 minutes. > This causes the hard disk to wake up soon after it spins down. > Subscription renewal is from indicator-printers every 15 minutes. > > I think we don't need cupsdRemoveFile() to always overwrite data and do a > fsync() for this file. Currently only Precise is confirmed to be affected. > Saucy seems not having the same issue according to > > (http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/saucy/cups/saucy/view/head:/scheduler/file.c#L149) > > ---- block_dump from the kernel ---- > <7>[19935.646436] cupsd(1066): dirtied inode 15336755 (subscriptions.conf.N) > on sda3 > <7>[19935.646673] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors) > <7>[19935.646755] cupsd(1066): dirtied inode 15335603 (?) on sda3 > <7>[19935.646763] cupsd(1066): dirtied inode 15335603 (?) on sda3 > <7>[19935.646776] cupsd(1066): WRITE block 352701128 on sda3 (8 sectors) > <7>[20774.607856] cupsd(1066): dirtied inode 15335603 (subscriptions.conf.N) > on sda3 > <7>[20774.608034] cupsd(1066): WRITE block 352862776 on sda3 (8 sectors) > <7>[20774.608113] cupsd(1066): dirtied inode 15335607 (?) on sda3 > <7>[20774.608120] cupsd(1066): dirtied inode 15335607 (?) on sda3 > <7>[20774.608133] cupsd(1066): WRITE block 352753008 on sda3 (8 sectors) > <7>[21613.569033] cupsd(1066): dirtied inode 15335607 (subscriptions.conf.N) > on sda3 > <7>[21613.569257] cupsd(1066): WRITE block 352753024 on sda3 (8 sectors) > <7>[21613.569345] cupsd(1066): dirtied inode 15336755 (?) on sda3 > <7>[21613.569353] cupsd(1066): dirtied inode 15336755 (?) on sda3 > <7>[21613.569367] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors) > > ---- cups: scheduler/file.c ---- > int /* O - 0 on success, -1 on error */ > cupsdCloseCreatedConfFile( > cups_file_t *fp, /* I - File to close */ > const char *filename) /* I - Filename */ > { > ... > snprintf(newfile, sizeof(newfile), "%s.N", filename); > snprintf(oldfile, sizeof(oldfile), "%s.O", filename); > > if ((cupsdRemoveFile(oldfile) && errno != ENOENT) || > (rename(filename, oldfile) && errno != ENOENT) || > rename(newfile, filename)) > { > cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to finalize \"%s\": %s", > filename, strerror(errno)); > return (-1); > } > > return (0); > } > > int /* O - 0 on success, -1 on error */ > cupsdRemoveFile(const char *filename) /* I - File to remove */ > { > ... > /* > * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF, > * and more random data. > */ > > memset(buffer, 0xF6, sizeof(buffer)); > if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) > { > close(fd); > return (-1); > } > ... > } > > static int /* O - 0 on success, -1 on error */ > overwrite_data(int fd, /* I - File descriptor */ > const char *buffer, /* I - Buffer to write */ > int bufsize, /* I - Size of buffer */ > int filesize) /* I - Size of file */ > { > int bytes; /* Bytes to write/written */ > > /* > * Start at the beginning of the file... > */ > > if (lseek(fd, 0, SEEK_SET) < 0) > return (-1); > > /* > * Fill the file with the provided data... > */ > > while (filesize > 0) > { > if (filesize > bufsize) > bytes = bufsize; > else > bytes = filesize; > > if ((bytes = write(fd, buffer, bytes)) < 0) > return (-1); > > filesize -= bytes; > } > > /* > * Force the changes to disk... > */ > > return (fsync(fd)); > } > > ---- indicator-printers-service.c ---- > #define NOTIFY_LEASE_DURATION (15 * 60) > > int main (int argc, char *argv[]) > { > ... > g_timeout_add_seconds (NOTIFY_LEASE_DURATION - 60, > renew_subscription_timeout, > &subscription_id); > ... > } > > To manage notifications about this bug go to: > https://bugs.launchpad.net/ubuntu-power-consumption/+bug/1244205/+subscriptions _________________________________________________________ Michael Sweet, Senior Printing System Engineer, PWG Chair -- You received this bug notification because you are a member of DX Packages, which is subscribed to indicator-printers in Ubuntu. https://bugs.launchpad.net/bugs/1244205 Title: cupsd wakes up the hard disk every 14 minutes Status in The Ubuntu Power Consumption Project: New Status in “cups” package in Ubuntu: New Status in “indicator-printers” package in Ubuntu: New Bug description: cupsd calls fsync() on /etc/subscriptions.conf.N every 14~15 minutes. This causes the hard disk to wake up soon after it spins down. Subscription renewal is from indicator-printers every 15 minutes. I think we don't need cupsdRemoveFile() to always overwrite data and do a fsync() for this file. Currently only Precise is confirmed to be affected. Saucy seems not having the same issue according to (http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/saucy/cups/saucy/view/head:/scheduler/file.c#L149) ---- block_dump from the kernel ---- <7>[19935.646436] cupsd(1066): dirtied inode 15336755 (subscriptions.conf.N) on sda3 <7>[19935.646673] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors) <7>[19935.646755] cupsd(1066): dirtied inode 15335603 (?) on sda3 <7>[19935.646763] cupsd(1066): dirtied inode 15335603 (?) on sda3 <7>[19935.646776] cupsd(1066): WRITE block 352701128 on sda3 (8 sectors) <7>[20774.607856] cupsd(1066): dirtied inode 15335603 (subscriptions.conf.N) on sda3 <7>[20774.608034] cupsd(1066): WRITE block 352862776 on sda3 (8 sectors) <7>[20774.608113] cupsd(1066): dirtied inode 15335607 (?) on sda3 <7>[20774.608120] cupsd(1066): dirtied inode 15335607 (?) on sda3 <7>[20774.608133] cupsd(1066): WRITE block 352753008 on sda3 (8 sectors) <7>[21613.569033] cupsd(1066): dirtied inode 15335607 (subscriptions.conf.N) on sda3 <7>[21613.569257] cupsd(1066): WRITE block 352753024 on sda3 (8 sectors) <7>[21613.569345] cupsd(1066): dirtied inode 15336755 (?) on sda3 <7>[21613.569353] cupsd(1066): dirtied inode 15336755 (?) on sda3 <7>[21613.569367] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors) ---- cups: scheduler/file.c ---- int /* O - 0 on success, -1 on error */ cupsdCloseCreatedConfFile( cups_file_t *fp, /* I - File to close */ const char *filename) /* I - Filename */ { ... snprintf(newfile, sizeof(newfile), "%s.N", filename); snprintf(oldfile, sizeof(oldfile), "%s.O", filename); if ((cupsdRemoveFile(oldfile) && errno != ENOENT) || (rename(filename, oldfile) && errno != ENOENT) || rename(newfile, filename)) { cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to finalize \"%s\": %s", filename, strerror(errno)); return (-1); } return (0); } int /* O - 0 on success, -1 on error */ cupsdRemoveFile(const char *filename) /* I - File to remove */ { ... /* * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF, * and more random data. */ memset(buffer, 0xF6, sizeof(buffer)); if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) { close(fd); return (-1); } ... } static int /* O - 0 on success, -1 on error */ overwrite_data(int fd, /* I - File descriptor */ const char *buffer, /* I - Buffer to write */ int bufsize, /* I - Size of buffer */ int filesize) /* I - Size of file */ { int bytes; /* Bytes to write/written */ /* * Start at the beginning of the file... */ if (lseek(fd, 0, SEEK_SET) < 0) return (-1); /* * Fill the file with the provided data... */ while (filesize > 0) { if (filesize > bufsize) bytes = bufsize; else bytes = filesize; if ((bytes = write(fd, buffer, bytes)) < 0) return (-1); filesize -= bytes; } /* * Force the changes to disk... */ return (fsync(fd)); } ---- indicator-printers-service.c ---- #define NOTIFY_LEASE_DURATION (15 * 60) int main (int argc, char *argv[]) { ... g_timeout_add_seconds (NOTIFY_LEASE_DURATION - 60, renew_subscription_timeout, &subscription_id); ... } To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu-power-consumption/+bug/1244205/+subscriptions -- Mailing list: https://launchpad.net/~dx-packages Post to : dx-packages@lists.launchpad.net Unsubscribe : https://launchpad.net/~dx-packages More help : https://help.launchpad.net/ListHelp