Skip to contentSkip to conversation

Rework /proc/locks via seq_files and seq_list helpers (v2)

PATCH In review Pavel Emelyanov 1 participant 2 messages Sep 20, 2007

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index a1c1c01..d5b9653 100644
@@ -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);
#1 lore raw
Quoted 14 lines · Pavel Emelyanov

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...

Quoted 4 lines

Fixed the problem, spotted by J. Bruce Fields, about the fl variable reuse.

OOPS! Please disregard, wrong comment was copied :(