|
@@ -779,8 +779,10 @@ find_conflict:
|
|
if (!flock_locks_conflict(request, fl))
|
|
if (!flock_locks_conflict(request, fl))
|
|
continue;
|
|
continue;
|
|
error = -EAGAIN;
|
|
error = -EAGAIN;
|
|
- if (request->fl_flags & FL_SLEEP)
|
|
|
|
- locks_insert_block(fl, request);
|
|
|
|
|
|
+ if (!(request->fl_flags & FL_SLEEP))
|
|
|
|
+ goto out;
|
|
|
|
+ error = FILE_LOCK_DEFERRED;
|
|
|
|
+ locks_insert_block(fl, request);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
if (request->fl_flags & FL_ACCESS)
|
|
if (request->fl_flags & FL_ACCESS)
|
|
@@ -836,7 +838,7 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request, str
|
|
error = -EDEADLK;
|
|
error = -EDEADLK;
|
|
if (posix_locks_deadlock(request, fl))
|
|
if (posix_locks_deadlock(request, fl))
|
|
goto out;
|
|
goto out;
|
|
- error = -EAGAIN;
|
|
|
|
|
|
+ error = FILE_LOCK_DEFERRED;
|
|
locks_insert_block(fl, request);
|
|
locks_insert_block(fl, request);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
@@ -1035,7 +1037,7 @@ int posix_lock_file_wait(struct file *filp, struct file_lock *fl)
|
|
might_sleep ();
|
|
might_sleep ();
|
|
for (;;) {
|
|
for (;;) {
|
|
error = posix_lock_file(filp, fl, NULL);
|
|
error = posix_lock_file(filp, fl, NULL);
|
|
- if ((error != -EAGAIN) || !(fl->fl_flags & FL_SLEEP))
|
|
|
|
|
|
+ if (error != FILE_LOCK_DEFERRED)
|
|
break;
|
|
break;
|
|
error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
|
|
error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
|
|
if (!error)
|
|
if (!error)
|
|
@@ -1107,9 +1109,7 @@ int locks_mandatory_area(int read_write, struct inode *inode,
|
|
|
|
|
|
for (;;) {
|
|
for (;;) {
|
|
error = __posix_lock_file(inode, &fl, NULL);
|
|
error = __posix_lock_file(inode, &fl, NULL);
|
|
- if (error != -EAGAIN)
|
|
|
|
- break;
|
|
|
|
- if (!(fl.fl_flags & FL_SLEEP))
|
|
|
|
|
|
+ if (error != FILE_LOCK_DEFERRED)
|
|
break;
|
|
break;
|
|
error = wait_event_interruptible(fl.fl_wait, !fl.fl_next);
|
|
error = wait_event_interruptible(fl.fl_wait, !fl.fl_next);
|
|
if (!error) {
|
|
if (!error) {
|
|
@@ -1531,7 +1531,7 @@ int flock_lock_file_wait(struct file *filp, struct file_lock *fl)
|
|
might_sleep();
|
|
might_sleep();
|
|
for (;;) {
|
|
for (;;) {
|
|
error = flock_lock_file(filp, fl);
|
|
error = flock_lock_file(filp, fl);
|
|
- if ((error != -EAGAIN) || !(fl->fl_flags & FL_SLEEP))
|
|
|
|
|
|
+ if (error != FILE_LOCK_DEFERRED)
|
|
break;
|
|
break;
|
|
error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
|
|
error = wait_event_interruptible(fl->fl_wait, !fl->fl_next);
|
|
if (!error)
|
|
if (!error)
|
|
@@ -1716,17 +1716,17 @@ out:
|
|
* fl_grant is set. Callers expecting ->lock() to return asynchronously
|
|
* fl_grant is set. Callers expecting ->lock() to return asynchronously
|
|
* will only use F_SETLK, not F_SETLKW; they will set FL_SLEEP if (and only if)
|
|
* will only use F_SETLK, not F_SETLKW; they will set FL_SLEEP if (and only if)
|
|
* the request is for a blocking lock. When ->lock() does return asynchronously,
|
|
* the request is for a blocking lock. When ->lock() does return asynchronously,
|
|
- * it must return -EINPROGRESS, and call ->fl_grant() when the lock
|
|
|
|
|
|
+ * it must return FILE_LOCK_DEFERRED, and call ->fl_grant() when the lock
|
|
* request completes.
|
|
* request completes.
|
|
* If the request is for non-blocking lock the file system should return
|
|
* If the request is for non-blocking lock the file system should return
|
|
- * -EINPROGRESS then try to get the lock and call the callback routine with
|
|
|
|
- * the result. If the request timed out the callback routine will return a
|
|
|
|
|
|
+ * FILE_LOCK_DEFERRED then try to get the lock and call the callback routine
|
|
|
|
+ * with the result. If the request timed out the callback routine will return a
|
|
* nonzero return code and the file system should release the lock. The file
|
|
* nonzero return code and the file system should release the lock. The file
|
|
* system is also responsible to keep a corresponding posix lock when it
|
|
* system is also responsible to keep a corresponding posix lock when it
|
|
* grants a lock so the VFS can find out which locks are locally held and do
|
|
* grants a lock so the VFS can find out which locks are locally held and do
|
|
* the correct lock cleanup when required.
|
|
* the correct lock cleanup when required.
|
|
* The underlying filesystem must not drop the kernel lock or call
|
|
* The underlying filesystem must not drop the kernel lock or call
|
|
- * ->fl_grant() before returning to the caller with a -EINPROGRESS
|
|
|
|
|
|
+ * ->fl_grant() before returning to the caller with a FILE_LOCK_DEFERRED
|
|
* return code.
|
|
* return code.
|
|
*/
|
|
*/
|
|
int vfs_lock_file(struct file *filp, unsigned int cmd, struct file_lock *fl, struct file_lock *conf)
|
|
int vfs_lock_file(struct file *filp, unsigned int cmd, struct file_lock *fl, struct file_lock *conf)
|
|
@@ -1804,7 +1804,7 @@ again:
|
|
else {
|
|
else {
|
|
for (;;) {
|
|
for (;;) {
|
|
error = posix_lock_file(filp, file_lock, NULL);
|
|
error = posix_lock_file(filp, file_lock, NULL);
|
|
- if (error != -EAGAIN || cmd == F_SETLK)
|
|
|
|
|
|
+ if (error != FILE_LOCK_DEFERRED)
|
|
break;
|
|
break;
|
|
error = wait_event_interruptible(file_lock->fl_wait,
|
|
error = wait_event_interruptible(file_lock->fl_wait,
|
|
!file_lock->fl_next);
|
|
!file_lock->fl_next);
|
|
@@ -1941,7 +1941,7 @@ again:
|
|
else {
|
|
else {
|
|
for (;;) {
|
|
for (;;) {
|
|
error = posix_lock_file(filp, file_lock, NULL);
|
|
error = posix_lock_file(filp, file_lock, NULL);
|
|
- if (error != -EAGAIN || cmd == F_SETLK64)
|
|
|
|
|
|
+ if (error != FILE_LOCK_DEFERRED)
|
|
break;
|
|
break;
|
|
error = wait_event_interruptible(file_lock->fl_wait,
|
|
error = wait_event_interruptible(file_lock->fl_wait,
|
|
!file_lock->fl_next);
|
|
!file_lock->fl_next);
|