黑屏问题分析案例

问题描述:  

灭屏状态来电话时整个系统出现卡死现象;背光屏灯亮过一会自动重启后恢复正常。

据客户反馈接听电话的时候出现,整个系统界面卡死黑屏按开机键也没有反应,没有铃声,过一会自动重启后又正常了,另一台台机器是打电话的时候出现这种现象。

初步分析:

由 event log 可看出重启原因 :MonitorChecker 阻塞,watchdog 主动杀掉 system_server 进程

E0ABBBA  09-21 13:20:56.944   886   908 I watchdog: Blocked in monitor com.android.server.input.InputManagerService on foreground thread (android.fg)
S0AEC0F  09-21 13:23:32.878   886   908 W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in monitor com.android.server.input.InputManagerService on foreground thread (android.fg)
S0AEC11  09-21 13:23:32.879   886   908 W Watchdog: android.fg annotated stack trace:
S0AEC12  09-21 13:23:32.880   886   908 W Watchdog:     at com.android.server.input.InputManagerService.nativeMonitor(Native Method)
S0AEC13  09-21 13:23:32.880   886   908 W Watchdog:     at com.android.server.input.InputManagerService.monitor(InputManagerService.java:1889)
S0AEC14  09-21 13:23:32.880   886   908 W Watchdog:     at com.android.server.Watchdog$HandlerChecker.run(Watchdog.java:272)
S0AEC15  09-21 13:23:32.880   886   908 W Watchdog:     at android.os.Handler.handleCallback(Handler.java:938)
S0AEC16  09-21 13:23:32.881   886   908 W Watchdog:     at android.os.Handler.dispatchMessage(Handler.java:99)
S0AEC17  09-21 13:23:32.881   886   908 W Watchdog:     at android.os.Looper.loop(Looper.java:223)
S0AEC18  09-21 13:23:32.881   886   908 W Watchdog:     at android.os.HandlerThread.run(HandlerThread.java:67)
S0AEC19  09-21 13:23:32.881   886   908 W Watchdog:     at com.android.server.ServiceThread.run(ServiceThread.java:44)
S0AEC1A  09-21 13:23:32.881   886   908 W Watchdog: *** GOODBYE!

M0AEC1B  09-21 13:23:32.881   886   908 I Process : Sending signal. PID: 886 SIG: 9

 深入分析:

从 trace log 查看 system_server  进程堆栈调用信息,定位到线程调用堆栈

"InputReader" prio=10 tid=60 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x173c2818 self=0xb400007099597f20
  | sysTid=1140 nice=-8 cgrp=default sched=0/0 handle=0x6e91659cc0
  | state=S schedstat=( 5661693313 833514911 18335 ) utm=291 stm=274 core=1 HZ=100
  | stack=0x6e91562000-0x6e91564000 stackSize=995KB
  | held mutexes=
  at com.android.server.telecom.DefaultDialerCache.refreshCacheForUser(DefaultDialerCache.java:245)
  - waiting to lock <0x0e80a0d2> (a com.android.server.telecom.TelecomSystem$1) held by thread 148
  at com.android.server.telecom.DefaultDialerCache.getDefaultDialerApplication(DefaultDialerCache.java:197)
  at com.android.server.telecom.DefaultDialerCache.isDefaultOrSystemDialer(DefaultDialerCache.java:225)
  at com.android.server.telecom.TelecomServiceImpl.isPrivilegedDialerCalling(TelecomServiceImpl.java:2363)
  at com.android.server.telecom.TelecomServiceImpl.access$2600(TelecomServiceImpl.java:80)
  at com.android.server.telecom.TelecomServiceImpl$1.isRinging(TelecomServiceImpl.java:881)
  at android.telecom.TelecomManager.isRinging(TelecomManager.java:1655)
  at com.android.server.policy.PhoneWindowManager.interceptPowerKeyDown(PhoneWindowManager.java:990)
  at com.android.server.policy.PhoneWindowManager.interceptKeyBeforeQueueing(PhoneWindowManager.java:4168)
  at com.android.server.policy.SprdPhoneWindowManager.interceptKeyBeforeQueueing(SprdPhoneWindowManager.java:114)
  at com.freeme.server.policy.FreemePhoneWindowManager.interceptKeyBeforeQueueing(FreemePhoneWindowManager.java:272)
  at com.android.server.wm.InputManagerCallback.interceptKeyBeforeQueueing(InputManagerCallback.java:321)
  at com.android.server.input.InputManagerService.interceptKeyBeforeQueueing(InputManagerService.java:1987)

