[buildd-tools-devel] Bug#557197: Bug#557197: Bug#557197: schroot -b doesn't work for chroots with type=block-device

Roger Leigh rleigh at codelibre.net
Sun Dec 13 14:38:53 UTC 2009


tags 557197 + fixed-upstream patch pending
thanks

On Fri, Nov 20, 2009 at 11:36:00AM -0500, Evan Broder wrote:
> On Fri, Nov 20, 2009 at 6:40 AM, Roger Leigh <rleigh at codelibre.net> wrote:
> > On Fri, Nov 20, 2009 at 02:46:47AM -0500, Evan Broder wrote:
> >> Package: schroot
> >> Version: 1.3.1-1
> >> Severity: important
> >>
> >> If I use schroot -b to create a session of a chroot with
> >> type=block-device, I get a valid chroot session name back, and the
> >> chroot is setup, but it's not recorded in /var/lib/schroot/session,
> >> and I can't then later run it.
> >
> > Just to double check, this is definitely version 1.3.1 from
> > experimental, not the stable/unstable version?
> >
> > I thought this was fixed in 1.3.1, but I'll double check.
> > It /should/ be creating a session file, but obviously isn't
> > in your case.

Fixed in git with the following patch; I'll make a new release
shortly.


Regards,
Roger


diff --git a/sbuild/sbuild-chroot-block-device-base.cc b/sbuild/sbuild-chroot-block-device-base.cc
index 7010a49..d02a4f0 100644
--- a/sbuild/sbuild-chroot-block-device-base.cc
+++ b/sbuild/sbuild-chroot-block-device-base.cc
@@ -114,75 +114,6 @@ chroot_block_device_base::setup_env (chroot const& chroot,
   env.add("CHROOT_DEVICE", get_device());
 }
 
-void
-chroot_block_device_base::setup_lock (chroot::setup_type type,
-				      bool               lock,
-				      int                status)
-{
-  /* Only lock during setup, not exec. */
-  if (type == EXEC_START || type == EXEC_STOP)
-    return;
-
-  /* Lock is preserved through the entire session. */
-  if ((type == SETUP_START && lock == false) ||
-      (type == SETUP_STOP && lock == true))
-    return;
-
-  try
-    {
-      if (!stat(this->device).is_block())
-	{
-	  throw error(get_device(), DEVICE_NOTBLOCK);
-	}
-      else
-	{
-#ifdef SBUILD_FEATURE_UNION
-	  /* We don't lock the device if union is configured. */
-	  const chroot *base = dynamic_cast<const chroot *>(this);
-	  assert(base);
-	  chroot_facet_union::const_ptr puni
-	    (base->get_facet<chroot_facet_union>());
-	  assert(puni);
-	  if (puni->get_union_configured())
-	    return;
-#endif
-
-	  sbuild::device_lock dlock(this->device);
-	  if (lock)
-	    {
-	      try
-		{
-		  dlock.set_lock(lock::LOCK_EXCLUSIVE, 15);
-		}
-	      catch (sbuild::lock::error const& e)
-		{
-		  throw error(get_device(), DEVICE_LOCK, e);
-		}
-	    }
-	  else
-	    {
-	      try
-		{
-		  dlock.unset_lock();
-		}
-	      catch (sbuild::lock::error const& e)
-		{
-		  throw error(get_device(), DEVICE_UNLOCK, e);
-		}
-	    }
-	}
-    }
-  catch (sbuild::stat::error const& e) // Failed to stat
-    {
-      // Don't throw if stopping a session and the device stat
-      // failed.  This is because the setup scripts shouldn't fail
-      // to be run if the block device no longer exists, which
-      // would prevent the session from being ended.
-      if (type != SETUP_STOP)
-	throw;
-    }
-}
-
 sbuild::chroot::session_flags
 chroot_block_device_base::get_session_flags (chroot const& chroot) const
 {
diff --git a/sbuild/sbuild-chroot-block-device-base.h b/sbuild/sbuild-chroot-block-device-base.h
index ff5cf49..bba299a 100644
--- a/sbuild/sbuild-chroot-block-device-base.h
+++ b/sbuild/sbuild-chroot-block-device-base.h
@@ -83,11 +83,6 @@ namespace sbuild
 
   protected:
     virtual void
-    setup_lock (chroot::setup_type type,
-		bool               lock,
-		int                status);
-
-    virtual void
     get_details (chroot const& chroot,
 		 format_detail& detail) const;
 
@@ -100,7 +95,6 @@ namespace sbuild
 		 keyfile const& keyfile,
 		 string_list&   used_keys);
 
