"দ্রুত অপসারণ" সত্ত্বেও উইন্ডোজ ছোট ইউএসবি ড্রাইভে FAT টেবিল লিখতে বিলম্ব করে


10

আমি বিলম্ব দেখতে পাচ্ছি FAT- এ একটি ক্ষুদ্র-ক্ষমতার FAT (FAT12) - ফর্ম্যাটযুক্ত ইউএসবি ফ্ল্যাশ ড্রাইভে যদিও ড্রাইভের নীতিটি "দ্রুত অপসারণ" তে সেট করা আছে। (আমি বিশ্বাস করি SurpriseRemovalOKএটির পতাকাটি সেট করা হয়েছে)। আমি ইউএসবি-র মাধ্যমে ড্রাইভে প্রেরিত এসসিএসআই কমান্ডগুলি ক্যাপচার করেছি: ফাইল ট্রানসেশন লেখার সাথে সাথে ঘটবে, পুরো ফাইলটি (2 512-বাইট সেক্টর দীর্ঘ) এর পরপরই লেখা হয়, তবে তারপরে FAT এর আগে একটি 20-90 দ্বিতীয় বিলম্ব রয়েছে ফাইল রাইটিং প্রতিফলিত আপডেট করা হয়।

ড্রাইভের আকারটি উল্লেখযোগ্য। আমি 15MB এবং আরও ছোট আকারের FAT ফাইল সিস্টেমে পরীক্ষা করে দেখেছি। 16 এমবি এবং তার উপরে, লেখাগুলি বিলম্বিত নয়। আমি উইন্ডোতে যখন কোনও ড্রাইভ ফর্ম্যাট করি তখন FAT12 এবং FAT16 ব্যবহারের মধ্যে আমি দেখতে পাই এমন ব্রেকআপপয়েন্ট M (নোট পরে যুক্ত করা হয়েছে: তবে FAT12 / FAT16 ব্রেকপয়েন্টটি ক্লাস্টারের সংখ্যার উপর নির্ভরশীল, পরম ফাইল সিস্টেমের আকার নয়)।

16 এমবি এবং আরও বড়তে, উইন্ডোজ Prevent/Allow Medium Removalলেখার আগে এসসিএসআই কমান্ডগুলি প্রেরণ করে, ডিভাইসটি অপসারণ না করার জন্য জিজ্ঞাসা করে। ইউএসবি স্টিকটি আসলে এই অনুরোধগুলিতে ব্যর্থতা ফিরিয়ে দেয় (কারণ এটি কোনও অপসারণের গ্যারান্টি দিতে পারে না), তবে উইন্ডোজ যাইহোক চেষ্টা করে। 15MB এবং আরও ছোট ট্রেস কোনও Prevent/Allow Medium Removal আদেশ দেয় না।

(পাইথন কোড সম্বলিত একটি ক্ষুদ্র FAT ফাইল সিস্টেম সমর্থন করে এমন একটি মাইক্রোকন্ট্রোলার বোর্ড ব্যবহার করার সময় আমি এই সমস্যাটি আবিষ্কার করেছি mic । তবে মাইক্রোকন্ট্রোলারটি বিলম্বিত লেখার কারণে দূষিত কোড বা দূষিত ফাইল সিস্টেমটি দেখছিল))

"দ্রুত অপসারণ" সেট করা সত্ত্বেও এফএটি-তে লেখাটি এত দিন কেন বিলম্ব হচ্ছে? আমি ড্রাইভে একটি "ইজেক্ট" করে লেখকদের জোর করতে পারি তবে এটি "দ্রুত অপসারণ" এর প্রতিশ্রুতি পরাস্ত করে। আমি যদি ড্রাইভটি তাড়াতাড়ি টানতে থাকি তবে এতে একটি ভুল FAT টেবিল থাকবে। এটি "নিরাপদে হার্ডওয়্যার অপসারণ" ব্যবহার না করার বিষয়ে নীচের স্ক্রিন শটে বিবৃতিটিকে অন্তর্ভুক্ত করে। এটি কি বাগ বা আমি কিছু মিস করছি? ম্যানুয়াল "ইজেক্ট" না করে সমস্ত লেখককে তাত্ক্ষণিকভাবে ঘটতে বাধ্য করার কোনও উপায় আছে কি?

