Skip to contentSkip to conversation

Documentation for proc_file_read

PATCH New Thomas Hood 1 participant 1 message Feb 2, 2002 Proc filesystem

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Documentation for proc_file_read

Here is a patch that improves (I hope) the documentation of how user proc-file-read functions should interface with proc_file_read(). At this stage I just ask that any interested parties review what I have written. // Thomas

fs/proc/generic.c +49 -17
@@ -67,23 +67,60 @@
 
 		start = NULL;
 		if (dp->get_info) {
-			/*
-			 * Handle backwards compatibility with the old net
-			 * routines.
-			 */
+			/* Handle old net routines */
 			n = dp->get_info(page, &start, *ppos, count);
 			if (n < count)
 				eof = 1;
 		} else if (dp->read_proc) {
+			/*
+			 * How to be a proc read function
+			 * ------------------------------
+			 *
+			 * Prototype:
+			 *    int f(char *buffer, char **start, off_t offset,
+			 *          int count, int *peof, void *dat)
+			 *
+			 * You may assume that the buffer provided is at least
+			 * 3 KiB in size.
+			 *
+			 * If you know you have supplied all the data there is,
+			 * set the *peof bit.
+			 *
+			 * Three ways to return data:
+			 * A) Set *start = NULL
+			 *    Put the data of the requested offset at that
+			 *    offset within the buffer.  Return the number (n)
+			 *    of bytes there are from the beginning of the
+			 *    buffer up to the last byte of data.  If the
+			 *    number of supplied bytes (= n - offset) is less
+			 *    than the requested count, you will be called
+			 *    again with the requested offset advanced by n.
+			 *    This interface is useful for files no larger
+			 *    than the buffer.
+			 * B) Set *start = a small value (less than buffer!)
+			 *    Put the data of the requested offset at the
+			 *    beginning of the buffer.  Return the number of
+			 *    bytes of data placed there.  If this number is
+			 *    less than the requested count, you will be
+			 *    called again with the requested offset advanced
+			 *    by *start.  This interface is useful when you
+			 *    have a large file consisting of a series of
+			 *    data blocks which you want to count and return
+			 *    as wholes.
+			 *    (hack by [email protected])
+			 * C) Set *start = a location within the buffer
+			 *    Put the data of the requested offset at *start.
+			 *    Return the number (n) of bytes of data placed
+			 *    there.  If this number is less than the
+			 *    requested count, you will be called again with
+			 *    the requested offset advanced by n.
+			 */
 			n = dp->read_proc(page, &start, *ppos,
 					  count, &eof, dp->data);
 		} else
 			break;
 
-		if (!start) {
-			/*
-			 * For proc files that are less than 4k
-			 */
+		if (start == NULL) {
 			start = page + *ppos;
 			n -= *ppos;
 			if (n <= 0)
@@ -91,19 +128,14 @@
 			if (n > count)
 				n = count;
 		}
-		if (n == 0)
-			break;	/* End of file */
-		if (n < 0) {
+		if (n == 0)   /* end of file */
+			break;
+		if (n < 0) {  /* error */
 			if (retval == 0)
 				retval = n;
 			break;
 		}
 		
-		/* This is a hack to allow mangling of file pos independent
- 		 * of actual bytes read.  Simply place the data at page,
- 		 * return the bytes, and set `start' to the desired offset
- 		 * as an unsigned int. - [email protected]
-		 */
  		n -= copy_to_user(buf, start < page ? page : start, n);
 		if (n == 0) {
 			if (retval == 0)
@@ -111,7 +143,7 @@
 			break;
 		}
 
-		*ppos += start < page ? (long)start : n; /* Move down the file */
+		*ppos += start < page ? (long)start : n;
 		nbytes -= n;
 		buf += n;
 		retval += n;