static int rtems_jffs2_rmnod( const rtems_filesystem_location_info_t *parentloc, const rtems_filesystem_location_info_t *loc ) { struct _inode *dir_i = rtems_jffs2_get_inode_by_location(parentloc); struct _inode *entry_i = rtems_jffs2_get_inode_by_location(loc); char *name; size_t namelen; int eno = rtems_jffs2_cache_fd_name(entry_i, &name, &namelen); if (eno == 0) { switch (dir_i->i_mode & S_IFMT) { case S_IFDIR: eno = -jffs2_rmdir(dir_i, entry_i, name, namelen); break; case S_IFREG: eno = -jffs2_unlink(dir_i, entry_i, name, namelen); break; default: eno = EINVAL; break; } } return rtems_jffs2_eno_to_rv_and_errno(eno); }
int jffs2_rmdir (struct inode *dir_i, struct inode *d_inode, struct qstr *d_name) { struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode); struct jffs2_full_dirent *fd; for (fd = f->dents ; fd; fd = fd->next) { if (fd->ino) return EPERM; //-ENOTEMPTY; } return jffs2_unlink(dir_i, d_inode, d_name); }
int jffs2_rmdir (struct _inode *dir_i, struct _inode *d_inode, const unsigned char *d_name) { struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode); struct jffs2_full_dirent *fd; for (fd = f->dents ; fd; fd = fd->next) { if (fd->ino) { return EPERM; } } return jffs2_unlink(dir_i, d_inode, d_name); }
static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry) { struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode); struct jffs2_full_dirent *fd; int ret; for (fd = f->dents ; fd; fd = fd->next) { if (fd->ino) return -ENOTEMPTY; } ret = jffs2_unlink(dir_i, dentry); if (!ret) dir_i->i_nlink--; return ret; }