Message ID | 1301734876-22207-1-git-send-email-gaoyang.zyh@taobao.com |
---|---|
State | Accepted, archived |
Headers | show |
On Sat 02-04-11 17:01:16, Zhu Yanhai wrote: > bdget() should not be called when we hold spinlocks since > it might sleep. > > Signed-off-by: Zhu Yanhai <gaoyang.zyh@taobao.com> Looks good. Acked-by: Jan Kara <jack@suse.cz> PS: Added Ted to CC since he merges JBD2 patches. Honza > --- > fs/jbd2/journal.c | 3 ++- > 1 files changed, 2 insertions(+), 1 deletions(-) > > diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c > index 90407b8..33dd3ef 100644 > --- a/fs/jbd2/journal.c > +++ b/fs/jbd2/journal.c > @@ -2413,10 +2413,12 @@ const char *jbd2_dev_to_name(dev_t device) > new_dev = kmalloc(sizeof(struct devname_cache), GFP_KERNEL); > if (!new_dev) > return "NODEV-ALLOCFAILURE"; /* Something non-NULL */ > + bd = bdget(device); > spin_lock(&devname_cache_lock); > if (devcache[i]) { > if (devcache[i]->device == device) { > kfree(new_dev); > + bdput(bd); > ret = devcache[i]->devname; > spin_unlock(&devname_cache_lock); > return ret; > @@ -2425,7 +2427,6 @@ const char *jbd2_dev_to_name(dev_t device) > } > devcache[i] = new_dev; > devcache[i]->device = device; > - bd = bdget(device); > if (bd) { > bdevname(bd, devcache[i]->devname); > bdput(bd); > -- > 1.7.4 >
On Sat, Apr 02, 2011 at 05:01:16PM +0800, Zhu Yanhai wrote: > bdget() should not be called when we hold spinlocks since > it might sleep. > > Signed-off-by: Zhu Yanhai <gaoyang.zyh@taobao.com> I've added the patch to the patch queue. Technically we should never have a problem, though, since we only use this for the journal inode, which is not going to be a fresly created inode. So I don't think we should ever hit the paths that will result in the kernel sleeping. But I agree it's better to move it out, if for no other reason to make life easier for static checkers. - Ted -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 90407b8..33dd3ef 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -2413,10 +2413,12 @@ const char *jbd2_dev_to_name(dev_t device) new_dev = kmalloc(sizeof(struct devname_cache), GFP_KERNEL); if (!new_dev) return "NODEV-ALLOCFAILURE"; /* Something non-NULL */ + bd = bdget(device); spin_lock(&devname_cache_lock); if (devcache[i]) { if (devcache[i]->device == device) { kfree(new_dev); + bdput(bd); ret = devcache[i]->devname; spin_unlock(&devname_cache_lock); return ret; @@ -2425,7 +2427,6 @@ const char *jbd2_dev_to_name(dev_t device) } devcache[i] = new_dev; devcache[i]->device = device; - bd = bdget(device); if (bd) { bdevname(bd, devcache[i]->devname); bdput(bd);
bdget() should not be called when we hold spinlocks since it might sleep. Signed-off-by: Zhu Yanhai <gaoyang.zyh@taobao.com> --- fs/jbd2/journal.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)