diff options
Diffstat (limited to 'fs/utimes.c')
-rw-r--r-- | fs/utimes.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/utimes.c b/fs/utimes.c index f4fb7eca10e8..aa138d64560a 100644 --- a/fs/utimes.c +++ b/fs/utimes.c | |||
@@ -53,6 +53,7 @@ static int utimes_common(struct path *path, struct timespec *times) | |||
53 | int error; | 53 | int error; |
54 | struct iattr newattrs; | 54 | struct iattr newattrs; |
55 | struct inode *inode = path->dentry->d_inode; | 55 | struct inode *inode = path->dentry->d_inode; |
56 | struct inode *delegated_inode = NULL; | ||
56 | 57 | ||
57 | error = mnt_want_write(path->mnt); | 58 | error = mnt_want_write(path->mnt); |
58 | if (error) | 59 | if (error) |
@@ -101,9 +102,15 @@ static int utimes_common(struct path *path, struct timespec *times) | |||
101 | goto mnt_drop_write_and_out; | 102 | goto mnt_drop_write_and_out; |
102 | } | 103 | } |
103 | } | 104 | } |
105 | retry_deleg: | ||
104 | mutex_lock(&inode->i_mutex); | 106 | mutex_lock(&inode->i_mutex); |
105 | error = notify_change(path->dentry, &newattrs); | 107 | error = notify_change(path->dentry, &newattrs, &delegated_inode); |
106 | mutex_unlock(&inode->i_mutex); | 108 | mutex_unlock(&inode->i_mutex); |
109 | if (delegated_inode) { | ||
110 | error = break_deleg_wait(&delegated_inode); | ||
111 | if (!error) | ||
112 | goto retry_deleg; | ||
113 | } | ||
107 | 114 | ||
108 | mnt_drop_write_and_out: | 115 | mnt_drop_write_and_out: |
109 | mnt_drop_write(path->mnt); | 116 | mnt_drop_write(path->mnt); |