void msdos_truncate(struct inode *inode) { int cluster; cluster = SECTOR_SIZE*MSDOS_SB(inode->i_sb)->cluster_size; (void) fat_free(inode,(inode->i_size+(cluster-1))/cluster); MSDOS_I(inode)->i_attrs |= ATTR_ARCH; inode->i_dirt = 1; }
int fatFreeWithDir(Stream_t *Dir, struct directory *dir) { unsigned int first; if((!strncmp(dir->name,". ",8) || !strncmp(dir->name,".. ",8)) && !strncmp(dir->ext," ",3)) { fprintf(stderr,"Trying to remove . or .. entry\n"); return -1; } first = START(dir); if(fat32RootCluster(Dir)) first |= STARTHI(dir) << 16; return fat_free(Dir, first); }
void fat_truncate(struct inode *inode) { struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb); const unsigned int cluster_size = sbi->cluster_size; int nr_clusters; /* * This protects against truncating a file bigger than it was then * trying to write into the hole. */ if (MSDOS_I(inode)->mmu_private > inode->i_size) MSDOS_I(inode)->mmu_private = inode->i_size; nr_clusters = (inode->i_size + (cluster_size - 1)) >> sbi->cluster_bits; lock_kernel(); fat_free(inode, nr_clusters); unlock_kernel(); fat_flush_inodes(inode->i_sb, inode, NULL); }
/* * Open the named file for read, create the cluster chain, return the * directory structure or NULL on error. */ static int writeit(char *dosname, char *longname, void *arg0, direntry_t *entry) { Stream_t *Target; time_t now; int type, fat, ret; time_t date; mt_size_t filesize, newsize; Arg_t *arg = (Arg_t *) arg0; if (arg->mp.File->Class->get_data(arg->mp.File, & date, &filesize, &type, 0) < 0 ){ fprintf(stderr, "Can't stat source file\n"); return -1; } if (type){ if (arg->verbose) fprintf(stderr, "\"%s\" is a directory\n", longname); return -1; } /*if (!arg->single || arg->recursive)*/ if(arg->verbose) fprintf(stderr,"Copying %s\n", longname); if(got_signal) return -1; /* will it fit? */ if (!getfreeMinBytes(arg->mp.targetDir, filesize)) return -1; /* preserve mod time? */ if (arg->preserveTime) now = date; else getTimeNow(&now); mk_entry(dosname, arg->attr, 1, 0, now, &entry->dir); Target = OpenFileByDirentry(entry); if(!Target){ fprintf(stderr,"Could not open Target\n"); exit(1); } if (arg->needfilter & arg->textmode) Target = open_filter(Target); ret = copyfile(arg->mp.File, Target); GET_DATA(Target, 0, &newsize, 0, &fat); FREE(&Target); if (arg->needfilter & arg->textmode) newsize++; /* ugly hack: we gathered the size before the Ctrl-Z * was written. Increment it manually */ if(ret < 0 ){ fat_free(arg->mp.targetDir, fat); return -1; } else { mk_entry(dosname, arg->attr, fat, truncBytes32(newsize), now, &entry->dir); return 0; } }