diff options
author | David Woodhouse <dwmw2@infradead.org> | 2008-02-25 15:25:25 +0000 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2008-02-25 15:25:25 +0000 |
commit | dd919660aacdf4adfcd279556aa03e595f7f0fc2 (patch) | |
tree | 8b005d7a921f4814a221e7811f0e7da40747f482 /fs/jffs2 | |
parent | b28ba9fa0154f78f3d36f5ae9a42f7bb01663cca (diff) | |
download | linux-dd919660aacdf4adfcd279556aa03e595f7f0fc2.tar.gz linux-dd919660aacdf4adfcd279556aa03e595f7f0fc2.tar.bz2 linux-dd919660aacdf4adfcd279556aa03e595f7f0fc2.zip |
[JFFS2] Use ALLOC_DELETION priority for truncation to zero length
This is going to obsolete all previous nodes, so treat it as deletion.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'fs/jffs2')
-rw-r--r-- | fs/jffs2/fs.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index 3f49562dc508..9dafb53fb1d1 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c @@ -36,6 +36,7 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) unsigned int ivalid; uint32_t alloclen; int ret; + int alloc_type = ALLOC_NORMAL; D1(printk(KERN_DEBUG "jffs2_setattr(): ino #%lu\n", inode->i_ino)); @@ -115,6 +116,10 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) ri->compr = JFFS2_COMPR_ZERO; ri->dsize = cpu_to_je32(iattr->ia_size - inode->i_size); ri->offset = cpu_to_je32(inode->i_size); + } else if (ivalid & ATTR_SIZE && !iattr->ia_size) { + /* For truncate-to-zero, treat it as deletion because + it'll always be obsoleting all previous nodes */ + alloc_type = ALLOC_DELETION; } ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); if (mdatalen) @@ -122,7 +127,7 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr) else ri->data_crc = cpu_to_je32(0); - new_metadata = jffs2_write_dnode(c, f, ri, mdata, mdatalen, ALLOC_NORMAL); + new_metadata = jffs2_write_dnode(c, f, ri, mdata, mdatalen, alloc_type); if (S_ISLNK(inode->i_mode)) kfree(mdata); |