ইউএসবি ড্রাইভটি দ্রুত অপসারণে সেট করা হয়েছে

সমস্যাটি দেখানো একটি ওয়্যারশার্ক / ইউএসবিপিপ্যাপ ট্রেস থেকে ছাঁটাই এক্সট্রাক্ট এখানে। আমি একটি বিদ্যমান ফাইল ছাঁটাই এবং তারপরে এটির একটি নতুন অনুলিপি লিখি। আমি মন্তব্য যুক্ত করেছি ###। ইউএসবি ড্রাইভে বেশিরভাগ লেখাগুলি ট্রেসটিতে প্রায় 5 সেকেন্ড সময় নেয়, তবে চূড়ান্ত FAT লেখাটি 26 সেকেন্ড পর্যন্ত হয় না।

No.    Time  Source       Destination  Protocol  Length  Info
    ### write directory entry to truncate file
13 5.225586    host         1.2.2        USBMS    58     SCSI: Write(10) LUN: 0x00 (LBA: 0x00000041, Len: 8)
14 5.225838    host         1.2.2        USB      4123   URB_BULK out
    ### write FAT entries to truncate file
16 5.230488    host         1.2.2        USBMS    58     SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003b, Len: 1)
17 5.230707    host         1.2.2        USB      539    URB_BULK out
19 5.235110    host         1.2.2        USBMS    58     SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003e, Len: 1)
20 5.235329    host         1.2.2        USB      539    URB_BULK out
    ### write directory entry for 
22 5.252672    host         1.2.2        USBMS    58     SCSI: Write(10) LUN: 0x00 (LBA: 0x00000041, Len: 8)
23 5.252825    host         1.2.2        USB      4123   URB_BULK out
    ### write out file data (2 sectors of 512 bytes)
25 5.257416    host         1.2.2        USBMS    58     SCSI: Write(10) LUN: 0x00 (LBA: 0x000000c1, Len: 2)
26 5.257572    host         1.2.2        USB      1051   URB_BULK out
    ### 20 second delay
    ### finally, write FAT entries to indicate used sectors
79 26.559964      host      1.2.2        USBMS    58     SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003b, Len: 1)
80 26.560191      host      1.2.2        USB      539    URB_BULK out
82 26.560834      host      1.2.2        USBMS    58     SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003e, Len: 1)
83 26.560936      host      1.2.2        USB      539    URB_BULK out

আমি নিয়মিত ফ্ল্যাশ ড্রাইভ ব্যবহার করে এবং একটি মাইক্রোকন্ট্রোলার বোর্ডের সাহায্যে উইন্ডোজ 7 এবং উইন্ডোজ 10 উভয়ই একটি ছোট্ট ইউএসবি এমএসসি ড্রাইভ অনুকরণ করে এর মতো ট্রেস তৈরি করেছি।

কেবল স্পষ্ট করে বলতে গেলে, এটি একটি FAT12- ফর্ম্যাটযুক্ত ড্রাইভ, যা উইন্ডোজ ফর্ম্যাটিং সরঞ্জামটিতে "FAT" নামে পরিচিত।


1
আপনি কি শুধু কৌতূহলী? বা আপনি কি এমন দৃশ্যের মুখোমুখি হচ্ছেন যেখানে আপনাকে একটি FAT16 ফাইল সিস্টেম ব্যবহার করতে হবে?
আমি বলছি মনিকা পুনরায় স্থাপন করুন