由堆栈可看出当前线程以下信息:

1、该线程当前的状态是 Blocked,阻塞
2、waiting to lock <0x0e80a0d2> 在等锁 <0x0e80a0d2>
3、held by thread 148 这个锁被编号为148的线程持有,需要进一步 check 148号线程的状态
4、当前申请锁的 code 如下:
packages/services/Telecomm/src/com/android/server/telecom/DefaultDialerCache.java

    private String refreshCacheForUser(int userId) {
        String currentDefaultDialer =
                mRoleManagerAdapter.getDefaultDialerApp(userId);
        synchronized (mLock) {
            mCurrentDefaultDialerPerUser.put(userId, currentDefaultDialer);
        }
        return currentDefaultDialer;
    }

可以在 traces.txt 文件中检索 tid=148 来快速找到148号线程的函数调用栈信息:

  "CallAudioModeStateMachine" prio=5 tid=148 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x173ca3b8 self=0xb40000709960fe30
  | sysTid=1899 nice=0 cgrp=default sched=0/0 handle=0x6e5c001cc0
  | state=S schedstat=( 8788696 2609692 34 ) utm=0 stm=0 core=0 HZ=100
  | stack=0x6e5befe000-0x6e5bf00000 stackSize=1043KB
  | held mutexes=
  native: #00 pc 000000000009ab24  /apex/com.android.runtime/lib64/bionic/libc.so (__ioctl+4)
  native: #01 pc 0000000000057ac4  /apex/com.android.runtime/lib64/bionic/libc.so (ioctl+160)
  native: #02 pc 00000000000519d4  /system/lib64/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+296)
  native: #03 pc 0000000000052a08  /system/lib64/libbinder.so (android::IPCThreadState::waitForResponse(android::Parcel*, int*)+128)
  native: #04 pc 0000000000052734  /system/lib64/libbinder.so (android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+184)
  native: #05 pc 000000000004b00c  /system/lib64/libbinder.so (android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+152)
  native: #06 pc 00000000001249d0  /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact(_JNIEnv*, _jobject*, int, _jobject*, _jobject*, int)+152)
  at android.os.BinderProxy.transactNative(Native method)
  at android.os.BinderProxy.transact(BinderProxy.java:545)
  at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:779)
  at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1985)
  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1800)
  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1716)
  at android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1104)
  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1076)
  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1004)
  at android.media.Ringtone.setUri(Ringtone.java:336)
  at android.media.RingtoneManager.getRingtone(RingtoneManager.java:802)
  at android.media.RingtoneManager.getRingtone(RingtoneManager.java:758)
  at com.android.server.telecom.RingtoneFactory.getRingtone(RingtoneFactory.java:136)
  at com.android.server.telecom.RingtoneFactory.getRingtone(RingtoneFactory.java:152)
  at com.android.server.telecom.Ringer.startRinging(Ringer.java:253)
  at com.android.server.telecom.CallAudioManager.startRinging(CallAudioManager.java:488)
  - locked <0x0e80a0d2> (a com.android.server.telecom.TelecomSystem$1)
  at com.android.server.telecom.CallAudioModeStateMachine$RingingFocusState.tryStartRinging(CallAudioModeStateMachine.java:394)
  at com.android.server.telecom.CallAudioModeStateMachine$RingingFocusState.enter(CallAudioModeStateMachine.java:413)
  at com.android.internal.util.StateMachine$SmHandler.invokeEnterMethods(StateMachine.java:1037)
  at com.android.internal.util.StateMachine$SmHandler.performTransitions(StateMachine.java:879)
  at com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:819)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loop(Looper.java:223)
  at android.os.HandlerThread.run(HandlerThread.java:67)

由堆栈可看出当前线程以下信息:

1、该线程当前的状态是 native
2、与某进程进行 binder 通讯,对端信息,当前 log 未查到
3、该线程申请了锁<0x0e80a0d2>,这个锁正是 tid=60 线程所等待的
4、当前申请锁的 code 如下:
packages/services/Telecomm/src/com/android/server/telecom/CallAudioManager.java

    @VisibleForTesting
    public boolean startRinging() {
        synchronized (mCallsManager.getLock()) {
            return mRinger.startRinging(mForegroundCall,
                    mCallAudioRouteStateMachine.isHfpDeviceAvailable());
        }
    }

