~myungjoo-ham/tizen-mic/master

« back to all changes in this revision

Viewing changes to mic/utils/fs_related.py

  • Committer: biao716.wang
  • Date: 2022-08-16 07:33:31 UTC
  • Revision ID: git-v1:dd42e4f1689c628222fdf4f4ba83229e103e8207
Support f2fs option and check if kernel support f2s

Change-Id: I4aa333d961296073661e27c24593f651f7d372bc
Signed-off-by: biao716.wang <biao716.wang@samsung.com>

Show diffs side-by-side

added added

removed removed

Lines of Context:
446
446
 
447
447
        self.mounted = True
448
448
 
 
449
class F2fsDiskMount(DiskMount):
 
450
    """A DiskMount object that is able to format/resize f2fs filesystems."""
 
451
    def __init__(self, disk, mountdir, fstype, blocksize, fslabel, rmmountdir=True, skipformat = False, fsopts = None, fsuuid=None):
 
452
        self.__check_f2fs()
 
453
        DiskMount.__init__(self, disk, mountdir, fstype, rmmountdir)
 
454
        self.blocksize = blocksize
 
455
        self.fslabel = fslabel.replace("/", "")
 
456
        self.uuid = fsuuid or None
 
457
        self.skipformat = skipformat
 
458
        self.fsopts = fsopts
 
459
        self.__f2fsopts = None
 
460
        self.blkidcmd = find_binary_path("blkid")
 
461
        self.dumpe2fs = find_binary_path("dump." + self.fstype)
 
462
        self.fsckcmd = find_binary_path("fsck." + self.fstype)
 
463
        self.resizecmd = find_binary_path("resize." + self.fstype)
 
464
 
 
465
    def __get_f2fsopts(self):
 
466
        return self.__f2f2opts
 
467
 
 
468
    def __set_f2fsopts(self, val):
 
469
        if val is None:
 
470
            self.__f2fsopts = None
 
471
        else:
 
472
            self.__f2fsopts = val
 
473
    f2fsopts = property(__get_f2fsopts, __set_f2fsopts)
 
474
 
 
475
    def __check_f2fs(self):
 
476
        found = False
 
477
        """ Need to load f2fs module to mount it """
 
478
        load_module("f2fs")
 
479
        for line in open("/proc/filesystems"):
 
480
            if line.find("f2fs") > -1:
 
481
                found = True
 
482
                break
 
483
        if not found:
 
484
            raise MountError("Your system can't mount f2fs filesystem, please make sure your kernel has f2fs support and the module f2fs.ko has been loaded.")
 
485
 
 
486
    def __parse_field(self, output, field):
 
487
        for line in output.split(" "):
 
488
            if line.startswith(field + "="):
 
489
                return line[len(field) + 1:].strip().replace("\"", "")
 
490
 
 
491
        raise KeyError("Failed to find field '%s' in output" % field)
 
492
 
 
493
    def __format_filesystem(self):
 
494
        if self.skipformat:
 
495
            msger.debug("Skip filesystem format.")
 
496
            return
 
497
 
 
498
        msger.verbose("Formating %s filesystem on %s" % (self.fstype, self.disk.device))
 
499
 
 
500
        cmdlist = [self.mkfscmd, "-l", self.fslabel]
 
501
        if self.__f2fsopts:
 
502
            cmdlist.extend(self._f2fsopts.split())
 
503
        cmdlist.extend([self.disk.device])
 
504
 
 
505
        rc, errout = runner.runtool(cmdlist, catch=2)
 
506
        if rc != 0:
 
507
            raise MountError("Error creating %s filesystem on disk %s:\n%s" %
 
508
                             (self.fstype, self.disk.device, errout))
 
509
 
 
510
        self.uuid = self.__parse_field(runner.outs([self.blkidcmd, self.disk.device]), "UUID")
 
511
 
 
512
    def __resize_filesystem(self, size = None):
 
513
        msger.info("Resizing filesystem ...")
 
514
        current_size = os.stat(self.disk.lofile)[stat.ST_SIZE]
 
515
 
 
516
        if size is None:
 
517
            size = self.disk.size
 
518
 
 
519
        if size == current_size:
 
520
            return
 
521
 
 
522
        if size > current_size:
 
523
            self.disk.expand(size=size)
 
524
 
 
525
        self.__fsck()
 
526
 
 
527
        return size
 
528
 
 
529
    def __create(self):
 
530
        resize = False
 
531
        if not self.disk.fixed() and self.disk.exists():
 
532
            resize = True
 
533
 
 
534
        self.disk.create()
 
535
 
 
536
        if resize:
 
537
            self.__resize_filesystem()
 
538
        else:
 
539
            self.__format_filesystem()
 
540
 
 
541
    def mount(self, options = None, init_expand = False):
 
542
        self.__create()
 
543
        if init_expand:
 
544
            expand_size = int(self.disk.size * 1.5)
 
545
            msger.info("Initial partition size expanded : %ld -> %ld" % (self.disk.size, expand_size))
 
546
            self.__resize_filesystem(expand_size)
 
547
            self.disk.reread_size()
 
548
        DiskMount.mount(self, options)
 
549
 
 
550
    def __fsck(self):
 
551
        msger.info("Checking filesystem %s" % self.disk.lofile)
 
552
        runner.quiet([self.fsckcmd, self.disk.lofile])
 
553
 
 
554
    def __get_size_from_filesystem(self):
 
555
        return self.disk.size
 
556
 
 
557
    def __resize_to_minimal(self):
 
558
        msger.info("Resizing filesystem to minimal ...")
 
559
        self.__fsck()
 
560
 
 
561
        return self.__get_size_from_filesystem()
 
562
 
 
563
    def resparse(self, size = None):
 
564
        self.cleanup()
 
565
        if size == 0:
 
566
            minsize = 0
 
567
        else:
 
568
            minsize = self.__resize_to_minimal()
 
569
            self.disk.truncate(minsize)
 
570
            self.__resize_filesystem(size)
 
571
        return minsize
 
572
 
449
573
class ExtDiskMount(DiskMount):
450
574
    """A DiskMount object that is able to format/resize ext[23] filesystems."""
451
575
    def __init__(self, disk, mountdir, fstype, blocksize, fslabel, rmmountdir=True, skipformat = False, fsopts = None, fsuuid=None):