/* * sfs_dirent_search_nolock - read every file entry in the DIR, compare file name with each entry->name * If equal, then return slot and NO. of disk of this file's inode * @sfs: sfs file system * @sin: sfs inode in memory * @name: the filename * @ino_store: NO. of disk of this file (with the filename)'s inode * @slot: logical index of file entry (NOTICE: each file entry ocupied one disk block) * @empty_slot: the empty logical index of file entry. */ static int sfs_dirent_search_nolock(struct sfs_fs *sfs, struct sfs_inode *sin, const char *name, uint32_t *ino_store, int *slot, int *empty_slot) { assert(strlen(name) <= SFS_MAX_FNAME_LEN); struct sfs_disk_entry *entry; if ((entry = kmalloc(sizeof(struct sfs_disk_entry))) == NULL) { return -E_NO_MEM; } #define set_pvalue(x, v) do { if ((x) != NULL) { *(x) = (v); } } while (0) int ret, i, nslots = sin->din->blocks; set_pvalue(empty_slot, nslots); for (i = 0; i < nslots; i ++) { if ((ret = sfs_dirent_read_nolock(sfs, sin, i, entry)) != 0) { goto out; } if (entry->ino == 0) { set_pvalue(empty_slot, i); continue ; } if (strcmp(name, entry->name) == 0) { set_pvalue(slot, i); set_pvalue(ino_store, entry->ino); goto out; } } #undef set_pvalue ret = -E_NOENT; out: kfree(entry); return ret; }
static int sfs_dirent_findino_nolock(struct sfs_fs *sfs, struct sfs_inode *sin, uint32_t ino, struct sfs_disk_entry *entry) { int ret, i, nslots = sin->din->blocks; for (i = 0; i < nslots; i ++) { if ((ret = sfs_dirent_read_nolock(sfs, sin, i, entry)) != 0) { return ret; } if (entry->ino == ino) { return 0; } } return -E_NOENT; }
/* * sfs_getdirentry_sub_noblock - get the content of file entry in DIR */ static int sfs_getdirentry_sub_nolock(struct sfs_fs *sfs, struct sfs_inode *sin, int slot, struct sfs_disk_entry *entry) { int ret, i, nslots = sin->din->blocks; for (i = 0; i < nslots; i ++) { if ((ret = sfs_dirent_read_nolock(sfs, sin, i, entry)) != 0) { return ret; } if (entry->ino != 0) { if (slot == 0) { return 0; } slot --; } } return -E_NOENT; }
static int sfs_getdirentry_sub_nolock(struct sfs_fs *sfs, struct sfs_inode *sin, int slot, struct sfs_disk_entry *entry) { int ret, i, nslots = sin->din->blocks; // kprintf("%s %s %d din->blocks is %d\n", __FILE__, __func__, __LINE__, nslots); for (i = 0; i < nslots; i ++) { if ((ret = sfs_dirent_read_nolock(sfs, sin, i, entry)) != 0) { // kprintf("%s %s %d can not read entry\n", __FILE__, __func__, __LINE__); return ret; } // kprintf("%s\n", __func__); if (entry->ino != 0) { if (slot == 0) { return 0; } slot --; } } return -E_NOENT; }