以上两处申请锁 code 我司未做客制化

通过 tid=148 号线程的函数调用栈信息可看到正在进行 binder 通信,且卡在对端

  native: #00 pc 000000000009ab24  /apex/com.android.runtime/lib64/bionic/libc.so (__ioctl+4)
  native: #01 pc 0000000000057ac4  /apex/com.android.runtime/lib64/bionic/libc.so (ioctl+160)
  native: #02 pc 00000000000519d4  /system/lib64/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+296)
  native: #03 pc 0000000000052a08  /system/lib64/libbinder.so (android::IPCThreadState::waitForResponse(android::Parcel*, int*)+128)
  native: #04 pc 0000000000052734  /system/lib64/libbinder.so (android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+184)
  native: #05 pc 000000000004b00c  /system/lib64/libbinder.so (android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+152)
  native: #06 pc 00000000001249d0  /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact(_JNIEnv*, _jobject*, int, _jobject*, _jobject*, int)+152)
  at android.os.BinderProxy.transactNative(Native method)
  at android.os.BinderProxy.transact(BinderProxy.java:545)
  at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:779)
  at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1985)
  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1800)
  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1716)

由以下 log 可看出该线程卡在 binder对端

(android::IPCThreadState::talkWithDriver(bool)+296)
(android::IPCThreadState::waitForResponse(android::Parcel*, int*)+128)
(android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+184)
(android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+152)

由于展锐平台没有 binder_info 信息,且 kernel log 里也未明确查到 binder_info 调用信息,

根据堆栈信息:

  at android.os.BinderProxy.transactNative(Native method)
  at android.os.BinderProxy.transact(BinderProxy.java:545)
  at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:779)
  at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1985)
  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1800)
  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1716)
  at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:556)
  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:327)
  at android.os.Binder.execTransactInternal(Binder.java:1159)
  at android.os.Binder.execTransact(Binder.java:1123)

可锁定对端应该是 :

Cmd line: com.android.providers.media.module 进程中的 2434:2452
----- pid 2434 at 2022-09-21 13:21:44 -----
Cmd line: com.android.providers.media.module

----- pid 2434 at 2022-09-21 13:21:44 -----
Cmd line: com.android.providers.media.module
Build fingerprint: 'LeBest/L202206/Q6539:11/RP1A.201005.001/1663575566:user/release-keys'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=15823 post zygote classes=168
Dumping registered class loaders
#0 dalvik.system.PathClassLoader: [], parent #1
#1 java.lang.BootClassLoader: [], no parent
#2 dalvik.system.PathClassLoader: [/apex/com.android.mediaprovider/priv-app/MediaProvider/MediaProvider.apk], parent #1
..........................................................
ProfileSaver total_ms_of_work=76
ProfileSaver total_number_of_hot_spikes=0
ProfileSaver total_number_of_wake_ups=13

suspend all histogram:	Sum: 1.952ms 99% C.I. 3us-330.880us Avg: 33.655us Max: 357us
DALVIK THREADS (43):
"Signal Catcher" daemon prio=10 tid=6 Runnable
  | group="system" sCount=0 dsCount=0 flags=0 obj=0x13a001d0 self=0xb400007099526f50
  | sysTid=2444 nice=-20 cgrp=default sched=0/0 handle=0x6f16d7bcc0
  | state=R schedstat=( 197998693 406154 126 ) utm=13 stm=6 core=6 HZ=100
  | stack=0x6f16c84000-0x6f16c86000 stackSize=995KB
  | held mutexes= "mutator lock"(shared held)
  native: #00 pc 0000000000496638  /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+140)
  native: #01 pc 00000000005a090c  /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+372)
  native: #02 pc 00000000005bd54c  /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+892)
  native: #03 pc 00000000005b7564  /apex/com.android.art/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+528)
  native: #04 pc 00000000005b6760  /apex/com.android.art/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool)+1920)
  native: #05 pc 00000000005b5c18  /apex/com.android.art/lib64/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+756)
  native: #06 pc 0000000000562a00  /apex/com.android.art/lib64/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+196)
  native: #07 pc 00000000005776c4  /apex/com.android.art/lib64/libart.so (art::SignalCatcher::HandleSigQuit()+1396)
  native: #08 pc 00000000005766b8  /apex/com.android.art/lib64/libart.so (art::SignalCatcher::Run(void*)+348)
  native: #09 pc 00000000000af97c  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
  native: #10 pc 00000000000500d0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
  (no managed stack frames)
  
  

