[PATCH 1/1] Enable fully functional truncate for hugetlbfs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch enables the full functionality of truncate for hugetlbfs
files.  Truncate was originally limited to reducing the file size
because page faults were not supported for hugetlbfs.  Now that page
faults have been implemented it is now possible to fully support
truncate.

Signed-off-by: Dave McCracken <[email protected]>

---
 inode.c |   21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

--- 2.6.20/./fs/hugetlbfs/inode.c	2007-02-04 12:44:54.000000000 -0600
+++ 2.6.20-htrunc/./fs/hugetlbfs/inode.c	2007-02-05 13:02:00.000000000 -0600
@@ -298,9 +298,10 @@ static int hugetlb_vmtruncate(struct ino
 {
 	pgoff_t pgoff;
 	struct address_space *mapping = inode->i_mapping;
+	unsigned long limit;
 
 	if (offset > inode->i_size)
-		return -EINVAL;
+		goto do_expand;
 
 	BUG_ON(offset & ~HPAGE_MASK);
 	pgoff = offset >> PAGE_SHIFT;
@@ -312,6 +313,24 @@ static int hugetlb_vmtruncate(struct ino
 	spin_unlock(&mapping->i_mmap_lock);
 	truncate_hugepages(inode, offset);
 	return 0;
+
+do_expand:
+	limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
+	if (limit != RLIM_INFINITY && offset > limit)
+		goto out_sig;
+	if (offset > inode->i_sb->s_maxbytes)
+		goto out_big;
+	if (hugetlb_reserve_pages(inode, inode->i_size >> HPAGE_SHIFT,
+				  offset >> HPAGE_SHIFT))
+		goto out_mem;
+	i_size_write(inode, offset);
+	return 0;
+out_sig:
+	send_sig(SIGXFSZ, current, 0);
+out_big:
+	return -EFBIG;
+out_mem:
+	return -ENOMEM;
 }
 
 static int hugetlbfs_setattr(struct dentry *dentry, struct iattr *attr)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux