Show
Ignore:
Timestamp:
07/11/08 12:17:13 (5 months ago)
Author:
mwhitworth
Message:

Update buffer fixes from branches/fs.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/trunk/fs/vfs/bcache.c

    r696 r777  
    9595        INIT_WAITQUEUE_ENTRY(bufferWait); 
    9696 
    97         WaitAddToQueue(&buffer->waitQueue, &bufferWait); 
    98  
    9997        do 
    10098        { 
     99                WaitAddToQueue(&buffer->waitQueue, &bufferWait); 
    101100                ThrSuspendThread(currThread); 
    102  
    103                 if (!BufferLocked(buffer)) 
    104                         break; 
    105  
    106101                ThrSchedule(); 
    107102        }while (BufferLocked(buffer)); 
     
    157152 
    158153        INIT_WAITQUEUE_HEAD(&buff->waitQueue); 
     154        BufferLock(buff); 
    159155        BlockAddToHashTable(buff); 
    160156 
     
    259255                return -EFAULT; 
    260256 
    261         /* The buffer will be unlocked in StorageEndRequest */ 
    262         BufferLock(buff); 
     257        /* Buffer should already be locked if we're coming from BlockRead */ 
    263258 
    264259        err=BlockSendRequestRaw(device,request); 
     
    308303 
    309304        request=StorageBuildRequest(buff, REQUEST_READ); 
    310  
    311         BufferLock(buff); 
    312305 
    313306        StorageDoRequest(device,request); 
     
    446439                ThrSchedule(); 
    447440 
    448                 /* Really have to go through everything? */ 
    449441                ListForEachEntry(sDevice,&sDeviceList,list) 
    450442                        BlockSyncDevice(sDevice); 
     
    480472{ 
    481473        struct ListHead* head=BUFFER_HASH(device, blockNum); 
    482         struct Buffer* curr; 
     474        struct Buffer* curr, *ret=NULL; 
     475 
     476        PreemptDisable(); 
    483477 
    484478        ListForEachEntry(curr, head, list) 
     
    486480                { 
    487481                        BufferGet(curr); 
    488                         return curr; 
     482                        WaitForBuffer(curr); 
     483                        ret=curr; 
     484                        goto out; 
    489485                } 
    490486 
    491         return NULL; 
     487out: 
     488        PreemptEnable(); 
     489        return ret; 
    492490} 
    493491