From f273aa26f4cfe715a14ab0ded62c0a24e7d5e121 Mon Sep 17 00:00:00 2001 From: Marius Tomaschewski Date: Mon, 20 Mar 2006 18:51:34 +0000 Subject: [PATCH] - Renamed private MediaManager::forceMediaRelease function to forceReleaseShared (more exact name) - Implemented forceRelaseAllMedia() that can be used to release also foreign (user) mounts. - Added use of forceRelaseAllMedia for CD/DVDs if FORCE_RELEASE_FOREIGN is 1 (default 0) - little cleanup of the checkAttached function --- zypp/media/MediaCD.cc | 16 +++++++--- zypp/media/MediaDISK.cc | 2 +- zypp/media/MediaHandler.cc | 77 ++++++++++++++++++++++++++++++++++++++++++---- zypp/media/MediaHandler.h | 21 ++++++++----- zypp/media/MediaISO.cc | 2 +- zypp/media/MediaManager.cc | 2 +- zypp/media/MediaManager.h | 2 +- zypp/media/MediaNFS.cc | 2 +- zypp/media/MediaSMB.cc | 2 +- 9 files changed, 103 insertions(+), 23 deletions(-) diff --git a/zypp/media/MediaCD.cc b/zypp/media/MediaCD.cc index 390fb58..266debf 100644 --- a/zypp/media/MediaCD.cc +++ b/zypp/media/MediaCD.cc @@ -31,7 +31,8 @@ #include -#define DELAYED_VERIFY 1 +#define DELAYED_VERIFY 1 +#define FORCE_RELEASE_FOREIGN 0 using namespace std; @@ -501,9 +502,13 @@ namespace zypp { catch (const Exception & excpt_r) { ZYPP_CAUGHT(excpt_r); - if (eject && openTray( mediaSourceName())) + if (eject) { - return; +#if FORCE_RELEASE_FOREIGN + forceRelaseAllMedia(false); +#endif + if(openTray( mediaSourceName())) + return; } ZYPP_RETHROW(excpt_r); } @@ -511,6 +516,9 @@ namespace zypp { // eject device if (eject) { +#if FORCE_RELEASE_FOREIGN + forceRelaseAllMedia(false); +#endif openTray( mediaSourceName() ); } } @@ -550,7 +558,7 @@ namespace zypp { bool MediaCD::isAttached() const { - return checkAttached(true); + return checkAttached(false); } /////////////////////////////////////////////////////////////////// diff --git a/zypp/media/MediaDISK.cc b/zypp/media/MediaDISK.cc index 8499c76..c3bd0ef 100644 --- a/zypp/media/MediaDISK.cc +++ b/zypp/media/MediaDISK.cc @@ -227,7 +227,7 @@ namespace zypp { bool MediaDISK::isAttached() const { - return checkAttached(true); + return checkAttached(false); } /////////////////////////////////////////////////////////////////// diff --git a/zypp/media/MediaHandler.cc b/zypp/media/MediaHandler.cc index af2d879..08f161a 100644 --- a/zypp/media/MediaHandler.cc +++ b/zypp/media/MediaHandler.cc @@ -430,7 +430,7 @@ MediaHandler::isSharedMedia() const // DESCRIPTION : // bool -MediaHandler::checkAttached(bool isDevice, bool fsType) const +MediaHandler::checkAttached(bool matchMountFs) const { bool _isAttached = false; @@ -465,9 +465,9 @@ MediaHandler::checkAttached(bool isDevice, bool fsType) const is_device = true; } - if( isDevice && is_device) + if( is_device && ref.mediaSource->maj_nr) { - std::string mtype(fsType ? e->type : ref.mediaSource->type); + std::string mtype(matchMountFs ? e->type : ref.mediaSource->type); MediaSource media(mtype, e->src, dev_info.major(), dev_info.minor()); if( ref.mediaSource->equals( media) && @@ -482,9 +482,9 @@ MediaHandler::checkAttached(bool isDevice, bool fsType) const // differs } else - if( !isDevice && !is_device) + if(!is_device && !ref.mediaSource->maj_nr) { - std::string mtype(fsType ? e->type : ref.mediaSource->type); + std::string mtype(matchMountFs ? e->type : ref.mediaSource->type); MediaSource media(mtype, e->src); if( ref.mediaSource->equals( media) && @@ -633,7 +633,7 @@ void MediaHandler::release( bool eject ) _mediaSource.reset(NULL); MediaManager manager; - manager.forceMediaRelease(media); + manager.forceReleaseShared(media); setMediaSource(media); DBG << "Releasing media (forced) " << _mediaSource->asString() << std::endl; @@ -649,6 +649,71 @@ void MediaHandler::release( bool eject ) MIL << "Released: " << *this << endl; } +void MediaHandler::forceRelaseAllMedia(bool matchMountFs) +{ + AttachedMedia ref( attachedMedia()); + if( !ref.mediaSource) + return; + + MountEntries entries( MediaManager::getMountEntries()); + MountEntries::const_iterator e; + for( e = entries.begin(); e != entries.end(); ++e) + { + bool is_device = false; + std::string dev_path(Pathname(e->src).asString()); + PathInfo dev_info; + + if( dev_path.compare(0, sizeof("/dev/")-1, "/dev/") == 0 && + dev_info(e->src) && dev_info.isBlk()) + { + is_device = true; + } + + if( is_device && ref.mediaSource->maj_nr) + { + std::string mtype(matchMountFs ? e->type : ref.mediaSource->type); + MediaSource media(mtype, e->src, dev_info.major(), dev_info.minor()); + + if( ref.mediaSource->equals( media) && e->type != "subfs") + { + DBG << "Forcing release of media device " + << ref.mediaSource->asString() + << " in the mount table as " + << e->src << std::endl; + Mount mount; + try { + mount.umount(e->dir); + } + catch (const Exception &e) + { + ZYPP_CAUGHT(e); + } + } + } + else + if(!is_device && !ref.mediaSource->maj_nr) + { + std::string mtype(matchMountFs ? e->type : ref.mediaSource->type); + MediaSource media(mtype, e->src); + if( ref.mediaSource->equals( media) && e->type != "subfs") + { + DBG << "Forcing release of media name " + << ref.mediaSource->asString() + << " in the mount table as " + << e->src << std::endl; + Mount mount; + try { + mount.umount(e->dir); + } + catch (const Exception &e) + { + ZYPP_CAUGHT(e); + } + } + } + } +} + bool MediaHandler::checkAttachPoint(const Pathname &apoint) const { diff --git a/zypp/media/MediaHandler.h b/zypp/media/MediaHandler.h index 295127b..f426a85 100644 --- a/zypp/media/MediaHandler.h +++ b/zypp/media/MediaHandler.h @@ -256,15 +256,22 @@ class MediaHandler { /** * Check actual mediaSource attachment against the current * mount table of the system. Used to implement isAttached(). - * \param aDevice If to check only against devices in the - * mount table or only against other mounted - * sources (nfs, cifs, loop mounted file). - * \param fsType If to use the filesystem type from the - * mount table or not (nfs, smb and cifs only). + * \param matchMountFs If to use the filesystem type from the + * mount table (nfs, smb and cifs) or from mediaSource + * while compare of a mount entry with mediaSource. * \return true, if the media appears in the mount table. */ - bool checkAttached(bool aDevice, - bool fsType=false) const; + bool checkAttached(bool matchMountFs) const; + + /** + * Call to this function will try to release all media matching + * the currenlty attached media source, that it is able to find + * in the mount table. This means also foreign (user) mounts! + * \param matchMountFs If to use the filesystem type from the + * mount table (nfs, smb and cifs) or from mediaSource + * while compare of a mount entry with mediaSource. + */ + void forceRelaseAllMedia(bool matchMountFs); protected: diff --git a/zypp/media/MediaISO.cc b/zypp/media/MediaISO.cc index 701a75b..2ee7e8f 100644 --- a/zypp/media/MediaISO.cc +++ b/zypp/media/MediaISO.cc @@ -135,7 +135,7 @@ namespace zypp bool MediaISO::isAttached() const { - return checkAttached(false, false); + return checkAttached(false); } // --------------------------------------------------------------- diff --git a/zypp/media/MediaManager.cc b/zypp/media/MediaManager.cc index bf33f6d..0783a5e 100644 --- a/zypp/media/MediaManager.cc +++ b/zypp/media/MediaManager.cc @@ -780,7 +780,7 @@ namespace zypp // --------------------------------------------------------------- void - MediaManager::forceMediaRelease(const MediaSourceRef &media) + MediaManager::forceReleaseShared(const MediaSourceRef &media) { MutexLock glock(g_Mutex); diff --git a/zypp/media/MediaManager.h b/zypp/media/MediaManager.h index 085b8b5..88dc180 100644 --- a/zypp/media/MediaManager.h +++ b/zypp/media/MediaManager.h @@ -738,7 +738,7 @@ namespace zypp * \param media The media source reference to release. */ void - forceMediaRelease(const MediaSourceRef &media); + forceReleaseShared(const MediaSourceRef &media); private: /** diff --git a/zypp/media/MediaNFS.cc b/zypp/media/MediaNFS.cc index 529d886..b1f35ce 100644 --- a/zypp/media/MediaNFS.cc +++ b/zypp/media/MediaNFS.cc @@ -158,7 +158,7 @@ namespace zypp { bool MediaNFS::isAttached() const { - return checkAttached(false, true); + return checkAttached(true); } /////////////////////////////////////////////////////////////////// diff --git a/zypp/media/MediaSMB.cc b/zypp/media/MediaSMB.cc index 2abda26..10a330f 100644 --- a/zypp/media/MediaSMB.cc +++ b/zypp/media/MediaSMB.cc @@ -268,7 +268,7 @@ namespace zypp { bool MediaSMB::isAttached() const { - return checkAttached(false, true); + return checkAttached(true); } /////////////////////////////////////////////////////////////////// -- 2.7.4