def try_umount(self): cmd = ['umount', self.mount_point] (ret, out, err) = self.vcall(cmd, err_to_warn=True) if ret == 0: return 0 if "not currently mounted" in err: return 0 """ don't try to kill process using the source of a protected bind mount """ if protected_mount(self.mount_point): return 1 """ best effort kill of all processes that might block the umount operation. The priority is given to mass action reliability, ie don't contest oprator's will """ cmd = ['sync'] (ret, out, err) = self.vcall(cmd) for i in range(4): cmd = ['fuser', '-kcv', self.mount_point] (ret, out, err) = self.vcall(cmd, err_to_info=True) self.log.info('umount %s' % self.mount_point) cmd = ['umount', self.mount_point] ret = qcall(cmd) if ret == 0: break return ret
def try_umount(self): cmd = ['umount', self.mount_point] (ret, out, err) = self.vcall(cmd, err_to_info=True) if ret == 0: return 0 # don't try to kill process using the source of a # protected bind mount if protected_mount(self.mount_point): return 1 # best effort kill of all processes that might block # the umount operation. The priority is given to mass # action reliability, ie don't contest oprator's will cmd = ['sync'] (ret, out, err) = self.vcall(cmd, err_to_info=True) for i in range(4): cmd = ['fuser', '-k', '-x', '-c', self.mount_point] (ret, out, err) = self.vcall(cmd, err_to_info=True) self.log.info('umount %s' % self.mount_point) cmd = ['umount', self.mount_point] ret = qcall(cmd) if ret == 0: break return ret
def snapdestroykey(self, snap_key): """ destroy a snapshot for a mount_point """ clonedev = self.snaps[snap_key]['snapdev'] dom, clonefset = clonedev.split('#') o = rcAdvfs.Fdmns() try: d = o.get_fdmn(dom) except rcAdvfs.ExInit: raise ex.syncSnapDestroyError if clonefset not in d.fsets: return if protected_mount(self.snaps[snap_key]['snap_mnt']): self.log.error("the clone fset is no longer mounted in %s. panic."%self.snaps[snap_key]['snap_mnt']) raise ex.excError cmd = ['fuser', '-kcv', self.snaps[snap_key]['snap_mnt']] (ret, out, err) = self.vcall(cmd, err_to_info=True) cmd = ['umount', self.snaps[snap_key]['snap_mnt']] (ret, out, err) = self.vcall(cmd) if ret != 0: raise ex.excError (ret, buff, err) = self.vcall(['rmfset', '-f', dom, clonefset]) if ret != 0: raise ex.syncSnapDestroyError
def try_umount(self): cmd = ['umount', self.mount_point] (ret, out, err) = self.vcall(cmd, err_to_info=True) if ret == 0: return 0 """ don't try to kill process using the source of a protected bind mount """ if protected_mount(self.mount_point): return 1 """ best effort kill of all processes that might block the umount operation. The priority is given to mass action reliability, ie don't contest oprator's will """ cmd = ['sync'] (ret, out, err) = self.vcall(cmd, err_to_info=True) for i in range(4): nb_killed = self.killfuser(self.mount_point) self.log.info('umount %s' % self.mount_point) cmd = ['umount', self.mount_point] ret = qcall(cmd) if ret == 0 or nb_killed == 0: break if ret != 0: self.log.info( "no more process using %s, yet umount fails. try forced umount." % self.mount_point) cmd = ['umount', '-f', self.mount_point] (ret, out, err) = self.vcall(cmd, err_to_info=True) return ret
def snapdestroykey(self, s): if protected_mount(self.snaps[s]['snap_mnt']): self.log.error("the snapshot is no longer mounted in %s. panic."%self.snaps[s]['snap_mnt']) raise ex.excError """ fuser on HP-UX outs to stderr ... """ cmd = ['fuser', '-c', '-x', '-k', self.snaps[s]['snap_mnt']] ret = qcall(cmd) cmd = ['umount', self.snaps[s]['snap_mnt']] (ret, out, err) = self.vcall(cmd) cmd = ['snapshot', '-d', self.snaps[s]['snap_dev']] (ret, buff, err) = self.vcall(cmd)
def try_umount(self, dev=None, mnt=None, fs_type=None): if dev is None: dev = self.device if mnt is None: mnt = self.mount_point if fs_type is None: fs_type = self.fs_type if fs_type == "zfs": ret, out, err = self.umount_zfs(dev, mnt) else: ret, out, err = self.umount_generic(mnt) if ret == 0: return 0 if "not mounted" in err: return 0 # don't try to kill process using the source of a # protected bind mount if protected_mount(mnt): return 1 # best effort kill of all processes that might block # the umount operation. The priority is given to mass # action reliability, ie don't contest oprator's will cmd = ['sync'] ret, out, err = self.vcall(cmd) if os.path.isdir(dev): fuser_opts = '-kv' else: fuser_opts = '-kmv' for _ in range(4): cmd = ['fuser', fuser_opts, mnt] (ret, out, err) = self.vcall(cmd, err_to_info=True) self.log.info('umount %s', mnt) cmd = ['umount', mnt] ret = qcall(cmd) if ret == 0: break return ret
def snapdestroykey(self, s): if protected_mount(self.snaps[s]['snap_mnt']): self.log.error("the snapshot is no longer mounted in %s. panic."%self.snaps[s]['snap_mnt']) raise ex.excError cmd = ['fuser', '-kmv', self.snaps[s]['snap_mnt']] (ret, out, err) = self.vcall(cmd, err_to_info=True) cmd = [rcEnv.syspaths.umount, self.snaps[s]['snap_mnt']] (ret, out, err) = self.vcall(cmd) udevadm_settle() cmd = ['lvremove', '-A', 'n', '-f', self.snaps[s]['snap_dev']] self.log.info(' '.join(cmd)) for i in range(1, 30): out, err, ret = justcall(cmd) if ret == 0: break err_l1 = err.split('\n') err_l2 = [] out_l = out.split('\n') for e in err_l1: if 'This metadata update is NOT backed up' in e: pass elif 'Falling back to direct link removal.' in e: out_l.append(e) elif 'Falling back to direct node removal.' in e: out_l.append(e) else: err_l2.append(e) err = '\n'.join(err_l2) out = '\n'.join(out_l) if len(out) > 0: self.log.info(out) if len(err) > 0: self.log.error(err) if ret != 0: self.log.error("failed to remove snapshot %s (attempts: %d)"%(self.snaps[s]['snap_dev'], i)) elif i > 1: self.log.info("successfully removed snapshot %s (attempts: %d)"%(self.snaps[s]['snap_dev'], i)) del(self.snaps[s])