[PATCH 32/35] union-mount: Implement union-aware truncate()

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Valerie Aurora
Date: Thursday, April 15, 2010 - 4:04 pm

---
 fs/open.c |   24 ++++++++++++++++++++----
 1 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/fs/open.c b/fs/open.c
index 325852d..dda1b6f 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -230,14 +230,17 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
 static long do_sys_truncate(const char __user *pathname, loff_t length)
 {
 	struct path path;
+	struct nameidata nd;
+	struct vfsmount *mnt;
 	struct inode *inode;
+	char *tmp;
 	int error;
 
 	error = -EINVAL;
 	if (length < 0)	/* sorry, but loff_t says... */
 		goto out;
 
-	error = user_path(pathname, &path);
+	error = user_path_nd(AT_FDCWD, pathname, 0, &nd, &path, &tmp);
 	if (error)
 		goto out;
 	inode = path.dentry->d_inode;
@@ -251,11 +254,16 @@ static long do_sys_truncate(const char __user *pathname, loff_t length)
 	if (!S_ISREG(inode->i_mode))
 		goto dput_and_out;
 
-	error = mnt_want_write(path.mnt);
+	if (IS_UNIONED_DIR(&nd.path))
+		mnt = nd.path.mnt;
+	else
+		mnt = path.mnt;
+
+	error = mnt_want_write(mnt);
 	if (error)
 		goto dput_and_out;
 
-	error = inode_permission(inode, MAY_WRITE);
+	error = path_permission(&path, &nd.path, MAY_WRITE);
 	if (error)
 		goto mnt_drop_write_and_out;
 
@@ -263,6 +271,12 @@ static long do_sys_truncate(const char __user *pathname, loff_t length)
 	if (IS_APPEND(inode))
 		goto mnt_drop_write_and_out;
 
+	error = union_copyup_len(&nd, &path, length);
+	if (error)
+		goto mnt_drop_write_and_out;
+
+	/* path may have changed after copyup */
+	inode = path.dentry->d_inode;
 	error = get_write_access(inode);
 	if (error)
 		goto mnt_drop_write_and_out;
@@ -284,9 +298,11 @@ static long do_sys_truncate(const char __user *pathname, loff_t length)
 put_write_and_out:
 	put_write_access(inode);
 mnt_drop_write_and_out:
-	mnt_drop_write(path.mnt);
+	mnt_drop_write(mnt);
 dput_and_out:
 	path_put(&path);
+	path_put(&nd.path);
+	putname(tmp);
 out:
 	return error;
 }
-- 
1.6.3.3

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00/35] Union mounts - everything but the xattrs, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 01/35] VFS: Make lookup_hash() return a struct path, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 02/35] VFS: Add read-only users count to superblock, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 08/35] whiteout: tmpfs whiteout support, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 10/35] whiteout: ext2 whiteout support, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 11/35] whiteout: jffs2 whiteout support, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 12/35] fallthru: Basic fallthru definitions, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 13/35] fallthru: ext2 fallthru support, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 14/35] fallthru: jffs2 fallthru support, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 15/35] fallthru: tmpfs fallthru support, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 20/35] union-mount: Implement union lookup, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 26/35] union-mount: In-kernel copyup routines, Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 28/35] union-mount: Implement union-aware link(), Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 29/35] union-mount: Implement union-aware rename(), Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 31/35] union-mount: Implement union-aware chown(), Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 32/35] union-mount: Implement union-aware truncate(), Valerie Aurora, (Thu Apr 15, 4:04 pm)
[PATCH 34/35] union-mount: Implement union-aware lchown(), Valerie Aurora, (Thu Apr 15, 4:04 pm)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, David Woodhouse, (Mon Apr 19, 6:02 am)
Re: [PATCH 11/35] whiteout: jffs2 whiteout support, David Woodhouse, (Mon Apr 19, 6:03 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Jan Blunck, (Mon Apr 19, 6:23 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Jan Blunck, (Mon Apr 19, 7:12 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Valerie Aurora, (Mon Apr 19, 7:23 am)
Re: [PATCH 11/35] whiteout: jffs2 whiteout support, Valerie Aurora, (Mon Apr 19, 7:26 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Jan Blunck, (Wed Apr 21, 1:42 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Jamie Lokier, (Wed Apr 21, 2:22 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Jamie Lokier, (Wed Apr 21, 2:52 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Miklos Szeredi, (Wed Apr 21, 3:17 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Jamie Lokier, (Wed Apr 21, 10:36 am)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Valerie Aurora, (Wed Apr 21, 2:38 pm)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, Jamie Lokier, (Wed Apr 21, 3:10 pm)
Re: [PATCH 00/35] Union mounts - everything but the xattrs, Valerie Aurora, (Wed Apr 21, 4:35 pm)
Re: [PATCH 13/35] fallthru: ext2 fallthru support, J. R. Okajima, (Thu Apr 22, 3:30 am)