2
আমি একটি মাইক্রোকন্ট্রোলার বোর্ড পরীক্ষা করতে সহায়তা করছি (অ্যাডাফুট ফেদার এম 0 এবং সম্পর্কিত) মাইক্রো পাইথন (সার্কিট পাইথন) এর একটি বৈকল্পিক চলমান। এতে পাইথন কোড সমেত একটি ক্ষুদ্র FAT ফাইল সিস্টেম রয়েছে। সুবিধার্থে, বোর্ডটি স্বতঃ-পুনঃস্থাপন এবং চালানো main.pyবা অনুরূপ ফাইলগুলি সেট আপ করা হয় যখন ফাইলটি সনাক্ত করা হয় তা আবিষ্কার করা হয়। এটি লেখার সম্পূর্ণ হতে কিছুটা বিলম্ব করে, তবে দশক সেকেন্ড নয়। আমরা এই স্বতঃ-পুনঃসূচনাটি অক্ষম করতে পারি, তবে লেখার সময়মত কোনওভাবে সম্পূর্ণ হয়েছে তা নিশ্চিত করার জন্য ড্রাইভটি "ইজেক্ট" করা এখনও প্রয়োজনীয়। ব্যবহারকারীকে একটি ইজেক্ট করার প্রয়োজন হয় একটি উপদ্রব; আমরা এড়াতে চাই।
ড্যান হালবার্ট

আপনার প্রশ্নের শুরুতে এ সম্পর্কে একটি সংক্ষিপ্ত ব্যাখ্যা সম্পাদনা বিবেচনা করুন। এটি ভাল পটভূমি প্রসঙ্গে।
আমি বলছি মনিকা পুনরায়

ভাল পরামর্শ। সম্পন্ন.
ড্যান হালবার্ট

উত্তর:


4

আমি সম্ভবত প্রকৃত উইন্ডোজ ড্রাইভার কোডটি পেয়েছি যা সমস্যার কারণ হয়ে দাঁড়িয়েছে।

এমএস FAT ফাইল সিস্টেম ড্রাইভারকে নমুনা ড্রাইভার কোডের প্যাকেজে অন্তর্ভুক্ত করে। সেই ড্রাইভারের বেশ কয়েকটি জায়গা রয়েছে যেখানে, ফাইল সিস্টেমটি যদি FAT12 হয় তবে ড্রাইভারটি নোংরা বিট সেট করার মতো কিছু করতে (বা FAT12 এর জন্য কোনও কিছুই নেই) বা FAT ডেটা ফ্লাশ করার মতো মাথা ঘামাবে না।

https://github.com/Mic Microsoft/ Windows- driver- sample/ blob/ master/ filesys/ fastfat/ verfysup.c# L774 https://github.com/Mic Microsoft/ Windows-driver- sample/ blob/ master/ filesys / ব্রেকফাস্টফ্যাট / ক্যাচসআপ.c#L1212 এবং সম্ভবত সবচেয়ে সমালোচনামূলকভাবে: https://github.com/Mic Microsoft/Windows-driver-sample/blob/master/filesys/fastfat/cleanup.c#L1101

শেষ লিঙ্কটিতে, cleanup.cফাইল সিস্টেমটি FAT12 হলে FAT ফ্লাশ হয় না। আমি মনে করি এটি সম্ভবত আমার আচরণের কারণ হতে পারে:

    //
    //  If that worked ok,  then see if we should flush the FAT as well.
    //

    if (NT_SUCCESS(Status) && Fcb && !FatIsFat12( Vcb) && 
        FlagOn( Fcb->FcbState, FCB_STATE_FLUSH_FAT)) {

        Status = FatFlushFat( IrpContext, Vcb);

মাইক্রোসফ্টকে উইন্ডোজ ফিডব্যাক হাবের https://aka.ms/btvdog এ প্রতিবেদন করা হয়েছে (বিশেষ ইউআরএল যা ফিডব্যাক হাবটিতে খোলে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.