"Binder:2434_2" prio=5 tid=13 Blocked
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x13a004a0 self=0xb40000709953f4b0
  | sysTid=2452 nice=0 cgrp=default sched=0/0 handle=0x6ec38f8cc0
  | state=S schedstat=( 7546841199 2120754547 25241 ) utm=473 stm=281 core=4 HZ=100
  | stack=0x6ec3801000-0x6ec3803000 stackSize=995KB
  | held mutexes=
  at com.android.providers.media.fuse.FuseDaemon.shouldOpenWithFuse(FuseDaemon.java:132)
  - waiting to lock <0x0e159fba> (a java.lang.Object) held by thread 18
  at com.android.providers.media.MediaProvider.openFileAndEnforcePathPermissionsHelper(MediaProvider.java:6108)
  at com.android.providers.media.MediaProvider.openFileCommon(MediaProvider.java:5710)
  at com.android.providers.media.MediaProvider.openTypedAssetFileCommon(MediaProvider.java:5740)
  at com.android.providers.media.MediaProvider.openTypedAssetFile(MediaProvider.java:5722)
  at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:556)
  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:327)
  at android.os.Binder.execTransactInternal(Binder.java:1159)
  at android.os.Binder.execTransact(Binder.java:1123)
1、该线程当前的状态是 Blocked,阻塞
2、waiting to lock <0x0e159fba> 在等锁 <0x0e159fba>
3、held by thread 18 这个锁被编号为148的线程持有,需要进一步 check 18号线程的状态

由堆栈可看出当前148线程以下信息:

"fg" prio=5 tid=18 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x13a007c8 self=0xb400007099542c50
  | sysTid=2507 nice=-2 cgrp=default sched=0/0 handle=0x6ebdfd7cc0
  | state=D schedstat=( 751553273 534560990 5229 ) utm=54 stm=20 core=5 HZ=100
  | stack=0x6ebded4000-0x6ebded6000 stackSize=1043KB
  | held mutexes=
  native: (backtrace::Unwind failed for thread 2507: Thread has not responded to signal in time)
  at com.android.providers.media.fuse.FuseDaemon.native_invalidate_fuse_dentry_cache(Native method)
  at com.android.providers.media.fuse.FuseDaemon.invalidateFuseDentryCache(FuseDaemon.java:150)
  - locked <0x0e159fba> (a java.lang.Object)
  at com.android.providers.media.MediaProvider.invalidateFuseDentry(MediaProvider.java:5967)
  at com.android.providers.media.MediaProvider.invalidateFuseDentry(MediaProvider.java:5955)
  at com.android.providers.media.MediaProvider.deleteAndInvalidate(MediaProvider.java:6159)
  at com.android.providers.media.MediaProvider.deleteAndInvalidate(MediaProvider.java:6154)
  at com.android.providers.media.MediaProvider.lambda$zMMVrPrCX2pE4GkQZA2PeJA85XI(MediaProvider.java:-1)
  at com.android.providers.media.-$$Lambda$MediaProvider$zMMVrPrCX2pE4GkQZA2PeJA85XI.accept(lambda:-1)
  at com.android.providers.media.util.FileUtils$2.visitFile(FileUtils.java:423)
  at com.android.providers.media.util.FileUtils$2.visitFile(FileUtils.java:414)
  at java.nio.file.Files.walkFileTree(Files.java:2670)
  at java.nio.file.Files.walkFileTree(Files.java:2742)
  at com.android.providers.media.util.FileUtils.walkFileTreeContents(FileUtils.java:414)
  at com.android.providers.media.MediaProvider.ensureThumbnailsValid(MediaProvider.java:844)
  at com.android.providers.media.MediaProvider.lambda$attachVolume$29(MediaProvider.java:7401)
  at com.android.providers.media.MediaProvider.lambda$attachVolume$29$MediaProvider(MediaProvider.java:-1)
  at com.android.providers.media.-$$Lambda$MediaProvider$1CDU5fJ12LLyxeohyL0g0CUV6r0.apply(lambda:-1)
  at com.android.providers.media.DatabaseHelper.runWithTransaction(DatabaseHelper.java:560)
  at com.android.providers.media.MediaProvider.lambda$attachVolume$30(MediaProvider.java:7399)
  at com.android.providers.media.MediaProvider.lambda$attachVolume$30$MediaProvider(MediaProvider.java:-1)
  at com.android.providers.media.-$$Lambda$MediaProvider$NXkptc-aYhN0k4DNjbUMX-LQA5Q.run(lambda:-1)
  at android.os.Handler.handleCallback(Handler.java:938)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:223)
  at android.os.HandlerThread.run(HandlerThread.java:67)
