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

Reply via email to