add ntfs_attr_remove(); convert its users

master N2006_11_08_233131
szaka 2006-11-08 21:36:29 +00:00
parent 09dd3c34bc
commit 94b94568e3
4 changed files with 53 additions and 59 deletions

View File

@ -330,7 +330,7 @@ extern int ntfs_attr_truncate(ntfs_attr *na, const s64 newsize);
*
* FIXME: Describe possible errnos.
*/
s64 ntfs_get_attribute_value_length(const ATTR_RECORD *a);
extern s64 ntfs_get_attribute_value_length(const ATTR_RECORD *a);
/**
* get_attribute_value - return the attribute value of an attribute
@ -346,14 +346,15 @@ s64 ntfs_get_attribute_value_length(const ATTR_RECORD *a);
* then nothing was read due to a zero-length attribute value, otherwise
* errno describes the error.
*/
s64 ntfs_get_attribute_value(const ntfs_volume *vol, const ATTR_RECORD *a,
u8 *b);
extern s64 ntfs_get_attribute_value(const ntfs_volume *vol,
const ATTR_RECORD *a, u8 *b);
void ntfs_attr_name_free(char **name);
char *ntfs_attr_name_get(const ntfschar *uname, const int uname_len);
int ntfs_attr_exist(ntfs_inode *ni, const ATTR_TYPES type, ntfschar *name,
u32 name_len);
extern void ntfs_attr_name_free(char **name);
extern char *ntfs_attr_name_get(const ntfschar *uname, const int uname_len);
extern int ntfs_attr_exist(ntfs_inode *ni, const ATTR_TYPES type,
ntfschar *name, u32 name_len);
extern int ntfs_attr_remove(ntfs_inode *ni, const ATTR_TYPES type,
ntfschar *name, u32 name_len);
#endif /* defined _NTFS_ATTRIB_H */

View File

@ -4876,6 +4876,8 @@ void *ntfs_attr_readall(ntfs_inode *ni, const ATTR_TYPES type,
void *data, *ret = NULL;
s64 size;
ntfs_log_trace("Entering\n");
na = ntfs_attr_open(ni, type, name, name_len);
if (!na) {
ntfs_log_perror("ntfs_attr_open failed");
@ -4921,3 +4923,33 @@ int ntfs_attr_exist(ntfs_inode *ni, const ATTR_TYPES type, ntfschar *name,
return !ret;
}
int ntfs_attr_remove(ntfs_inode *ni, const ATTR_TYPES type, ntfschar *name,
u32 name_len)
{
ntfs_attr *na;
int ret;
ntfs_log_trace("Entering\n");
if (!ni) {
ntfs_log_error("%s: NULL inode pointer", __FUNCTION__);
errno = EINVAL;
return -1;
}
na = ntfs_attr_open(ni, type, name, name_len);
if (!na) {
ntfs_log_perror("Failed to open attribute 0x%02x of inode "
"0x%llx", type, (unsigned long long)ni->mft_no);
return -1;
}
ret = ntfs_attr_rm(na);
if (ret)
ntfs_log_perror("Failed to remove attribute 0x%02x of inode "
"0x%llx", type, (unsigned long long)ni->mft_no);
ntfs_attr_close(na);
return ret;
}

View File

@ -1222,39 +1222,12 @@ static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni,
return ni;
err_out:
ntfs_log_trace("Failed.\n");
if (rollback_sd) {
ntfs_attr *na;
na = ntfs_attr_open(ni, AT_SECURITY_DESCRIPTOR, AT_UNNAMED, 0);
if (!na)
ntfs_log_perror("Failed to open SD (0x50) attribute of "
" inode 0x%llx. Run chkdsk.\n",
(unsigned long long)ni->mft_no);
else {
if (ntfs_attr_rm(na))
ntfs_log_perror("Failed to remove SD (0x50) "
"attribute of inode 0x%llx",
(unsigned long long)ni->mft_no);
ntfs_attr_close(na);
}
}
if (rollback_data) {
ntfs_attr *na;
na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0);
if (!na)
ntfs_log_perror("Failed to open data attribute of "
" inode 0x%llx. Run chkdsk.\n",
(unsigned long long)ni->mft_no);
else {
if (ntfs_attr_rm(na))
ntfs_log_perror("Failed to remove data "
"attribute of inode 0x%llx",
(unsigned long long)ni->mft_no);
ntfs_attr_close(na);
}
}
if (rollback_sd)
ntfs_attr_remove(ni, AT_SECURITY_DESCRIPTOR, AT_UNNAMED, 0);
if (rollback_data)
ntfs_attr_remove(ni, AT_DATA, AT_UNNAMED, 0);
/*
* Free extent MFT records (should not exist any with current
* ntfs_create implementation, but for any case if something will be

View File

@ -1005,22 +1005,15 @@ static int ntfs_fuse_rm_stream(const char *path, ntfschar *stream_name,
const int stream_name_len)
{
ntfs_inode *ni;
ntfs_attr *na;
int res = 0;
ni = ntfs_pathname_to_inode(ctx->vol, NULL, path);
if (!ni)
return -errno;
na = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_len);
if (!na) {
res = -errno;
goto exit;
}
if (ntfs_attr_rm(na))
res = -errno;
ntfs_attr_close(na);
exit:
if (ntfs_attr_remove(ni, AT_DATA, stream_name, stream_name_len))
res = -errno;
if (ntfs_inode_close(ni))
ntfs_log_perror("Failed to close inode");
return res;
@ -1449,7 +1442,6 @@ static int ntfs_fuse_removexattr(const char *path, const char *name)
{
ntfs_volume *vol;
ntfs_inode *ni;
ntfs_attr *na = NULL;
ntfschar *lename = NULL;
int res = 0, lename_len;
@ -1470,15 +1462,11 @@ static int ntfs_fuse_removexattr(const char *path, const char *name)
res = -errno;
goto exit;
}
na = ntfs_attr_open(ni, AT_DATA, lename, lename_len);
if (!na) {
res = -ENODATA;
goto exit;
}
if (ntfs_attr_rm(na))
if (ntfs_attr_remove(ni, AT_DATA, lename, lename_len)) {
if (errno == ENOENT)
errno = ENODATA;
res = -errno;
ntfs_attr_close(na);
}
ntfs_fuse_mark_free_space_outdated();
exit: