* pp (protection period) mount option
@ 2009-11-27 14:21 David Smid
[not found] ` <4B0FE052.70307-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
0 siblings, 1 reply; 7+ messages in thread
From: David Smid @ 2009-11-27 14:21 UTC (permalink / raw)
To: users-JrjvKiOkagjYtjvyW6yDsg
[-- Attachment #1: Type: text/plain, Size: 628 bytes --]
Hi,
I have two nilfs2 partitions and want to set different protection period for
each of them. I know nilfs_cleanerd has an option -p which allows to override
the protection period but using it would require to mount both partitions and
launch their cleaner daemons manually or within a script.
Since I want to use fstab I had to implement this option as a mount.nilfs2 extra
option.
Not much was done to the kernel module: it just had to accept 'pp=' as a valid
mount option.
mount.nilfs2 was modified to parse this option and its value and to pass it to
nilfs_cleanerd command line.
See the patches.
Regards,
David Smid
[-- Attachment #2: nilfs-2.0.18_mount_pp_opt.patch --]
[-- Type: text/x-patch, Size: 758 bytes --]
--- fs/super.c.mount_p_opt 2009-11-22 05:03:04.000000000 +0100
+++ fs/super.c 2009-11-26 16:38:26.000000000 +0100
@@ -650,7 +650,8 @@
enum {
Opt_err_cont, Opt_err_panic, Opt_err_ro,
Opt_barrier, Opt_snapshot, Opt_order,
- Opt_err,
+ Opt_protperiod,
+ Opt_err,
};
static match_table_t tokens = {
@@ -660,6 +661,7 @@
{Opt_barrier, "barrier=%s"},
{Opt_snapshot, "cp=%u"},
{Opt_order, "order=%s"},
+ {Opt_protperiod, "pp=%s"},
{Opt_err, NULL}
};
@@ -728,6 +730,10 @@
sbi->s_snapshot_cno = option;
nilfs_set_opt(sbi, SNAPSHOT);
break;
+ case Opt_protperiod:
+ if (match_int(&args[0], &option) || option <= 0)
+ return 0;
+ break;
default:
printk(KERN_ERR
"NILFS: Unrecognized mount option \"%s\"\n", p);
[-- Attachment #3: nilfs-utils-2.0.14_mount_pp_opt.patch --]
[-- Type: text/x-patch, Size: 4932 bytes --]
--- sbin/mount/mount.nilfs2.h.mount_p_opt 2009-11-26 08:04:17.000000000 +0100
+++ sbin/mount/mount.nilfs2.h 2009-11-26 17:23:13.000000000 +0100
@@ -13,6 +13,7 @@
#define NILFS2_FS_NAME "nilfs2"
#define CLEANERD_NAME "nilfs_cleanerd"
#define PIDOPT_NAME "gcpid"
+#define PPOPT_NAME "pp"
#define CLEANERD_WAIT_RETRY_COUNT 3
#define CLEANERD_WAIT_RETRY_INTERVAL 2 /* in seconds */
--- sbin/mount/mount.nilfs2.c.mount_p_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/mount.nilfs2.c 2009-11-26 17:36:08.000000000 +0100
@@ -71,6 +71,10 @@
const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
typedef int gcpid_opt_t;
+const char pp_opt_fmt[] = PPOPT_NAME "=%d";
+const char pp_val_fmt[] = "%d";
+typedef int pp_opt_t;
+
struct mount_options {
char *fstype;
char *opts;
@@ -408,6 +412,9 @@
do_mount_one(struct nilfs_mount_info *mi, const struct mount_options *mo)
{
int res, errsv;
+ int ppval;
+ char ppstrval[20];
+ char *pp;
res = mount(mi->device, mi->mntdir, fstype, mo->flags & ~MS_NOSYS,
mo->extra_opts);
@@ -429,7 +436,13 @@
goto out;
if (check_mtab()) {
/* Restarting cleaner daemon */
- if (start_cleanerd(mi->device, mi->mntdir, &mi->gcpid) == 0) {
+ if (find_opt(mo->extra_opts, pp_opt_fmt, &ppval) >= 0) {
+ snprintf(ppstrval, 19, pp_opt_fmt, ppval);
+ pp = ppstrval;
+ }
+ else
+ pp = NULL;
+ if (start_cleanerd(mi->device, mi->mntdir, pp, &mi->gcpid) == 0) {
if (verbose)
printf(_("%s: restarted %s\n"),
progname, CLEANERD_NAME);
@@ -452,6 +465,9 @@
pid_t pid = (mi->type == RW2RW_REMOUNT) ? mi->gcpid : 0;
char *exopts;
int rungc;
+ int ppval;
+ char ppstrval[20];
+ char *pp;
rungc = !(mo->flags & MS_RDONLY) && !(mo->flags & MS_BIND) &&
(mi->type != RW2RW_REMOUNT || mi->gcpid == 0);
@@ -461,7 +477,14 @@
return;
}
if (rungc) {
- if (start_cleanerd(mi->device, mi->mntdir, &pid) < 0)
+ if (find_opt(mo->extra_opts, pp_opt_fmt, &ppval) >= 0) {
+ snprintf(ppstrval, 19, pp_val_fmt, ppval);
+ pp = ppstrval;
+ }
+ else
+ pp = NULL;
+
+ if (start_cleanerd(mi->device, mi->mntdir, pp, &pid) < 0)
error(_("%s aborted"), CLEANERD_NAME);
else if (verbose)
printf(_("%s: started %s\n"), progname, CLEANERD_NAME);
@@ -470,7 +493,6 @@
exopts = fix_extra_opts_string(mo->extra_opts, pid);
mi->optstr = fix_opts_string(((mo->flags & ~MS_NOMTAB) | MS_NETDEV),
exopts, NULL);
-
update_mtab_entry(mi->device, mi->mntdir, fstype, mi->optstr, 0, 0,
!mi->mounted);
my_free(exopts);
--- sbin/mount/umount.nilfs2.c.mount_p_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/umount.nilfs2.c 2009-11-26 17:39:03.000000000 +0100
@@ -69,6 +69,10 @@
const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
typedef int gcpid_opt_t;
+const char pp_opt_fmt[] = PPOPT_NAME "=%d";
+const char pp_val_fmt[] = "%d";
+typedef int pp_opt_t;
+
struct umount_options {
int flags;
int force;
@@ -317,6 +321,9 @@
int res, alive = 0;
const char *loopdev;
pid_t pid;
+ int ppval;
+ char ppstrval[20];
+ char *pp;
if (streq (node, "/") || streq (node, "root"))
nomtab++;
@@ -349,7 +356,14 @@
progname, spec);
}
} else if (alive && !check_cleanerd(spec, pid)) {
- if (start_cleanerd(spec, node, &pid) == 0) {
+ if (find_opt(mc->m.mnt_opts, pp_opt_fmt, &ppval) >= 0) {
+ snprintf(ppstrval, 19, pp_val_fmt, ppval);
+ pp = ppstrval;
+ }
+ else
+ pp = NULL;
+
+ if (start_cleanerd(spec, node, pp, &pid) == 0) {
if (verbose)
printf(_("%s: restarted %s(pid=%d)\n"),
progname, CLEANERD_NAME,
--- sbin/mount/cleaner_ctl.c.mount_p_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/cleaner_ctl.c 2009-11-26 08:03:35.000000000 +0100
@@ -45,6 +45,7 @@
const char cleanerd[] = "/sbin/" CLEANERD_NAME;
const char cleanerd_nofork_opt[] = "-n";
+const char cleanerd_protperiod_opt[] = "-p";
extern char *progname;
@@ -54,7 +55,7 @@
return (kill(pid, 0) == 0);
}
-int start_cleanerd(const char *device, const char *mntdir, pid_t *ppid)
+int start_cleanerd(const char *device, const char *mntdir, const char *protperiod, pid_t *ppid)
{
const char *dargs[5];
struct stat statbuf;
@@ -80,6 +81,10 @@
}
dargs[i++] = cleanerd;
dargs[i++] = cleanerd_nofork_opt;
+ if (protperiod != NULL && strlen(protperiod) > 0) {
+ dargs[i++] = cleanerd_protperiod_opt;
+ dargs[i++] = protperiod;
+ }
dargs[i++] = device;
dargs[i++] = mntdir;
dargs[i] = NULL;
--- sbin/mount/mount.nilfs2.h.mount_p_opt 2009-11-26 17:41:12.000000000 +0100
+++ sbin/mount/mount.nilfs2.h 2009-11-26 17:43:47.000000000 +0100
@@ -19,7 +19,7 @@
#define CLEANERD_WAIT_RETRY_INTERVAL 2 /* in seconds */
-extern int start_cleanerd(const char *, const char *, pid_t *);
+extern int start_cleanerd(const char *, const char *, const char *, pid_t *);
extern int stop_cleanerd(const char *, pid_t);
extern int check_cleanerd(const char *, pid_t);
[-- Attachment #4: Type: text/plain, Size: 158 bytes --]
_______________________________________________
users mailing list
users-JrjvKiOkagjYtjvyW6yDsg@public.gmane.org
https://www.nilfs.org/mailman/listinfo/users
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: pp (protection period) mount option
[not found] ` <4B0FE052.70307-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
@ 2009-11-27 16:23 ` Ryusuke Konishi
[not found] ` <20091128.012303.54434171.ryusuke-sG5X7nlA6pw@public.gmane.org>
0 siblings, 1 reply; 7+ messages in thread
From: Ryusuke Konishi @ 2009-11-27 16:23 UTC (permalink / raw)
To: users-JrjvKiOkagjYtjvyW6yDsg, david-0RIiUExYzkzCfDggNXIi3w
Hi!
On Fri, 27 Nov 2009 15:21:06 +0100, David Smid <david-0RIiUExYzkzCfDggNXIi3w@public.gmane.org> wrote:
> Hi,
>
> I have two nilfs2 partitions and want to set different protection period for
> each of them. I know nilfs_cleanerd has an option -p which allows to override
> the protection period but using it would require to mount both partitions and
> launch their cleaner daemons manually or within a script.
> Since I want to use fstab I had to implement this option as a mount.nilfs2 extra
> option.
>
> Not much was done to the kernel module: it just had to accept 'pp=' as a valid
> mount option.
> mount.nilfs2 was modified to parse this option and its value and to pass it to
> nilfs_cleanerd command line.
>
> See the patches.
>
>
> Regards,
>
> David Smid
Thank you for the patches.
I understood your intention.
One comment. I don't like the dummy option is added to the kernel
code because protection_period is entirely independent with it.
Can you modify the patch so that mount.nilfs2 gets out the pp option
from the string passed to the mount system call?
A ready-made function, change_opt() would be available for that
purpose.
(only from extra_opts; mtab should include it to keep the value for
cleanerd_ctl, of course)
And, please inline patches in the mail; this makes it easy to comment
on them.
Thanks,
Ryusuke Konishi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: pp (protection period) mount option
[not found] ` <20091128.012303.54434171.ryusuke-sG5X7nlA6pw@public.gmane.org>
@ 2009-11-28 21:16 ` David Smid
[not found] ` <749598c60911281316i40b591b1hcb055b0867617f0e-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 1 reply; 7+ messages in thread
From: David Smid @ 2009-11-28 21:16 UTC (permalink / raw)
To: users-JrjvKiOkagjYtjvyW6yDsg, Ryusuke Konishi
2009/11/27 Ryusuke Konishi <ryusuke@osrg.net>:
> Hi!
> On Fri, 27 Nov 2009 15:21:06 +0100, David Smid <david@unity-linux.org> wrote:
>> Hi,
>>
>> I have two nilfs2 partitions and want to set different protection period for
>> each of them. I know nilfs_cleanerd has an option -p which allows to override
>> the protection period but using it would require to mount both partitions and
>> launch their cleaner daemons manually or within a script.
>> Since I want to use fstab I had to implement this option as a mount.nilfs2 extra
>> option.
>>
>> Not much was done to the kernel module: it just had to accept 'pp=' as a valid
>> mount option.
>> mount.nilfs2 was modified to parse this option and its value and to pass it to
>> nilfs_cleanerd command line.
>>
>> See the patches.
>>
>>
>> Regards,
>>
>> David Smid
>
> Thank you for the patches.
> I understood your intention.
>
> One comment. Â I don't like the dummy option is added to the kernel
> code because protection_period is entirely independent with it.
>
> Can you modify the patch so that mount.nilfs2 gets out the pp option
> from the string passed to the mount system call?
>
> A ready-made function, change_opt() would be available for that
> purpose.
>
> (only from extra_opts; mtab should include it to keep the value for
> cleanerd_ctl, of course)
>
> And, please inline patches in the mail; this makes it easy to comment
> on them.
>
> Thanks,
> Ryusuke Konishi
>
Thanks you for your valuable comments.
You are right, of course. No kernel code changes are needed.
Here is my take #2.
David
--- sbin/mount/cleaner_ctl.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/cleaner_ctl.c 2009-11-28 21:40:38.000000000 +0100
@@ -45,6 +45,7 @@
const char cleanerd[] = "/sbin/" CLEANERD_NAME;
const char cleanerd_nofork_opt[] = "-n";
+const char cleanerd_protperiod_opt[] = "-p";
extern char *progname;
@@ -54,12 +55,13 @@
return (kill(pid, 0) == 0);
}
-int start_cleanerd(const char *device, const char *mntdir, pid_t *ppid)
+int start_cleanerd(const char *device, const char *mntdir, unsigned
long protperiod, pid_t *ppid)
{
- const char *dargs[5];
+ const char *dargs[7];
struct stat statbuf;
int i = 0;
int res;
+ char buf[256];
if (stat(cleanerd, &statbuf) != 0) {
error(_("Warning: %s not found"), CLEANERD_NAME);
@@ -80,6 +82,11 @@
}
dargs[i++] = cleanerd;
dargs[i++] = cleanerd_nofork_opt;
+ if (protperiod != ULONG_MAX) {
+ dargs[i++] = cleanerd_protperiod_opt;
+ snprintf(buf, sizeof(buf), "%lu", protperiod);
+ dargs[i++] = buf;
+ }
dargs[i++] = device;
dargs[i++] = mntdir;
dargs[i] = NULL;
--- sbin/mount/mount.nilfs2.h.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/mount.nilfs2.h 2009-11-28 20:37:33.000000000 +0100
@@ -13,12 +13,13 @@
#define NILFS2_FS_NAME "nilfs2"
#define CLEANERD_NAME "nilfs_cleanerd"
#define PIDOPT_NAME "gcpid"
+#define PPOPT_NAME "pp"
#define CLEANERD_WAIT_RETRY_COUNT 3
#define CLEANERD_WAIT_RETRY_INTERVAL 2 /* in seconds */
-extern int start_cleanerd(const char *, const char *, pid_t *);
+extern int start_cleanerd(const char *, const char *, unsigned long, pid_t *);
extern int stop_cleanerd(const char *, pid_t);
extern int check_cleanerd(const char *, pid_t);
--- sbin/mount/umount.nilfs2.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/umount.nilfs2.c 2009-11-28 21:40:23.000000000 +0100
@@ -69,6 +69,9 @@
const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
typedef int gcpid_opt_t;
+const char pp_opt_fmt[] = PPOPT_NAME "=%lu";
+typedef unsigned long pp_opt_t;
+
struct umount_options {
int flags;
int force;
@@ -317,6 +320,7 @@
int res, alive = 0;
const char *loopdev;
pid_t pid;
+ pp_opt_t prot_period;
if (streq (node, "/") || streq (node, "root"))
nomtab++;
@@ -349,7 +353,10 @@
progname, spec);
}
} else if (alive && !check_cleanerd(spec, pid)) {
- if (start_cleanerd(spec, node, &pid) == 0) {
+ if (find_opt(mc->m.mnt_opts, pp_opt_fmt, &prot_period) < 0)
+ prot_period = ULONG_MAX;
+
+ if (start_cleanerd(spec, node, prot_period, &pid) == 0) {
if (verbose)
printf(_("%s: restarted %s(pid=%d)\n"),
progname, CLEANERD_NAME,
--- sbin/mount/mount.nilfs2.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/mount.nilfs2.c 2009-11-28 21:39:27.000000000 +0100
@@ -71,6 +71,9 @@
const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
typedef int gcpid_opt_t;
+const char pp_opt_fmt[] = PPOPT_NAME "=%lu";
+typedef unsigned long pp_opt_t;
+
struct mount_options {
char *fstype;
char *opts;
@@ -225,6 +228,17 @@
*opts = newopts;
}
+static void update_pp_opt(char **opts, pp_opt_t protection_period)
+{
+ char buf[256], *newopts;
+ pp_opt_t oldpp;
+
+ snprintf(buf, sizeof(buf), pp_opt_fmt, protection_period);
+ newopts = change_opt(*opts, pp_opt_fmt, &oldpp, buf);
+ my_free(*opts);
+ *opts = newopts;
+}
+
static char *fix_extra_opts_string(const char *extra_opts, pid_t gcpid)
{
char buf[256];
@@ -408,9 +422,14 @@
do_mount_one(struct nilfs_mount_info *mi, const struct mount_options *mo)
{
int res, errsv;
+ char *exopts;
+ pp_opt_t prot_period;
+
+ prot_period = ULONG_MAX;
+ exopts = change_opt(mo->extra_opts, pp_opt_fmt, &prot_period, "");
res = mount(mi->device, mi->mntdir, fstype, mo->flags & ~MS_NOSYS,
- mo->extra_opts);
+ exopts);
if (!res)
goto out;
@@ -429,11 +448,13 @@
goto out;
if (check_mtab()) {
/* Restarting cleaner daemon */
- if (start_cleanerd(mi->device, mi->mntdir, &mi->gcpid) == 0) {
+ if (start_cleanerd(mi->device, mi->mntdir, prot_period, &mi->gcpid) == 0) {
if (verbose)
printf(_("%s: restarted %s\n"),
progname, CLEANERD_NAME);
update_gcpid_opt(&mi->optstr, mi->gcpid);
+ if (prot_period != ULONG_MAX)
+ update_pp_opt(&mi->optstr, prot_period);
update_mtab_entry(mi->device, mi->mntdir, fstype,
mi->optstr, 0, 0, !mi->mounted);
} else {
@@ -443,6 +464,7 @@
} else
printf(_("%s not restarted\n"), CLEANERD_NAME);
out:
+ my_free(exopts);
return res;
}
@@ -452,6 +474,7 @@
pid_t pid = (mi->type == RW2RW_REMOUNT) ? mi->gcpid : 0;
char *exopts;
int rungc;
+ pp_opt_t prot_period;
rungc = !(mo->flags & MS_RDONLY) && !(mo->flags & MS_BIND) &&
(mi->type != RW2RW_REMOUNT || mi->gcpid == 0);
@@ -461,7 +484,10 @@
return;
}
if (rungc) {
- if (start_cleanerd(mi->device, mi->mntdir, &pid) < 0)
+ if (find_opt(mo->extra_opts, pp_opt_fmt, &prot_period) < 0)
+ prot_period = ULONG_MAX;
+
+ if (start_cleanerd(mi->device, mi->mntdir, prot_period, &pid) < 0)
error(_("%s aborted"), CLEANERD_NAME);
else if (verbose)
printf(_("%s: started %s\n"), progname, CLEANERD_NAME);
--- man/mount.nilfs2.8.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ man/mount.nilfs2.8 2009-11-28 21:51:23.000000000 +0100
@@ -103,6 +103,12 @@
remount the file system read-only, or panic and halt the system.) The
default is continue.
.TP
+.BR pp=\fP\fIprotection-period\fP
+Specify the \fIprotection-period\fP for the cleaner daemon (in
+seconds). nilfs_cleanerd never deletes recent checkpoints whose
+elapsed time from its creation is smaller than
+\fIprotection-period\fP.
+.TP
.BR order=relaxed " / " order=strict
Specify order semantics for file data. Metadata is always written to
follow the POSIX semantics about the order of filesystem operations.
_______________________________________________
users mailing list
users@nilfs.org
https://www.nilfs.org/mailman/listinfo/users
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: pp (protection period) mount option
[not found] ` <749598c60911281316i40b591b1hcb055b0867617f0e-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2009-12-01 15:44 ` Ryusuke Konishi
[not found] ` <20091202.004422.69931110.ryusuke-sG5X7nlA6pw@public.gmane.org>
0 siblings, 1 reply; 7+ messages in thread
From: Ryusuke Konishi @ 2009-12-01 15:44 UTC (permalink / raw)
To: david-0RIiUExYzkzCfDggNXIi3w; +Cc: users-JrjvKiOkagjYtjvyW6yDsg
Hi,
On Sat, 28 Nov 2009 22:16:31 +0100, David Smid <david-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
wrote:
> Thanks you for your valuable comments.
>
> You are right, of course. No kernel code changes are needed.
> Here is my take #2.
>
> David
Thank you, David. I reviewed the patch in detail, and no worrisome
point found.
During tests, I noticed that remount doesn't work for this option:
For instance, after doing
# mount -t nilfs2 -o pp=3D600 /dev/sdb1 /test
and
# mount -t nilfs2 -o remount,pp=3D400 /dev/sdb1 /test
then, a cleanerd with "-p 600" was still working.
I think usually this doesn't make trouble, but I'd like to hear your
opinion before merging. If you want to revise the issue to keep
semantics of remount option, I will wait for you.
If you don't care, I will merge the patch as is.
Thanks,
Ryusuke Konishi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: pp (protection period) mount option
[not found] ` <20091202.004422.69931110.ryusuke-sG5X7nlA6pw@public.gmane.org>
@ 2009-12-01 16:02 ` Ryusuke Konishi
[not found] ` <20091202.010205.38314732.ryusuke-sG5X7nlA6pw@public.gmane.org>
0 siblings, 1 reply; 7+ messages in thread
From: Ryusuke Konishi @ 2009-12-01 16:02 UTC (permalink / raw)
To: david-0RIiUExYzkzCfDggNXIi3w; +Cc: users-JrjvKiOkagjYtjvyW6yDsg
On Wed, 02 Dec 2009 00:44:22 +0900 (JST), Ryusuke Konishi <ryusuke-sG5X7nlA6pw@public.gmane.org> wrote:
> Hi,
> On Sat, 28 Nov 2009 22:16:31 +0100, David Smid <david-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
> wrote:
> > Thanks you for your valuable comments.
> >
> > You are right, of course. No kernel code changes are needed.
> > Here is my take #2.
> >
> > David
>
> Thank you, David. I reviewed the patch in detail, and no worrisome
> point found.
>
> During tests, I noticed that remount doesn't work for this option:
>
> For instance, after doing
>
> # mount -t nilfs2 -o pp=3D600 /dev/sdb1 /test
>
> and
>
> # mount -t nilfs2 -o remount,pp=3D400 /dev/sdb1 /test
Whoa, looks garbled..
> # mount -t nilfs2 -o pp=600 /dev/sdb1 /test
> # mount -t nilfs2 -o remount,pp=400 /dev/sdb1 /test
Ryusuke
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: pp (protection period) mount option
[not found] ` <20091202.010205.38314732.ryusuke-sG5X7nlA6pw@public.gmane.org>
@ 2009-12-02 17:20 ` David Smid
[not found] ` <4B16A1CA.9050608-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
0 siblings, 1 reply; 7+ messages in thread
From: David Smid @ 2009-12-02 17:20 UTC (permalink / raw)
To: Ryusuke Konishi, users-JrjvKiOkagjYtjvyW6yDsg
Ryusuke Konishi napsal(a):
> On Wed, 02 Dec 2009 00:44:22 +0900 (JST), Ryusuke Konishi <ryusuke-sG5X7nlA6pw@public.gmane.org> wrote:
>> Hi,
>> On Sat, 28 Nov 2009 22:16:31 +0100, David Smid <david-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
>> wrote:
>>> Thanks you for your valuable comments.
>>>
>>> You are right, of course. No kernel code changes are needed.
>>> Here is my take #2.
>>>
>>> David
>> Thank you, David. I reviewed the patch in detail, and no worrisome
>> point found.
>>
>> During tests, I noticed that remount doesn't work for this option:
>>
>> For instance, after doing
>> # mount -t nilfs2 -o pp=600 /dev/sdb1 /test
>> # mount -t nilfs2 -o remount,pp=400 /dev/sdb1 /test
>
> Ryusuke
Good point, remount should definitely work because it is quite useful to change
pp on the fly.
This patch should work.
David
--- sbin/mount/mount.nilfs2.h.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/mount.nilfs2.h 2009-12-02 10:27:26.000000000 +0100
@@ -13,12 +13,13 @@
#define NILFS2_FS_NAME "nilfs2"
#define CLEANERD_NAME "nilfs_cleanerd"
#define PIDOPT_NAME "gcpid"
+#define PPOPT_NAME "pp"
#define CLEANERD_WAIT_RETRY_COUNT 3
#define CLEANERD_WAIT_RETRY_INTERVAL 2 /* in seconds */
-extern int start_cleanerd(const char *, const char *, pid_t *);
+extern int start_cleanerd(const char *, const char *, unsigned long, pid_t *);
extern int stop_cleanerd(const char *, pid_t);
extern int check_cleanerd(const char *, pid_t);
--- sbin/mount/cleaner_ctl.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/cleaner_ctl.c 2009-12-02 18:16:16.000000000 +0100
@@ -45,6 +45,7 @@
const char cleanerd[] = "/sbin/" CLEANERD_NAME;
const char cleanerd_nofork_opt[] = "-n";
+const char cleanerd_protperiod_opt[] = "-p";
extern char *progname;
@@ -54,12 +55,14 @@
return (kill(pid, 0) == 0);
}
-int start_cleanerd(const char *device, const char *mntdir, pid_t *ppid)
+int start_cleanerd(const char *device, const char *mntdir,
+ unsigned long protperiod, pid_t *ppid)
{
- const char *dargs[5];
+ const char *dargs[7];
struct stat statbuf;
int i = 0;
int res;
+ char buf[256];
if (stat(cleanerd, &statbuf) != 0) {
error(_("Warning: %s not found"), CLEANERD_NAME);
@@ -80,6 +83,11 @@
}
dargs[i++] = cleanerd;
dargs[i++] = cleanerd_nofork_opt;
+ if (protperiod != ULONG_MAX) {
+ dargs[i++] = cleanerd_protperiod_opt;
+ snprintf(buf, sizeof(buf), "%lu", protperiod);
+ dargs[i++] = buf;
+ }
dargs[i++] = device;
dargs[i++] = mntdir;
dargs[i] = NULL;
--- sbin/mount/umount.nilfs2.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/umount.nilfs2.c 2009-12-02 18:15:37.000000000 +0100
@@ -69,6 +69,9 @@
const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
typedef int gcpid_opt_t;
+const char pp_opt_fmt[] = PPOPT_NAME "=%lu";
+typedef unsigned long pp_opt_t;
+
struct umount_options {
int flags;
int force;
@@ -317,6 +320,7 @@
int res, alive = 0;
const char *loopdev;
pid_t pid;
+ pp_opt_t prot_period;
if (streq (node, "/") || streq (node, "root"))
nomtab++;
@@ -349,7 +353,11 @@
progname, spec);
}
} else if (alive && !check_cleanerd(spec, pid)) {
- if (start_cleanerd(spec, node, &pid) == 0) {
+ if (find_opt(mc->m.mnt_opts, pp_opt_fmt, &prot_period)
+ < 0)
+ prot_period = ULONG_MAX;
+
+ if (start_cleanerd(spec, node, prot_period, &pid) == 0) {
if (verbose)
printf(_("%s: restarted %s(pid=%d)\n"),
progname, CLEANERD_NAME,
--- sbin/mount/mount.nilfs2.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ sbin/mount/mount.nilfs2.c 2009-12-02 18:14:50.000000000 +0100
@@ -71,6 +71,9 @@
const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
typedef int gcpid_opt_t;
+const char pp_opt_fmt[] = PPOPT_NAME "=%lu";
+typedef unsigned long pp_opt_t;
+
struct mount_options {
char *fstype;
char *opts;
@@ -225,16 +228,43 @@
*opts = newopts;
}
-static char *fix_extra_opts_string(const char *extra_opts, pid_t gcpid)
+static void update_pp_opt(char **opts, pp_opt_t protection_period)
+{
+ char buf[256], *newopts;
+ pp_opt_t oldpp;
+
+ *buf = 0;
+ if (protection_period != ULONG_MAX) {
+ snprintf(buf, sizeof(buf), pp_opt_fmt, protection_period);
+ }
+ newopts = change_opt(*opts, pp_opt_fmt, &oldpp, buf);
+ my_free(*opts);
+ *opts = newopts;
+}
+
+static char *fix_extra_opts_string(const char *extra_opts, pid_t gcpid,
+ pp_opt_t protection_period)
{
char buf[256];
gcpid_opt_t id;
+ pp_opt_t pp;
+ char *tmpres;
+ char *res;
buf[0] = '\0';
if (gcpid)
snprintf(buf, sizeof(buf), gcpid_opt_fmt, (int)gcpid);
/* The gcpid option will be removed if gcpid == 0 */
- return change_opt(extra_opts, gcpid_opt_fmt, &id, buf);
+ tmpres = change_opt(extra_opts, gcpid_opt_fmt, &id, buf);
+
+ buf[0] = '\0';
+ if (protection_period != ULONG_MAX)
+ snprintf(buf, sizeof(buf), pp_opt_fmt, protection_period);
+ /* The pp option will be removed if pp == ULONG_MAX */
+ res = change_opt(tmpres, pp_opt_fmt, &pp, buf);
+
+ my_free(tmpres);
+ return res;
}
/*
@@ -312,6 +342,7 @@
pid_t gcpid;
int type;
int mounted;
+ pp_opt_t protperiod;
};
static int check_mtab(void)
@@ -348,6 +379,7 @@
{
struct mntentchn *mc;
gcpid_opt_t pid;
+ pp_opt_t prot_period;
int res = -1;
if (!(mo->flags & MS_REMOUNT) && mounted(NULL, mi->mntdir)) {
@@ -359,6 +391,9 @@
mi->gcpid = 0;
mi->optstr = NULL;
mi->mounted = mounted(mi->device, mi->mntdir);
+ mi->protperiod = ULONG_MAX;
+ if (find_opt(mo->extra_opts, pp_opt_fmt, &prot_period) >= 0)
+ mi->protperiod = prot_period;
if (mo->flags & MS_BIND)
return 0;
@@ -375,15 +410,13 @@
goto failed;
case MS_RDONLY: /* ro-mount (a rw-mount exists) */
break;
- case MS_REMOUNT: /* rw->rw remount */
- if (check_remount_dir(mc, mi->mntdir) < 0)
- goto failed;
- if (find_opt(mc->m.mnt_opts, gcpid_opt_fmt, &pid) >= 0)
- mi->gcpid = pid;
- mi->optstr = xstrdup(mc->m.mnt_opts); /* previous opts */
- mi->type = RW2RW_REMOUNT;
- break;
- case MS_RDONLY | MS_REMOUNT: /* rw->ro remount */
+ case MS_REMOUNT | MS_RDONLY: /* rw->ro remount */
+ mi->type = RW2RO_REMOUNT;
+ mi->protperiod = ULONG_MAX;
+ /* fallthrough */
+ case MS_REMOUNT:
+ if (!(mo->flags & MS_RDONLY))
+ mi->type = RW2RW_REMOUNT; /* rw->rw remount */
if (check_remount_dir(mc, mi->mntdir) < 0)
goto failed;
pid = 0;
@@ -395,7 +428,6 @@
}
mi->gcpid = pid;
mi->optstr = xstrdup(mc->m.mnt_opts); /* previous opts */
- mi->type = RW2RO_REMOUNT;
break;
}
@@ -408,9 +440,13 @@
do_mount_one(struct nilfs_mount_info *mi, const struct mount_options *mo)
{
int res, errsv;
+ char *exopts;
+ pp_opt_t prot_period;
+
+ exopts = change_opt(mo->extra_opts, pp_opt_fmt, &prot_period, "");
res = mount(mi->device, mi->mntdir, fstype, mo->flags & ~MS_NOSYS,
- mo->extra_opts);
+ exopts);
if (!res)
goto out;
@@ -425,15 +461,19 @@
progname, mi->device, mi->mntdir, strerror(errsv));
break;
}
- if (mi->type != RW2RO_REMOUNT)
+ if (mi->type != RW2RO_REMOUNT && mi->type != RW2RW_REMOUNT)
goto out;
+ /* Cleaner daemon was stopped and it needs to run */
+ /* because filesystem is still mounted */
if (check_mtab()) {
/* Restarting cleaner daemon */
- if (start_cleanerd(mi->device, mi->mntdir, &mi->gcpid) == 0) {
+ if (start_cleanerd(mi->device, mi->mntdir, mi->protperiod,
+ &mi->gcpid) == 0) {
if (verbose)
printf(_("%s: restarted %s\n"),
progname, CLEANERD_NAME);
update_gcpid_opt(&mi->optstr, mi->gcpid);
+ update_pp_opt(&mi->optstr, mi->protperiod);
update_mtab_entry(mi->device, mi->mntdir, fstype,
mi->optstr, 0, 0, !mi->mounted);
} else {
@@ -443,31 +483,39 @@
} else
printf(_("%s not restarted\n"), CLEANERD_NAME);
out:
+ my_free(exopts);
return res;
}
static void update_mount_state(struct nilfs_mount_info *mi,
const struct mount_options *mo)
{
- pid_t pid = (mi->type == RW2RW_REMOUNT) ? mi->gcpid : 0;
+ pid_t pid = fake ? mi->gcpid : 0;
char *exopts;
int rungc;
+ if (mo->flags & MS_RDONLY)
+ mi->protperiod = ULONG_MAX;
+
rungc = !(mo->flags & MS_RDONLY) && !(mo->flags & MS_BIND) &&
- (mi->type != RW2RW_REMOUNT || mi->gcpid == 0);
+ (pid == 0);
if (!check_mtab()) {
if (rungc)
printf(_("%s not started\n"), CLEANERD_NAME);
return;
}
if (rungc) {
- if (start_cleanerd(mi->device, mi->mntdir, &pid) < 0)
+ if (start_cleanerd(mi->device, mi->mntdir, mi->protperiod,
+ &pid) < 0)
error(_("%s aborted"), CLEANERD_NAME);
else if (verbose)
printf(_("%s: started %s\n"), progname, CLEANERD_NAME);
- }
+ } else
+ if (!fake)
+ pid = 0;
+
my_free(mi->optstr);
- exopts = fix_extra_opts_string(mo->extra_opts, pid);
+ exopts = fix_extra_opts_string(mo->extra_opts, pid, mi->protperiod);
mi->optstr = fix_opts_string(((mo->flags & ~MS_NOMTAB) | MS_NETDEV),
exopts, NULL);
--- man/mount.nilfs2.8.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
+++ man/mount.nilfs2.8 2009-12-02 10:27:26.000000000 +0100
@@ -103,6 +103,12 @@
remount the file system read-only, or panic and halt the system.) The
default is continue.
.TP
+.BR pp=\fP\fIprotection-period\fP
+Specify the \fIprotection-period\fP for the cleaner daemon (in
+seconds). nilfs_cleanerd never deletes recent checkpoints whose
+elapsed time from its creation is smaller than
+\fIprotection-period\fP.
+.TP
.BR order=relaxed " / " order=strict
Specify order semantics for file data. Metadata is always written to
follow the POSIX semantics about the order of filesystem operations.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: pp (protection period) mount option
[not found] ` <4B16A1CA.9050608-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
@ 2009-12-03 17:22 ` Ryusuke Konishi
0 siblings, 0 replies; 7+ messages in thread
From: Ryusuke Konishi @ 2009-12-03 17:22 UTC (permalink / raw)
To: david-0RIiUExYzkzCfDggNXIi3w; +Cc: users-JrjvKiOkagjYtjvyW6yDsg
Hi,
On Wed, 02 Dec 2009 18:20:10 +0100, David Smid <david-0RIiUExYzkzCfDggNXIi3w@public.gmane.org> wrote:
> Ryusuke Konishi napsal(a):
> > On Wed, 02 Dec 2009 00:44:22 +0900 (JST), Ryusuke Konishi <ryusuke-sG5X7nlA6pw@public.gmane.org> wrote:
> >> Hi,
> >> On Sat, 28 Nov 2009 22:16:31 +0100, David Smid <david-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
> >> wrote:
> >>> Thanks you for your valuable comments.
> >>>
> >>> You are right, of course. No kernel code changes are needed.
> >>> Here is my take #2.
> >>>
> >>> David
> >> Thank you, David. I reviewed the patch in detail, and no worrisome
> >> point found.
> >>
> >> During tests, I noticed that remount doesn't work for this option:
> >>
> >> For instance, after doing
> >> # mount -t nilfs2 -o pp=600 /dev/sdb1 /test
> >> # mount -t nilfs2 -o remount,pp=400 /dev/sdb1 /test
> >
> > Ryusuke
>
> Good point, remount should definitely work because it is quite useful to change
> pp on the fly.
>
> This patch should work.
>
> David
Thank you for revising the patch. I reviewed the code anew.
I will comment inline.
> --- sbin/mount/mount.nilfs2.h.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
> +++ sbin/mount/mount.nilfs2.h 2009-12-02 10:27:26.000000000 +0100
> @@ -13,12 +13,13 @@
> #define NILFS2_FS_NAME "nilfs2"
> #define CLEANERD_NAME "nilfs_cleanerd"
> #define PIDOPT_NAME "gcpid"
> +#define PPOPT_NAME "pp"
>
> #define CLEANERD_WAIT_RETRY_COUNT 3
> #define CLEANERD_WAIT_RETRY_INTERVAL 2 /* in seconds */
>
>
> -extern int start_cleanerd(const char *, const char *, pid_t *);
> +extern int start_cleanerd(const char *, const char *, unsigned long, pid_t *);
> extern int stop_cleanerd(const char *, pid_t);
> extern int check_cleanerd(const char *, pid_t);
>
> --- sbin/mount/cleaner_ctl.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
> +++ sbin/mount/cleaner_ctl.c 2009-12-02 18:16:16.000000000 +0100
> @@ -45,6 +45,7 @@
>
> const char cleanerd[] = "/sbin/" CLEANERD_NAME;
> const char cleanerd_nofork_opt[] = "-n";
> +const char cleanerd_protperiod_opt[] = "-p";
>
> extern char *progname;
>
> @@ -54,12 +55,14 @@
> return (kill(pid, 0) == 0);
> }
>
> -int start_cleanerd(const char *device, const char *mntdir, pid_t *ppid)
> +int start_cleanerd(const char *device, const char *mntdir,
> + unsigned long protperiod, pid_t *ppid)
> {
> - const char *dargs[5];
> + const char *dargs[7];
> struct stat statbuf;
> int i = 0;
> int res;
> + char buf[256];
>
> if (stat(cleanerd, &statbuf) != 0) {
> error(_("Warning: %s not found"), CLEANERD_NAME);
> @@ -80,6 +83,11 @@
> }
> dargs[i++] = cleanerd;
> dargs[i++] = cleanerd_nofork_opt;
> + if (protperiod != ULONG_MAX) {
> + dargs[i++] = cleanerd_protperiod_opt;
> + snprintf(buf, sizeof(buf), "%lu", protperiod);
> + dargs[i++] = buf;
> + }
> dargs[i++] = device;
> dargs[i++] = mntdir;
> dargs[i] = NULL;
> --- sbin/mount/umount.nilfs2.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
> +++ sbin/mount/umount.nilfs2.c 2009-12-02 18:15:37.000000000 +0100
> @@ -69,6 +69,9 @@
> const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
> typedef int gcpid_opt_t;
>
> +const char pp_opt_fmt[] = PPOPT_NAME "=%lu";
> +typedef unsigned long pp_opt_t;
> +
> struct umount_options {
> int flags;
> int force;
> @@ -317,6 +320,7 @@
> int res, alive = 0;
> const char *loopdev;
> pid_t pid;
> + pp_opt_t prot_period;
>
> if (streq (node, "/") || streq (node, "root"))
> nomtab++;
> @@ -349,7 +353,11 @@
> progname, spec);
> }
> } else if (alive && !check_cleanerd(spec, pid)) {
> - if (start_cleanerd(spec, node, &pid) == 0) {
> + if (find_opt(mc->m.mnt_opts, pp_opt_fmt, &prot_period)
> + < 0)
> + prot_period = ULONG_MAX;
> +
> + if (start_cleanerd(spec, node, prot_period, &pid) == 0) {
> if (verbose)
> printf(_("%s: restarted %s(pid=%d)\n"),
> progname, CLEANERD_NAME,
> --- sbin/mount/mount.nilfs2.c.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
> +++ sbin/mount/mount.nilfs2.c 2009-12-02 18:14:50.000000000 +0100
> @@ -71,6 +71,9 @@
> const char gcpid_opt_fmt[] = PIDOPT_NAME "=%d";
> typedef int gcpid_opt_t;
>
> +const char pp_opt_fmt[] = PPOPT_NAME "=%lu";
> +typedef unsigned long pp_opt_t;
> +
> struct mount_options {
> char *fstype;
> char *opts;
> @@ -225,16 +228,43 @@
> *opts = newopts;
> }
>
> -static char *fix_extra_opts_string(const char *extra_opts, pid_t gcpid)
> +static void update_pp_opt(char **opts, pp_opt_t protection_period)
> +{
> + char buf[256], *newopts;
> + pp_opt_t oldpp;
> +
> + *buf = 0;
> + if (protection_period != ULONG_MAX) {
> + snprintf(buf, sizeof(buf), pp_opt_fmt, protection_period);
> + }
In case of the kernel code, these braces (i.e '{' and '}') are removed
because it's a single statement. (for your information. This is not
important.)
> + newopts = change_opt(*opts, pp_opt_fmt, &oldpp, buf);
> + my_free(*opts);
> + *opts = newopts;
> +}
> +
> +static char *fix_extra_opts_string(const char *extra_opts, pid_t gcpid,
> + pp_opt_t protection_period)
> {
> char buf[256];
> gcpid_opt_t id;
> + pp_opt_t pp;
> + char *tmpres;
> + char *res;
>
> buf[0] = '\0';
> if (gcpid)
> snprintf(buf, sizeof(buf), gcpid_opt_fmt, (int)gcpid);
> /* The gcpid option will be removed if gcpid == 0 */
> - return change_opt(extra_opts, gcpid_opt_fmt, &id, buf);
> + tmpres = change_opt(extra_opts, gcpid_opt_fmt, &id, buf);
> +
> + buf[0] = '\0';
> + if (protection_period != ULONG_MAX)
> + snprintf(buf, sizeof(buf), pp_opt_fmt, protection_period);
> + /* The pp option will be removed if pp == ULONG_MAX */
> + res = change_opt(tmpres, pp_opt_fmt, &pp, buf);
> +
> + my_free(tmpres);
> + return res;
> }
>
> /*
> @@ -312,6 +342,7 @@
> pid_t gcpid;
> int type;
> int mounted;
> + pp_opt_t protperiod;
> };
>
> static int check_mtab(void)
> @@ -348,6 +379,7 @@
> {
> struct mntentchn *mc;
> gcpid_opt_t pid;
> + pp_opt_t prot_period;
> int res = -1;
>
> if (!(mo->flags & MS_REMOUNT) && mounted(NULL, mi->mntdir)) {
> @@ -359,6 +391,9 @@
> mi->gcpid = 0;
> mi->optstr = NULL;
> mi->mounted = mounted(mi->device, mi->mntdir);
> + mi->protperiod = ULONG_MAX;
> + if (find_opt(mo->extra_opts, pp_opt_fmt, &prot_period) >= 0)
> + mi->protperiod = prot_period;
These two lines should be removed because prepare_mount() is the
function to find an existing mount and extract its options from mtab.
mo->extra_opts has new mount options.
Please see the code I add below.
> if (mo->flags & MS_BIND)
> return 0;
> @@ -375,15 +410,13 @@
> goto failed;
> case MS_RDONLY: /* ro-mount (a rw-mount exists) */
> break;
> - case MS_REMOUNT: /* rw->rw remount */
> - if (check_remount_dir(mc, mi->mntdir) < 0)
> - goto failed;
> - if (find_opt(mc->m.mnt_opts, gcpid_opt_fmt, &pid) >= 0)
> - mi->gcpid = pid;
> - mi->optstr = xstrdup(mc->m.mnt_opts); /* previous opts */
> - mi->type = RW2RW_REMOUNT;
> - break;
> - case MS_RDONLY | MS_REMOUNT: /* rw->ro remount */
> + case MS_REMOUNT | MS_RDONLY: /* rw->ro remount */
> + mi->type = RW2RO_REMOUNT;
> + mi->protperiod = ULONG_MAX;
> + /* fallthrough */
> + case MS_REMOUNT:
> + if (!(mo->flags & MS_RDONLY))
> + mi->type = RW2RW_REMOUNT; /* rw->rw remount */
Trailing space chars. should be removed.
> if (check_remount_dir(mc, mi->mntdir) < 0)
> goto failed;
Here, can get the existing pp value:
prot_period = ULONG_MAX;
if (find_opt(mc->m.mnt_opts, pp_opt_fmt, &prot_period) >= 0)
mi->protperiod = prot_period;
This previous value is used in do_mount_one(), for example, when
remount fails and it restarts cleanerd.
> pid = 0;
> @@ -395,7 +428,6 @@
> }
> mi->gcpid = pid;
> mi->optstr = xstrdup(mc->m.mnt_opts); /* previous opts */
> - mi->type = RW2RO_REMOUNT;
> break;
> }
>
> @@ -408,9 +440,13 @@
> do_mount_one(struct nilfs_mount_info *mi, const struct mount_options *mo)
> {
> int res, errsv;
> + char *exopts;
> + pp_opt_t prot_period;
> +
> + exopts = change_opt(mo->extra_opts, pp_opt_fmt, &prot_period, "");
>
> res = mount(mi->device, mi->mntdir, fstype, mo->flags & ~MS_NOSYS,
> - mo->extra_opts);
> + exopts);
> if (!res)
> goto out;
>
> @@ -425,15 +461,19 @@
> progname, mi->device, mi->mntdir, strerror(errsv));
> break;
> }
> - if (mi->type != RW2RO_REMOUNT)
> + if (mi->type != RW2RO_REMOUNT && mi->type != RW2RW_REMOUNT)
> goto out;
> + /* Cleaner daemon was stopped and it needs to run */
> + /* because filesystem is still mounted */
> if (check_mtab()) {
> /* Restarting cleaner daemon */
> - if (start_cleanerd(mi->device, mi->mntdir, &mi->gcpid) == 0) {
> + if (start_cleanerd(mi->device, mi->mntdir, mi->protperiod,
> + &mi->gcpid) == 0) {
> if (verbose)
> printf(_("%s: restarted %s\n"),
> progname, CLEANERD_NAME);
> update_gcpid_opt(&mi->optstr, mi->gcpid);
> + update_pp_opt(&mi->optstr, mi->protperiod);
This update_pp_opt() is redundant because this is an error path and
the pp option should keep the previous value. On the other hand,
update_gcpid_opt() is necessary since GC pid is always changed after
the restart.
> update_mtab_entry(mi->device, mi->mntdir, fstype,
> mi->optstr, 0, 0, !mi->mounted);
> } else {
> @@ -443,31 +483,39 @@
> } else
> printf(_("%s not restarted\n"), CLEANERD_NAME);
> out:
> + my_free(exopts);
> return res;
> }
>
> static void update_mount_state(struct nilfs_mount_info *mi,
> const struct mount_options *mo)
> {
> - pid_t pid = (mi->type == RW2RW_REMOUNT) ? mi->gcpid : 0;
> + pid_t pid = fake ? mi->gcpid : 0;
Right. The old gcpid will break except for the fake mode.
> char *exopts;
> int rungc;
>
> + if (mo->flags & MS_RDONLY)
> + mi->protperiod = ULONG_MAX;
> +
New pp option can be parsed here.
if ((mo->flags & MS_RDONLY) || (mo->flags & MS_BIND) ||
find_opt(mo->extra_opts, pp_opt_fmt, &prot_period) < 0)
mi->protperiod = ULONG_MAX;
else
mi->protperiod = prot_period;
Note that we don't invoke cleanerd for a bind mount.
> rungc = !(mo->flags & MS_RDONLY) && !(mo->flags & MS_BIND) &&
> - (mi->type != RW2RW_REMOUNT || mi->gcpid == 0);
> + (pid == 0);
> if (!check_mtab()) {
> if (rungc)
> printf(_("%s not started\n"), CLEANERD_NAME);
> return;
> }
> if (rungc) {
> - if (start_cleanerd(mi->device, mi->mntdir, &pid) < 0)
> + if (start_cleanerd(mi->device, mi->mntdir, mi->protperiod,
> + &pid) < 0)
> error(_("%s aborted"), CLEANERD_NAME);
> else if (verbose)
> printf(_("%s: started %s\n"), progname, CLEANERD_NAME);
> - }
> + } else
> + if (!fake)
> + pid = 0;
> +
> my_free(mi->optstr);
> - exopts = fix_extra_opts_string(mo->extra_opts, pid);
> + exopts = fix_extra_opts_string(mo->extra_opts, pid, mi->protperiod);
> mi->optstr = fix_opts_string(((mo->flags & ~MS_NOMTAB) | MS_NETDEV),
> exopts, NULL);
>
> --- man/mount.nilfs2.8.mount_pp_opt 2009-07-19 16:53:00.000000000 +0200
> +++ man/mount.nilfs2.8 2009-12-02 10:27:26.000000000 +0100
> @@ -103,6 +103,12 @@
> remount the file system read-only, or panic and halt the system.) The
> default is continue.
> .TP
> +.BR pp=\fP\fIprotection-period\fP
> +Specify the \fIprotection-period\fP for the cleaner daemon (in
> +seconds). nilfs_cleanerd never deletes recent checkpoints whose
> +elapsed time from its creation is smaller than
> +\fIprotection-period\fP.
> +.TP
> .BR order=relaxed " / " order=strict
> Specify order semantics for file data. Metadata is always written to
> follow the POSIX semantics about the order of filesystem operations.
Thanks,
Ryusuke Konishi
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2009-12-03 17:22 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-27 14:21 pp (protection period) mount option David Smid
[not found] ` <4B0FE052.70307-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
2009-11-27 16:23 ` Ryusuke Konishi
[not found] ` <20091128.012303.54434171.ryusuke-sG5X7nlA6pw@public.gmane.org>
2009-11-28 21:16 ` David Smid
[not found] ` <749598c60911281316i40b591b1hcb055b0867617f0e-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-12-01 15:44 ` Ryusuke Konishi
[not found] ` <20091202.004422.69931110.ryusuke-sG5X7nlA6pw@public.gmane.org>
2009-12-01 16:02 ` Ryusuke Konishi
[not found] ` <20091202.010205.38314732.ryusuke-sG5X7nlA6pw@public.gmane.org>
2009-12-02 17:20 ` David Smid
[not found] ` <4B16A1CA.9050608-0RIiUExYzkzCfDggNXIi3w@public.gmane.org>
2009-12-03 17:22 ` Ryusuke Konishi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.