diff options
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 8 |
1 files changed, 7 insertions, 1 deletions
@@ -115,17 +115,23 @@ EXPORT_SYMBOL_GPL(vfs_truncate); | |||
115 | 115 | ||
116 | static long do_sys_truncate(const char __user *pathname, loff_t length) | 116 | static long do_sys_truncate(const char __user *pathname, loff_t length) |
117 | { | 117 | { |
118 | unsigned int lookup_flags = LOOKUP_FOLLOW; | ||
118 | struct path path; | 119 | struct path path; |
119 | int error; | 120 | int error; |
120 | 121 | ||
121 | if (length < 0) /* sorry, but loff_t says... */ | 122 | if (length < 0) /* sorry, but loff_t says... */ |
122 | return -EINVAL; | 123 | return -EINVAL; |
123 | 124 | ||
124 | error = user_path(pathname, &path); | 125 | retry: |
126 | error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path); | ||
125 | if (!error) { | 127 | if (!error) { |
126 | error = vfs_truncate(&path, length); | 128 | error = vfs_truncate(&path, length); |
127 | path_put(&path); | 129 | path_put(&path); |
128 | } | 130 | } |
131 | if (retry_estale(error, lookup_flags)) { | ||
132 | lookup_flags |= LOOKUP_REVAL; | ||
133 | goto retry; | ||
134 | } | ||
129 | return error; | 135 | return error; |
130 | } | 136 | } |
131 | 137 | ||