lkml.org 
[lkml]   [2001]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH] 2.4.9-ac10 but not only, locks_alloc_lock()
On Sun, 9 Sep 2001, Manfred Spraul wrote:

>
> > Not sure about one thing, though: what error code to return for
> > locks_mandatory_area() on failure. It's invoked from some of the
> > {do,sys}_*{read,write}*() routines and nowhere else AFAICT. I set it
> > to -ENOMEM, maybe this is not the right thing to do.
>
> I'd put the file_lock structure on the stack. It's ~ 90 bytes long, not
> too large.
> Returning -ENOMEM is imho not acceptable: -ENOMEM is not listed in
> SusV2, and locks_alloc_lock() internally checks for rlimits (setting
> RLIM_NLIMITS to 0 and execing another app might have dangerous
> sideeffects).
>

Not sure about what you mean wrt RLIM_NLIMITS, anyway a new patch is
attached with follows your suggestion. Does it look correct?

--
Francis Galiegue, fg@mandrakesoft.com - Normand et fier de l'être
"Programming is a race between programmers, who try and make more and more
idiot-proof software, and universe, which produces more and more remarkable
idiots. Until now, universe leads the race" -- R. Cook
diff -urN linux-old/fs/locks.c linux/fs/locks.c
--- linux-old/fs/locks.c Sun Sep 9 09:00:06 2001
+++ linux/fs/locks.c Sun Sep 9 12:12:02 2001
@@ -695,16 +695,18 @@
size_t count)
{
struct file_lock *fl;
- struct file_lock *new_fl = locks_alloc_lock(0);
+ struct file_lock new_fl;
int error;

- new_fl->fl_owner = current->files;
- new_fl->fl_pid = current->pid;
- new_fl->fl_file = filp;
- new_fl->fl_flags = FL_POSIX | FL_ACCESS;
- new_fl->fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK;
- new_fl->fl_start = offset;
- new_fl->fl_end = offset + count - 1;
+ memset(&new_fl, 0, sizeof(new_fl));
+
+ new_fl.fl_owner = current->files;
+ new_fl.fl_pid = current->pid;
+ new_fl.fl_file = filp;
+ new_fl.fl_flags = FL_POSIX | FL_ACCESS;
+ new_fl.fl_type = (read_write == FLOCK_VERIFY_WRITE) ? F_WRLCK : F_RDLCK;
+ new_fl.fl_start = offset;
+ new_fl.fl_end = offset + count - 1;

error = 0;
lock_kernel();
@@ -716,17 +718,17 @@
for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
if (!(fl->fl_flags & FL_POSIX))
continue;
- if (fl->fl_start > new_fl->fl_end)
+ if (fl->fl_start > new_fl.fl_end)
break;
- if (posix_locks_conflict(new_fl, fl)) {
+ if (posix_locks_conflict(&new_fl, fl)) {
error = -EAGAIN;
if (filp && (filp->f_flags & O_NONBLOCK))
break;
error = -EDEADLK;
- if (posix_locks_deadlock(new_fl, fl))
+ if (posix_locks_deadlock(&new_fl, fl))
break;

- error = locks_block_on(fl, new_fl);
+ error = locks_block_on(fl, &new_fl);
if (error != 0)
break;

@@ -739,7 +741,6 @@
goto repeat;
}
}
- locks_free_lock(new_fl);
unlock_kernel();
return error;
}
@@ -1411,6 +1412,9 @@
struct inode *inode;
int error;

+ if (file_lock == NULL)
+ return -ENOLCK;
+
/*
* This might block, so we do it before checking the inode.
*/
@@ -1563,6 +1567,9 @@
struct flock64 flock;
struct inode *inode;
int error;
+
+ if (file_lock == NULL)
+ return -ENOLCK;

/*
* This might block, so we do it before checking the inode.
\
 
 \ /
  Last update: 2005-03-22 13:03    [W:0.032 / U:1.064 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site