dx-packages team mailing list archive
-
dx-packages team
-
Mailing list archive
-
Message #05515
Re: [Bug 1244205] Re: cupsd wakes up the hard disk every 14 minutes
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 <1244205@xxxxxxxxxxxxxxxxxx> 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
References