Hi, On Wednesday, 1 November 2006 10:57, Pavel Machek wrote: > Hi! > > > > > > Well, but if some data structures are different than the tmpfs driver > > > > > thinks > > > > > they are, the kernel could oops/panic at umount, couldn't it? > > > > > > > > Yes, it could, but they won't be. After a successful resume the tmpfs > > > > will > > > > be in the same state as before the suspend, won't it? > > > > > > Ah, ok. That's the detail that i forgot. > > > > > > > [The problem with disk filesystems is they tend to preserve data across > > > > the > > > > suspend-resume cycle. ;-)] > > > > > > Yes, which is of course a different issue. > > > > > > No objections from my side, then :-) > > > > Thanks. > > > > Appended is the version of the patch I'd like to apply if there are no > > objections. > > > > Please note this patch will be _necessary_ for s2disk/s2both to work if the > > kernel starts to carry out the freezeing of bdevs during the suspend (not > > implemented yet, but coming). > > Looks good to me... > > > > @@ -66,7 +67,9 @@ static char password[PASS_SIZE]; > > #define encrypt 0 > > #define key_name NULL > > #endif > > +#ifdef CONFIG_BOTH > > static char s2ram; > > +#endif > > I'd say that unused variable is less evil than ifdef...
Without the #ifdef the gcc spits a warning somewhere below. > > @@ -1221,6 +1226,10 @@ int main(int argc, char *argv[]) > > } > > #endif > > > > + chroot_path = malloc(MAX_STR_LEN); > > + if (!chroot_path) > > + goto Free; > > + > > Can we just allocate it statically? Yeah, certainly. Good idea. --- suspend.c | 65 ++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 18 deletions(-) Index: suspend/suspend.c =================================================================== --- suspend.orig/suspend.c +++ suspend/suspend.c @@ -19,6 +19,7 @@ #include <sys/vt.h> #include <sys/wait.h> #include <sys/time.h> +#include <sys/resource.h> #include <time.h> #include <linux/kd.h> #include <linux/tiocl.h> @@ -66,7 +67,9 @@ static char password[PASS_SIZE]; #define encrypt 0 #define key_name NULL #endif +#ifdef CONFIG_BOTH static char s2ram; +#endif static char early_writeout; static char splash_param; #define SHUTDOWN_LEN 16 @@ -470,6 +473,7 @@ static int save_image(struct swap_map_ha error = -errno; if (!error) printf(" done (%u pages)\n", nr_pages); + return error; } @@ -1148,11 +1152,12 @@ static int lock_vt(void) int main(int argc, char *argv[]) { unsigned int mem_size; - char *chroot_path; struct stat stat_buf; int resume_fd, snapshot_fd, vt_fd, orig_vc = -1, suspend_vc = -1; dev_t resume_dev; int orig_loglevel, orig_swappiness, ret; + struct rlimit rlim; + static char chroot_path[MAX_STR_LEN]; /* Make sure the 0, 1, 2 descriptors are open before opening the * snapshot and resume devices @@ -1230,23 +1235,44 @@ int main(int argc, char *argv[]) return ret; } + snprintf(chroot_path, MAX_STR_LEN, "/proc/%d", getpid()); + if (mount("none", chroot_path, "tmpfs", 0, NULL)) { + ret = errno; + fprintf(stderr, "suspend: Could not mount tmpfs on %s\n", chroot_path); + return ret; + } + + ret = 0; if (stat(resume_dev_name, &stat_buf)) { fprintf(stderr, "suspend: Could not stat the resume device file\n"); - return ENODEV; + ret = ENODEV; + goto Umount; } if (!S_ISBLK(stat_buf.st_mode)) { fprintf(stderr, "suspend: Invalid resume device\n"); - return EINVAL; + ret = EINVAL; + goto Umount; + } + if (chdir(chroot_path)) { + ret = errno; + fprintf(stderr, "suspend: Could not change directory to %s\n", + chroot_path); + goto Umount; + } + resume_dev = stat_buf.st_rdev; + if (mknod("resume", S_IFBLK | 0600, resume_dev)) { + ret = errno; + fprintf(stderr, "suspend: Could not create %s/%s\n", + chroot_path, "resume"); + goto Umount; } - resume_fd = open(resume_dev_name, O_RDWR); + resume_fd = open("resume", O_RDWR); if (resume_fd < 0) { ret = errno; fprintf(stderr, "suspend: Could not open the resume device\n"); - return ret; + goto Umount; } - resume_dev = stat_buf.st_rdev; - ret = 0; if (stat(snapshot_dev_name, &stat_buf)) { fprintf(stderr, "suspend: Could not stat the snapshot device file\n"); ret = ENODEV; @@ -1305,30 +1331,27 @@ int main(int argc, char *argv[]) orig_swappiness = get_swappiness(); set_swappiness(suspend_swappiness); - chroot_path = mem_pool; - sprintf(chroot_path, "/proc/%d", getpid()); - if (!s2ram && chroot(chroot_path)) { - ret = errno; - fprintf(stderr, "suspend: Could not chroot to %s\n", chroot_path); - goto Unlock_vt; - } - chdir("/"); - sync(); splash.progress(10); + rlim.rlim_cur = 0; + rlim.rlim_max = 0; + setrlimit(RLIMIT_NOFILE, &rlim); + setrlimit(RLIMIT_NPROC, &rlim); + setrlimit(RLIMIT_CORE, &rlim); + ret = suspend_system(snapshot_fd, resume_fd); if (orig_loglevel >= 0) set_kernel_console_loglevel(orig_loglevel); + close_printk(); if(orig_swappiness >= 0) set_swappiness(orig_swappiness); close_swappiness(); -Unlock_vt: unlock_vt(); Restore_console: splash.finish(); @@ -1337,7 +1360,13 @@ Close_snapshot_fd: close(snapshot_fd); Close_resume_fd: close(resume_fd); - +Umount: + if (chdir("/")) { + ret = errno; + fprintf(stderr, "suspend: Could not change directory to /\n"); + } else { + umount(chroot_path); + } #ifdef CONFIG_ENCRYPT if (encrypt) gcry_cipher_close(cipher_handle); ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ Suspend-devel mailing list Suspend-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/suspend-devel