Rework /proc/locks via seq_files and seq_list helpers (v2)
Subsystems (2)
PATCH 1/1 Rework /proc/locks via seq_files and seq_list helpers (v2)
Currently /proc/locks is shown with a proc_read function, but its behavior is rather complex as it has to manually handle current offset and buffer length. On the other hand, files that show objects from lists can be easily reimplemented using the sequential files and the seq_list_XXX() helpers.
This saves (as usually) 16 lines of code and more than 200 from the .text section.
This patch looks rather ugly, as diff often uses curly braces as not-changed lines, but I haven't managed to organize the code to make diff look better. Except for move the whole proc related stuff upper/lower in the locks.c file...
Fixed the problem, spotted by J. Bruce Fields, about the fl variable reuse.
---
fs/locks.c +12 -9
@@ -1354,6 +1354,7 @@ int fcntl_getlease(struct file *filp)int generic_setlease (struct file *filp,long arg,struct file_lock **flp) {struct file_lock *fl, **before, **my_before =NULL , *lease; +struct file_lock *new_fl =NULL ;struct dentry *dentry = filp->f_path.dentry;struct inode *inode = dentry->d_inode;int error, rdlease_count =0 , wrlease_count =0 ;
@@ -1380,6 +1381,11 @@ int generic_setlease(struct file *filp, || (atomic_read(&inode->i_count) > 1))) goto out; + error = -ENOMEM ; + new_fl =locks_alloc_lock (); +if (new_fl ==NULL ) + goto out; +/* * At this point, we know that if there is an exclusive * lease on this file, then we hold it on this filp
@@ -1422,18 +1428,15 @@ int generic_setlease(struct file *filp,if (!leases_enable) goto out; - error = -ENOMEM ; - fl =locks_alloc_lock (); -if (fl ==NULL ) - goto out; - -locks_copy_lock (fl, lease); - -locks_insert_lock (before, fl); +locks_copy_lock (new_fl, lease); +locks_insert_lock (before, new_fl); *flp = fl; - error =0 ; +return 0 ; + out: +if (new_fl !=NULL ) +locks_free_lock (new_fl);return error; }EXPORT_SYMBOL (generic_setlease);
Quoted 14 lines · Pavel Emelyanov
Currently
/proc/locksis shown with aproc_readfunction, but its behavior is rather complex as it has to manually handle current offset and buffer length. On the other hand, files that show objects from lists can be easily reimplemented using the sequential files and theseq_list_XXX()helpers.This saves (as usually) 16 lines of code and more than 200 from the .text section.
This patch looks rather ugly, as diff often uses curly braces as not-changed lines, but I haven't managed to organize the code to make diff look better. Except for move the whole proc related stuff upper/lower in the
locks.cfile...
Quoted 4 lines
Fixed the problem, spotted by J. Bruce Fields, about the fl variable reuse.
Signed-off-by Pavel Emelyanov <[email protected]>
OOPS! Please disregard, wrong comment was copied :(