-  private:
     /// The block device to use.
     std::string device;
   };
diff --git a/sbuild/sbuild-chroot-block-device.cc b/sbuild/sbuild-chroot-block-device.cc
index 2730e5e..680131a 100644
--- a/sbuild/sbuild-chroot-block-device.cc
+++ b/sbuild/sbuild-chroot-block-device.cc
@@ -111,6 +111,83 @@ chroot_block_device::setup_env (chroot const& chroot,
   chroot_block_device_base::setup_env(chroot, env);
 }
 
+void
+chroot_block_device::setup_lock (chroot::setup_type type,
+				 bool               lock,
+				 int                status)
+{
+  /* Only lock during setup, not exec. */
+  if (type == EXEC_START || type == EXEC_STOP)
+    return;
+
+  /* Lock is preserved through the entire session. */
+  if ((type == SETUP_START && lock == false) ||
+      (type == SETUP_STOP && lock == true))
+    return;
+
+  try
+    {
+      if (!stat(this->get_device()).is_block())
+	{
+	  throw error(get_device(), DEVICE_NOTBLOCK);
+	}
+      else
+	{
+#ifdef SBUILD_FEATURE_UNION
+	  /* We don't lock the device if union is configured. */
+	  const chroot *base = dynamic_cast<const chroot *>(this);
+	  assert(base);
+	  chroot_facet_union::const_ptr puni
+	    (base->get_facet<chroot_facet_union>());
+	  assert(puni);
+	  if (puni->get_union_configured())
+	    return;
+#endif
+
+	  sbuild::device_lock dlock(this->device);
+	  if (lock)
+	    {
+	      try
+		{
+		  dlock.set_lock(lock::LOCK_EXCLUSIVE, 15);
+		}
+	      catch (sbuild::lock::error const& e)
+		{
+		  throw error(get_device(), DEVICE_LOCK, e);
+		}
+	    }
+	  else
+	    {
+	      try
+		{
+		  dlock.unset_lock();
+		}
+	      catch (sbuild::lock::error const& e)
+		{
+		  throw error(get_device(), DEVICE_UNLOCK, e);
+		}
+	    }
+	}
+    }
+  catch (sbuild::stat::error const& e) // Failed to stat
+    {
+      // Don't throw if stopping a session and the device stat
+      // failed.  This is because the setup scripts shouldn't fail
+      // to be run if the block device no longer exists, which
+      // would prevent the session from being ended.
+      if (type != SETUP_STOP)
+	throw;
+    }
+
+  /* Create or unlink session information. */
+  if ((type == SETUP_START && lock == true) ||
+      (type == SETUP_STOP && lock == false && status == 0))
+    {
+      bool start = (type == SETUP_START);
+      setup_session_info(start);
+    }
+}
+
 sbuild::chroot::session_flags
 chroot_block_device::get_session_flags (chroot const& chroot) const
 {
diff --git a/sbuild/sbuild-chroot-block-device.h b/sbuild/sbuild-chroot-block-device.h
index eb88865..9592268 100644
--- a/sbuild/sbuild-chroot-block-device.h
+++ b/sbuild/sbuild-chroot-block-device.h
@@ -76,6 +76,13 @@ namespace sbuild
     virtual session_flags
     get_session_flags (chroot const& chroot) const;
 
+  protected:
+    virtual void
+    setup_lock (chroot::setup_type type,
+		bool               lock,
+		int                status);
+
+
     virtual void
     get_details (chroot const&  chroot,
 		 format_detail& detail) const;

-- 
  .''`.  Roger Leigh
 : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
 `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
   `-    GPG Public Key: 0x25BFB848   Please GPG sign your mail.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.alioth.debian.org/pipermail/buildd-tools-devel/attachments/20091213/4c102ced/attachment-0001.pgp>


More information about the Buildd-tools-devel mailing list