From e2ba16e3db9ea857522955f5937482e5bdcfb39c Mon Sep 17 00:00:00 2001 From: "(none)!yura" <(none)!yura> Date: Sun, 21 Nov 2004 11:13:09 +0000 Subject: [PATCH] Add @extra parameter to ntfs_attr_record_move_away. New attribute record holder must have free @extra bytes after moving attribute record to it. (Logical change 1.639) --- include/ntfs/attrib.h | 2 +- libntfs/attrib.c | 10 +++++++--- libntfs/inode.c | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/ntfs/attrib.h b/include/ntfs/attrib.h index e65c6e90..0918b0ce 100644 --- a/include/ntfs/attrib.h +++ b/include/ntfs/attrib.h @@ -289,7 +289,7 @@ extern int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a, const u32 newsize); extern int ntfs_attr_record_move_to(ntfs_attr_search_ctx *ctx, ntfs_inode *ni); -extern int ntfs_attr_record_move_away(ntfs_attr_search_ctx *ctx); +extern int ntfs_attr_record_move_away(ntfs_attr_search_ctx *ctx, int extra); extern int ntfs_attr_update_mapping_pairs(ntfs_attr *na); diff --git a/libntfs/attrib.c b/libntfs/attrib.c index 584e9ded..ff62b77c 100644 --- a/libntfs/attrib.c +++ b/libntfs/attrib.c @@ -3046,19 +3046,23 @@ put_err_out: /** * ntfs_attr_record_move_away - move away attribute record from it's mft record * @ctx: attribute search context describing the attrubute record + * @extra: minimum amount of free spase in the new holder of record * + * New attribute record holder must have free @extra bytes after moving + * attribute record to it. + * * If this function succeed, user should reinit search context if he/she wants * use it anymore. * * Return 0 on success and -1 on error with errno set to the error code. */ -int ntfs_attr_record_move_away(ntfs_attr_search_ctx *ctx) +int ntfs_attr_record_move_away(ntfs_attr_search_ctx *ctx, int extra) { ntfs_inode *base_ni, *ni; MFT_RECORD *m; int i, err; - if (!ctx || !ctx->attr || !ctx->ntfs_ino) { + if (!ctx || !ctx->attr || !ctx->ntfs_ino || extra < 0) { Dprintf("%s(): Invalid arguments passed.\n", __FUNCTION__); errno = EINVAL; return -1; @@ -3097,7 +3101,7 @@ int ntfs_attr_record_move_away(ntfs_attr_search_ctx *ctx) if (le32_to_cpu(m->bytes_allocated) - le32_to_cpu(m->bytes_in_use) < - le32_to_cpu(ctx->attr->length)) + le32_to_cpu(ctx->attr->length) + extra) continue; if (!ntfs_attr_record_move_to(ctx, ni)) diff --git a/libntfs/inode.c b/libntfs/inode.c index 07f65dd6..3ab66997 100644 --- a/libntfs/inode.c +++ b/libntfs/inode.c @@ -807,7 +807,7 @@ int ntfs_inode_free_space(ntfs_inode *ni, int size) record_size = le32_to_cpu(ctx->attr->length); /* Move away attribute. */ - if (ntfs_attr_record_move_away(ctx)) { + if (ntfs_attr_record_move_away(ctx, 0)) { err = errno; Dprintf("%s(): Failed to move out attribute.\n", __FUNCTION__);