1、该线程当前的状态是 native
2、该线程申请了锁<0x0e159fba>,这个锁正是 tid=13 线程所等待的
3、当前申请锁的 code 如下:

packages/providers/MediaProvider/src/com/android/providers/media/fuse/FuseDaemon.java

    /**
     * Invalidates FUSE VFS dentry cache for {@code path}
     */
    public void invalidateFuseDentryCache(String path) {
        synchronized (mLock) {
            if (mPtr == 0) {
                Log.i(TAG, "invalidateFuseDentryCache failed, FUSE daemon unavailable");
                return;
            }
            native_invalidate_fuse_dentry_cache(mPtr, path);
        }
    }

调用 native 接口,最终定位到 

packages/providers/MediaProvider/jni/FuseDaemon.cpp

void FuseDaemon::InvalidateFuseDentryCache(const std::string& path) {
    LOG(VERBOSE) << "Invalidating FUSE dentry cache";
    if (active.load(std::memory_order_acquire)) {
        string name;
        fuse_ino_t parent;
        fuse_ino_t child;
        {
            std::lock_guard<std::recursive_mutex> guard(fuse->lock);
            const node* node = node::LookupAbsolutePath(fuse->root, path);
            if (node) {
                name = node->GetName();
                child = fuse->ToInode(const_cast<class node*>(node));
                parent = fuse->ToInode(node->GetParent());
            }
        }

        if (!name.empty()) {
            fuse_inval(fuse->se, parent, child, name, path);
        }
    } else {
        LOG(WARNING) << "FUSE daemon is inactive. Cannot invalidate dentry";
    }
}

至此可以看出最终是卡在 fuse 文件系统。我司 OS 客制化未涉及到 fuse文件系统,怀疑是Google issues ,查阅 Google gerrit ,发现此题属实是原生问题,并且已修复:

Fix use-after-free bug in FuseDaemon

The FuseDaemon periodically runs fadvise on the lower file system to
avoid double caching. As part of 'recording' the write for the fadvise
queue we sometimes raced and had the following ordering of events:

T1: fuse_reply_write
T2: pf_release (destroy handle)
T1: Record (using already destroyed handle)

Now we, call Record before fuse_reply_write

Test: Manual
Bug: 192085766 | AOSP
Bug: 195615818 | AOSP
Change-Id: Iba7598d40aa03d082af10935552ac7db7e28c5b6 | AOSP

https://review.lineageos.org/c/LineageOS/android_packages_providers_MediaProvider/+/319980

最终的修改方案如下:

packages/providers/MediaProvider/jni/FuseDaemon.cpp



void FuseDaemon::InvalidateFuseDentryCache(const std::string& path) {
    LOG(VERBOSE) << "Invalidating FUSE dentry cache";
    if (active.load(std::memory_order_acquire)) {
        string name;
        fuse_ino_t parent;
        fuse_ino_t child;
        {
            std::lock_guard<std::recursive_mutex> guard(fuse->lock);
            const node* node = node::LookupAbsolutePath(fuse->root, path);
            if (node) {
                name = node->GetName();
                child = fuse->ToInode(const_cast<class node*>(node));
                parent = fuse->ToInode(node->GetParent());
            }
        }

        if (!name.empty()) {
            /*/ [Google-patch] Handle FuseDaemon lock issue.
            fuse_inval(fuse->se, parent, child, name, path);
            /*/
            // Try to call fuse_inval in another thread
            // to avoid blocking current thread with FuseDaemon.java#mLock held
            std::thread t([=]() { fuse_inval(fuse->se, parent, child, name, path); });
            t.detach();
            //*/
        }
    } else {
        LOG(WARNING) << "FUSE daemon is inactive. Cannot invalidate dentry";
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UTF-8XD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值