static int hfsplus_unlink(struct inode *dir, struct dentry *dentry) { struct super_block *sb = dir->i_sb; struct inode *inode = dentry->d_inode; struct qstr str; char name[32]; u32 cnid; int res; hfsplus_handle_t hfsplus_handle; if (HFSPLUS_IS_RSRC(inode)) return -EPERM; if ((res = hfsplus_journal_start(__FUNCTION__, dir->i_sb, &hfsplus_handle))) return res; cnid = (u32)(unsigned long)dentry->d_fsdata; if (inode->i_ino == cnid && atomic_read(&HFSPLUS_I(inode).opencnt)) { str.name = name; str.len = sprintf(name, "temp%lu", inode->i_ino); res = hfsplus_rename_cat(&hfsplus_handle, inode->i_ino, dir, &dentry->d_name, HFSPLUS_SB(sb).hidden_dir, &str); if (!res) inode->i_flags |= S_DEAD; hfsplus_journal_stop(&hfsplus_handle); return res; } res = hfsplus_delete_cat(&hfsplus_handle, cnid, dir, &dentry->d_name); if (res) { hfsplus_journal_stop(&hfsplus_handle); return res; } if (inode->i_nlink > 0) drop_nlink(inode); if (inode->i_ino == cnid) clear_nlink(inode); if (!inode->i_nlink) { if (inode->i_ino != cnid) { HFSPLUS_SB(sb).file_count--; if (!atomic_read(&HFSPLUS_I(inode).opencnt)) { res = hfsplus_delete_cat(&hfsplus_handle, inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL); if (!res) hfsplus_delete_inode(&hfsplus_handle, inode); } else inode->i_flags |= S_DEAD; } else hfsplus_delete_inode(&hfsplus_handle,inode); } else HFSPLUS_SB(sb).file_count--; inode->i_ctime = CURRENT_TIME_SEC; res = hfsplus_journalled_mark_inode_dirty(__FUNCTION__, &hfsplus_handle, inode); hfsplus_journal_stop(&hfsplus_handle); return res; }
static int hfsplus_unlink(struct inode *dir, struct dentry *dentry) { struct hfsplus_sb_info *sbi = HFSPLUS_SB(dir->i_sb); struct inode *inode = dentry->d_inode; struct qstr str; char name[32]; u32 cnid; int res; if (HFSPLUS_IS_RSRC(inode)) return -EPERM; mutex_lock(&sbi->vh_mutex); cnid = (u32)(unsigned long)dentry->d_fsdata; if (inode->i_ino == cnid && atomic_read(&HFSPLUS_I(inode)->opencnt)) { str.name = name; str.len = sprintf(name, "temp%lu", inode->i_ino); res = hfsplus_rename_cat(inode->i_ino, dir, &dentry->d_name, sbi->hidden_dir, &str); if (!res) { inode->i_flags |= S_DEAD; drop_nlink(inode); } goto out; } res = hfsplus_delete_cat(cnid, dir, &dentry->d_name); if (res) goto out; if (inode->i_nlink > 0) drop_nlink(inode); if (inode->i_ino == cnid) clear_nlink(inode); if (!inode->i_nlink) { if (inode->i_ino != cnid) { sbi->file_count--; if (!atomic_read(&HFSPLUS_I(inode)->opencnt)) { res = hfsplus_delete_cat(inode->i_ino, sbi->hidden_dir, NULL); if (!res) hfsplus_delete_inode(inode); } else inode->i_flags |= S_DEAD; } else hfsplus_delete_inode(inode); } else sbi->file_count--; inode->i_ctime = CURRENT_TIME_SEC; mark_inode_dirty(inode); out: mutex_unlock(&sbi->vh_mutex); return res; }
static int hfsplus_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) { struct hfsplus_sb_info *sbi = HFSPLUS_SB(dir->i_sb); struct inode *inode; int res = -ENOSPC; mutex_lock(&sbi->vh_mutex); inode = hfsplus_new_inode(dir->i_sb, mode); if (!inode) goto out; if (S_ISBLK(mode) || S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) init_special_inode(inode, mode, rdev); res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode); if (res) { clear_nlink(inode); hfsplus_delete_inode(inode); iput(inode); goto out; } hfsplus_instantiate(dentry, inode, inode->i_ino); mark_inode_dirty(inode); out: mutex_unlock(&sbi->vh_mutex); return res; }
static int hfsplus_symlink(struct inode *dir, struct dentry *dentry, const char *symname) { struct hfsplus_sb_info *sbi = HFSPLUS_SB(dir->i_sb); struct inode *inode; int res = -ENOSPC; mutex_lock(&sbi->vh_mutex); inode = hfsplus_new_inode(dir->i_sb, S_IFLNK | S_IRWXUGO); if (!inode) goto out; res = page_symlink(inode, symname, strlen(symname) + 1); if (res) goto out_err; res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode); if (res) goto out_err; hfsplus_instantiate(dentry, inode, inode->i_ino); mark_inode_dirty(inode); goto out; out_err: clear_nlink(inode); hfsplus_delete_inode(inode); iput(inode); out: mutex_unlock(&sbi->vh_mutex); return res; }
static int hfsplus_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) { struct super_block *sb; struct inode *inode; int res; sb = dir->i_sb; inode = hfsplus_new_inode(sb, mode); if (!inode) return -ENOSPC; res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode); if (res) { inode->i_nlink = 0; hfsplus_delete_inode(inode); iput(inode); return res; } init_special_inode(inode, mode, rdev); hfsplus_instantiate(dentry, inode, inode->i_ino); mark_inode_dirty(inode); return 0; }
static int hfsplus_symlink(struct inode *dir, struct dentry *dentry, const char *symname) { struct super_block *sb; struct inode *inode; int res; sb = dir->i_sb; inode = hfsplus_new_inode(sb, S_IFLNK | S_IRWXUGO); if (!inode) return -ENOSPC; res = page_symlink(inode, symname, strlen(symname) + 1); if (res) { inode->i_nlink = 0; hfsplus_delete_inode(inode); iput(inode); return res; } mark_inode_dirty(inode); res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode); if (!res) { hfsplus_instantiate(dentry, inode, inode->i_ino); mark_inode_dirty(inode); } return res; }
static int hfsplus_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) { struct super_block *sb; struct inode *inode; hfsplus_handle_t hfsplus_handle; int res; if ((res = hfsplus_journal_start(__FUNCTION__, dir->i_sb, &hfsplus_handle))) return res; sb = dir->i_sb; inode = hfsplus_new_inode(&hfsplus_handle, sb, mode); if (!inode) { hfsplus_journal_stop(&hfsplus_handle); return -ENOSPC; } res = hfsplus_create_cat(&hfsplus_handle, inode->i_ino, dir, &dentry->d_name, inode); if (res) { inode->i_nlink = 0; hfsplus_delete_inode(&hfsplus_handle, inode); iput(inode); hfsplus_journal_stop(&hfsplus_handle); return res; } init_special_inode(inode, mode, rdev); hfsplus_instantiate(dentry, inode, inode->i_ino); res = hfsplus_journalled_mark_inode_dirty(__FUNCTION__, &hfsplus_handle, inode); hfsplus_journal_stop(&hfsplus_handle); return 0; }
static int hfsplus_mkdir(struct inode *dir, struct dentry *dentry, int mode) { struct inode *inode; hfsplus_handle_t hfsplus_handle; int res; if ((res = hfsplus_journal_start(__FUNCTION__, dir->i_sb, &hfsplus_handle))) return res; inode = hfsplus_new_inode(&hfsplus_handle, dir->i_sb, S_IFDIR | mode); if (!inode) { hfsplus_journal_stop(&hfsplus_handle); return -ENOSPC; } res = hfsplus_create_cat(&hfsplus_handle, inode->i_ino, dir, &dentry->d_name, inode); if (res) { inode->i_nlink = 0; hfsplus_delete_inode(&hfsplus_handle, inode); iput(inode); hfsplus_journal_stop(&hfsplus_handle); return res; } hfsplus_instantiate(dentry, inode, inode->i_ino); res = hfsplus_journalled_mark_inode_dirty(__FUNCTION__, &hfsplus_handle, inode); hfsplus_journal_stop(&hfsplus_handle); return res; }
static int hfsplus_unlink(struct inode *dir, struct dentry *dentry) { struct super_block *sb = dir->i_sb; struct inode *inode = dentry->d_inode; struct qstr str; char name[32]; u32 cnid; int res; if (HFSPLUS_IS_RSRC(inode)) return -EPERM; cnid = (u32)(unsigned long)dentry->d_fsdata; if (inode->i_ino == cnid && atomic_read(&HFSPLUS_I(inode).opencnt)) { str.name = name; str.len = sprintf(name, "temp%lu", inode->i_ino); res = hfsplus_rename_cat(inode->i_ino, dir, &dentry->d_name, HFSPLUS_SB(sb).hidden_dir, &str); if (!res) inode->i_flags |= S_DEAD; return res; } res = hfsplus_delete_cat(cnid, dir, &dentry->d_name); if (res) return res; if (inode->i_nlink > 0) drop_nlink(inode); hfsplus_delete_inode(inode); if (inode->i_ino != cnid && !inode->i_nlink) { if (!atomic_read(&HFSPLUS_I(inode).opencnt)) { res = hfsplus_delete_cat(inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL); if (!res) hfsplus_delete_inode(inode); } else inode->i_flags |= S_DEAD; } else clear_nlink(inode); inode->i_ctime = CURRENT_TIME_SEC; mark_inode_dirty(inode); return res; }
static int hfsplus_rmdir(struct inode *dir, struct dentry *dentry) { struct inode *inode; int res; inode = dentry->d_inode; if (inode->i_size != 2) return -ENOTEMPTY; res = hfsplus_delete_cat(inode->i_ino, dir, &dentry->d_name); if (res) return res; clear_nlink(inode); inode->i_ctime = CURRENT_TIME_SEC; hfsplus_delete_inode(inode); mark_inode_dirty(inode); return 0; }
static int hfsplus_mkdir(struct inode *dir, struct dentry *dentry, int mode) { struct inode *inode; int res; inode = hfsplus_new_inode(dir->i_sb, S_IFDIR | mode); if (!inode) return -ENOSPC; res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode); if (res) { inode->i_nlink = 0; hfsplus_delete_inode(inode); iput(inode); return res; } hfsplus_instantiate(dentry, inode, inode->i_ino); mark_inode_dirty(inode); return 0; }
static int hfsplus_symlink(struct inode *dir, struct dentry *dentry, const char *symname) { struct hfsplus_sb_info *sbi = HFSPLUS_SB(dir->i_sb); struct inode *inode; int res = -ENOSPC; mutex_lock(&sbi->vh_mutex); inode = hfsplus_new_inode(dir->i_sb, S_IFLNK | S_IRWXUGO); if (!inode) goto out; res = page_symlink(inode, symname, strlen(symname) + 1); if (res) goto out_err; res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode); if (res) goto out_err; res = hfsplus_init_inode_security(inode, dir, &dentry->d_name); if (res == -EOPNOTSUPP) res = 0; /* Operation is not supported. */ else if (res) { /* Try to delete anyway without error analysis. */ hfsplus_delete_cat(inode->i_ino, dir, &dentry->d_name); goto out_err; } hfsplus_instantiate(dentry, inode, inode->i_ino); mark_inode_dirty(inode); goto out; out_err: clear_nlink(inode); hfsplus_delete_inode(inode); iput(inode); out: mutex_unlock(&sbi->vh_mutex); return res; }
static int hfsplus_rmdir(struct inode *dir, struct dentry *dentry) { struct hfsplus_sb_info *sbi = HFSPLUS_SB(dir->i_sb); struct inode *inode = dentry->d_inode; int res; if (inode->i_size != 2) return -ENOTEMPTY; mutex_lock(&sbi->vh_mutex); res = hfsplus_delete_cat(inode->i_ino, dir, &dentry->d_name); if (res) goto out; clear_nlink(inode); inode->i_ctime = CURRENT_TIME_SEC; hfsplus_delete_inode(inode); mark_inode_dirty(inode); out: mutex_unlock(&sbi->vh_mutex); return res; }
static int hfsplus_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) { struct hfsplus_sb_info *sbi = HFSPLUS_SB(dir->i_sb); struct inode *inode; int res = -ENOSPC; mutex_lock(&sbi->vh_mutex); inode = hfsplus_new_inode(dir->i_sb, mode); if (!inode) goto out; if (S_ISBLK(mode) || S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) init_special_inode(inode, mode, rdev); res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode); if (res) goto failed_mknod; res = hfsplus_init_inode_security(inode, dir, &dentry->d_name); if (res == -EOPNOTSUPP) res = 0; /* Operation is not supported. */ else if (res) { /* Try to delete anyway without error analysis. */ hfsplus_delete_cat(inode->i_ino, dir, &dentry->d_name); goto failed_mknod; } hfsplus_instantiate(dentry, inode, inode->i_ino); mark_inode_dirty(inode); goto out; failed_mknod: clear_nlink(inode); hfsplus_delete_inode(inode); iput(inode); out: mutex_unlock(&sbi->vh_mutex); return res; }
static int hfsplus_symlink(struct inode *dir, struct dentry *dentry, const char *symname) { struct super_block *sb; struct inode *inode; hfsplus_handle_t hfsplus_handle; int res; if ((res = hfsplus_journal_start(__FUNCTION__, dir->i_sb, &hfsplus_handle))) return res; sb = dir->i_sb; inode = hfsplus_new_inode(&hfsplus_handle, sb, S_IFLNK | S_IRWXUGO); if (!inode) { hfsplus_journal_stop(&hfsplus_handle); return -ENOSPC; } res = page_symlink(inode, symname, strlen(symname) + 1); if (res) { inode->i_nlink = 0; hfsplus_delete_inode(&hfsplus_handle, inode); iput(inode); hfsplus_journal_stop(&hfsplus_handle); return res; } if ((res = hfsplus_journalled_mark_inode_dirty(__FUNCTION__, &hfsplus_handle, inode))) goto symlink_out; res = hfsplus_create_cat(&hfsplus_handle, inode->i_ino, dir, &dentry->d_name, inode); if (!res) { hfsplus_instantiate(dentry, inode, inode->i_ino); res = hfsplus_journalled_mark_inode_dirty(__FUNCTION__, &hfsplus_handle, inode); } symlink_out: hfsplus_journal_stop(&hfsplus_handle); return res; }
static int hfsplus_rmdir(struct inode *dir, struct dentry *dentry) { struct inode *inode; hfsplus_handle_t hfsplus_handle; int res; inode = dentry->d_inode; if (inode->i_size != 2) return -ENOTEMPTY; if ((res = hfsplus_journal_start(__FUNCTION__, dir->i_sb, &hfsplus_handle))) return res; res = hfsplus_delete_cat(&hfsplus_handle, inode->i_ino, dir, &dentry->d_name); if (res) { hfsplus_journal_stop(&hfsplus_handle); return res; } clear_nlink(inode); inode->i_ctime = CURRENT_TIME_SEC; hfsplus_delete_inode(&hfsplus_handle, inode); res = hfsplus_journalled_mark_inode_dirty(__FUNCTION__, &hfsplus_handle, inode); hfsplus_journal_stop(&hfsplus_handle); return res; }