static int ioctl2DeleteLastSub(hdd_file_slot_t *fileSlot) { int rv; u32 device=fileSlot->f->unit; apa_cache_t *mainPart; apa_cache_t *subPart; if(!(fileSlot->f->mode & O_WRONLY)) return -EACCES; if(fileSlot->nsub==0) return -ENOENT; if(!(mainPart=apaCacheGetHeader(device, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv))) return rv; if((subPart=apaCacheGetHeader(device, mainPart->header->subs[mainPart->header->nsub-1].start, APA_IO_MODE_READ, &rv))) { fileSlot->nsub--; mainPart->header->nsub--; mainPart->flags|=APA_CACHE_FLAG_DIRTY; apaCacheFlushAllDirty(device); rv=apaDelete(subPart); } apaCacheFree(mainPart); return rv; }
int ioctl2DeleteLastSub(hdd_file_slot_t *fileSlot) { int rv; u32 device=fileSlot->f->unit; apa_cache *mainPart; apa_cache *subPart; if(!(fileSlot->f->mode & O_WRONLY)) return -EACCES; if(fileSlot->nsub==0) return -ENOENT; if(!(mainPart=cacheGetHeader(device, fileSlot->start, 0, &rv))) return rv; if((subPart=cacheGetHeader(device, mainPart->header->subs[mainPart->header->nsub-1].start, 0, &rv))) { fileSlot->nsub--; mainPart->header->nsub--; mainPart->flags|=CACHE_FLAG_DIRTY; cacheFlushAllDirty(device); rv=apaDelete(subPart); } cacheAdd(mainPart); return rv; }
int apaRemove(u32 device, char *id) { int i; u32 nsub; apa_cache *clink; apa_cache *clink2; int rv; for(i=0;i<maxOpen;i++) // look to see if open { if(fileSlots[i].f!=0) { if(memcmp(fileSlots[i].id, id, APA_IDMAX)==0) return -EBUSY; } } if(id[0]=='_' && id[1]=='_') return -EACCES; if((clink=apaFindPartition(device, id, &rv))==NULL) return rv; if(passcmp(clink->header->fpwd, NULL)) { cacheAdd(clink); return -EACCES; } // remove all subs frist... nsub=clink->header->nsub; clink->header->nsub=0; clink->flags|=CACHE_FLAG_DIRTY; cacheFlushAllDirty(device); for(i=nsub-1;i!=-1;i--) { if((clink2=cacheGetHeader(device, clink->header->subs[i].start, 0, &rv))){ if((rv=apaDelete(clink2))){ cacheAdd(clink); return rv; } } } if(rv==0) return apaDelete(clink); cacheAdd(clink); return rv; }
static int apaRemove(s32 device, const char *id, const char *fpwd) { u32 nsub; apa_cache_t *clink; apa_cache_t *clink2; int rv, i; for(i=0;i<apaMaxOpen;i++) // look to see if open { if(hddFileSlots[i].f!=0) { if(memcmp(hddFileSlots[i].id, id, APA_IDMAX)==0) return -EBUSY; } } if(id[0]=='_' && id[1]=='_') return -EACCES; if((clink=apaFindPartition(device, id, &rv))==NULL) return rv; if(apaPassCmp(clink->header->fpwd, fpwd)) { apaCacheFree(clink); return -EACCES; } // remove all subs frist... nsub=clink->header->nsub; clink->header->nsub=0; clink->flags|=APA_CACHE_FLAG_DIRTY; apaCacheFlushAllDirty(device); for(i=nsub-1;i!=-1;i--) { if((clink2=apaCacheGetHeader(device, clink->header->subs[i].start, APA_IO_MODE_READ, &rv))){ if((rv=apaDelete(clink2))){ apaCacheFree(clink); return rv; } } } if(rv==0) return apaDelete(clink); apaCacheFree(clink); return rv; }