From: franz_pletz@t-online.de (Franz Pletz)
To: Andrew Morton <akpm@osdl.org>, Jens Axboe <axboe@suse.de>,
Ludwig Schmidt <ludoschmidt@web.de>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] loopback device can't act as its backing store
Date: Sat, 4 Dec 2004 01:34:01 +0100 [thread overview]
Message-ID: <20041204013401.692a3520@sgx.home> (raw)
In-Reply-To: <20041203145056.541308d1.akpm@osdl.org>
Andrew Morton <akpm@osdl.org> wrote:
> Your patch addresses direct loop0-on-loop0 recursion, but does it fix the
> more complex loop-stacks which Chris Spiegel identified?
No, it doesn't. I was unfortunately much too focused on the loop0-loop0 problem to realize those issues.
> I don't think there's any actual infinite recursion in Chris's example - in
> his case we simply stacked loop deveces too deep. But a fix for Chris's
> scenario will also fix the one which you identify, I think. Andries posted
> such a patch but I have not yet got around to looking at it.
Andries' patch addresses all issues Chris and I encountered although raising some minor problems.
In the while-loop only the inodes are being compared. But you can have more than one device node pointing to this specific device. Consequently, we need to compare the dev_t structures like in my initial patch.
Moreover, if the loopback device l is unbound, the while-loop shouldn't be terminated as this (unbound!) device file would therefore be set as the new backing file, which makes no sense in my opinion and which additionally could lead into problems while accessing the device. I would propose a goto out_putf to return -EINVAL instead.
Now, Chris' and my issues with mount and losetup are resolved properly. I attached the patch of Andries including the proposed changes.
--- linux-orig/drivers/block/loop.c 2004-11-25 19:56:32.000000000 +0100
+++ linux/drivers/block/loop.c 2004-12-04 00:58:09.897336912 +0100
@@ -622,10 +622,17 @@
return error;
}
+static inline int is_loop_device(struct file *file)
+{
+ struct inode *i = file->f_mapping->host;
+
+ return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
+}
+
static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
struct block_device *bdev, unsigned int arg)
{
- struct file *file;
+ struct file *file, *f;
struct inode *inode;
struct address_space *mapping;
unsigned lo_blocksize;
@@ -636,15 +643,31 @@
/* This is safe, since we have a reference from open(). */
__module_get(THIS_MODULE);
- error = -EBUSY;
- if (lo->lo_state != Lo_unbound)
- goto out;
-
error = -EBADF;
file = fget(arg);
if (!file)
goto out;
+ error = -EBUSY;
+ if (lo->lo_state != Lo_unbound)
+ goto out_putf;
+
+ /* Avoid recursion */
+ f = file;
+ while (is_loop_device(f)) {
+ struct loop_device *l;
+
+ if (f->f_mapping->host->i_rdev == lo_file->f_mapping->host->i_rdev)
+ goto out_putf;
+
+ l = f->f_mapping->host->i_bdev->bd_disk->private_data;
+ if (l->lo_state == Lo_unbound) {
+ error = -EINVAL;
+ goto out_putf;
+ }
+ f = l->lo_backing_file;
+ }
+
mapping = file->f_mapping;
inode = mapping->host;
next prev parent reply other threads:[~2004-12-04 0:34 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-03 19:51 Franz Pletz
2004-12-03 21:42 ` Phil Oester
2004-12-03 22:31 ` Franz Pletz
2004-12-03 22:50 ` Andrew Morton
2004-12-03 22:51 ` Andrew Morton
2004-12-04 0:34 ` Franz Pletz [this message]
[not found] <fa.gge7q0c.1pjgej6@ifi.uio.no>
[not found] ` <fa.gbb6job.1um2er1@ifi.uio.no>
2004-12-04 0:25 ` Bodo Eggert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20041204013401.692a3520@sgx.home \
--to=franz_pletz@t-online.de \
--cc=akpm@osdl.org \
--cc=axboe@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=ludoschmidt@web.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®