Ignore:
Timestamp:
Mar 15, 2017, 2:42:58 AM (2 months ago)
Author:
brainslayer
Message:

use new squashfs in all kernels

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/fs/pnode.c

    r31574 r31662  
    325325}
    326326
     327static struct mount *find_topper(struct mount *mnt)
     328{
     329        /* If there is exactly one mount covering mnt completely return it. */
     330        struct mount *child;
     331
     332        if (!list_is_singular(&mnt->mnt_mounts))
     333                return NULL;
     334
     335        child = list_first_entry(&mnt->mnt_mounts, struct mount, mnt_child);
     336        if (child->mnt_mountpoint != mnt->mnt.mnt_root)
     337                return NULL;
     338
     339        return child;
     340}
     341
    327342/*
    328343 * return true if the refcount is greater than count
     
    345360int propagate_mount_busy(struct mount *mnt, int refcnt)
    346361{
    347         struct mount *m, *child;
     362        struct mount *m, *child, *topper;
    348363        struct mount *parent = mnt->mnt_parent;
    349         int ret = 0;
    350364
    351365        if (mnt == parent)
     
    362376        for (m = propagation_next(parent, parent); m;
    363377                        m = propagation_next(m, parent)) {
    364                 child = __lookup_mnt_last(&m->mnt, mnt->mnt_mountpoint);
    365                 if (child && list_empty(&child->mnt_mounts) &&
    366                     (ret = do_refcount_check(child, 1)))
    367                         break;
    368         }
    369         return ret;
     378                int count = 1;
     379                child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint);
     380                if (!child)
     381                        continue;
     382
     383                /* Is there exactly one mount on the child that covers
     384                 * it completely whose reference should be ignored?
     385                 */
     386                topper = find_topper(child);
     387                if (topper)
     388                        count += 1;
     389                else if (!list_empty(&child->mnt_mounts))
     390                        continue;
     391
     392                if (do_refcount_check(child, count))
     393                        return 1;
     394        }
     395        return 0;
    370396}
    371397
     
    384410        for (m = propagation_next(parent, parent); m;
    385411                        m = propagation_next(m, parent)) {
    386                 child = __lookup_mnt_last(&m->mnt, mnt->mnt_mountpoint);
     412                child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint);
    387413                if (child)
    388414                        child->mnt.mnt_flags &= ~MNT_LOCKED;
     
    402428        for (m = propagation_next(parent, parent); m;
    403429                        m = propagation_next(m, parent)) {
    404                 struct mount *child = __lookup_mnt_last(&m->mnt,
     430                struct mount *child = __lookup_mnt(&m->mnt,
    405431                                                mnt->mnt_mountpoint);
    406                 if (child && (!IS_MNT_LOCKED(child) || IS_MNT_MARKED(m))) {
     432                if (!child || (child->mnt.mnt_flags & MNT_UMOUNT))
     433                        continue;
     434                if (!IS_MNT_LOCKED(child) || IS_MNT_MARKED(m)) {
    407435                        SET_MNT_MARK(child);
    408436                }
     
    423451        for (m = propagation_next(parent, parent); m;
    424452                        m = propagation_next(m, parent)) {
    425 
    426                 struct mount *child = __lookup_mnt_last(&m->mnt,
     453                struct mount *topper;
     454                struct mount *child = __lookup_mnt(&m->mnt,
    427455                                                mnt->mnt_mountpoint);
    428456                /*
     
    433461                        continue;
    434462                CLEAR_MNT_MARK(child);
     463
     464                /* If there is exactly one mount covering all of child
     465                 * replace child with that mount.
     466                 */
     467                topper = find_topper(child);
     468                if (topper)
     469                        mnt_change_mountpoint(child->mnt_parent, child->mnt_mp,
     470                                              topper);
     471
    435472                if (list_empty(&child->mnt_mounts)) {
    436473                        list_del_init(&child->mnt_child);
Note: See TracChangeset for help on using the changeset viewer.