ocfs2: scheduling in atomic in ocfs2_filecheck_store()
Subsystems (2)
PATCH 1/1 ocfs2: scheduling in atomic in ocfs2_filecheck_store()
We're hold "spin_lock(&ent->fs_fcheck->fc_lock)" so the allocation has to be GFP_ATOMIC.
I changed the sizeof() because otherwise the line goes over the 80 character limit and also the new way is prefered kernel style.
fs/ocfs2/filecheck.c +1 -1
@@ -544,7 +544,7 @@ static ssize_t ocfs2_filecheck_store(struct kobject *kobj,BUG_ON (!ocfs2_filecheck_erase_entry (ent)); } - entry =kmalloc (sizeof (struct ocfs2_filecheck_entry ),GFP_NOFS ); + entry =kmalloc (sizeof (*entry),GFP_ATOMIC );if (entry) { entry->fe_ino = args.fa_ino; entry->fe_type = args.fa_type;
Quoted 14 lines · On Mon, 27 Jul 2015 11:27:23 +0300 Dan Carpenter <[email protected]>…
We're hold "
spin_lock(&ent->fs_fcheck->fc_lock)" so the allocation has to beGFP_ATOMIC.I changed the
sizeof()because otherwise the line goes over the 80 character limit and also the new way is prefered kernel style.Fixes e467fe5da718 ('ocfs2: sysfile interfaces for online file check')Signed-off-by Dan Carpenter <[email protected]>fs/ocfs2/filecheck.c +0
-0
fs/ocfs2/filecheck.c static ssize_t ocfs2_filecheck_store(struct kobject *kobj, · line 550
Quoted 8 lines
fs/ocfs2/filecheck.c +1
-1@@ -544,7 +544,7 @@ static ssize_t ocfs2_filecheck_store(struct kobject *kobj,BUG_ON (!ocfs2_filecheck_erase_entry (ent)); } - entry =kmalloc (sizeof (struct ocfs2_filecheck_entry ),GFP_NOFS ); + entry =kmalloc (sizeof (*entry),GFP_ATOMIC );if (entry) { entry->fe_ino = args.fa_ino; entry->fe_type = args.fa_type;
GFP_NOFS is more reliable than GFP_ATOMIC, so we should retain that if possible. And it's pretty easy to do here.
Gang, please carefully review and test?
fs/ocfs2/filecheck.c renamed from fs/ocfs2/filecheck.c~ocfs2-sysfile-interfaces-for-online-file-check-fix-2 +21 -19
@@ -501,7 +501,7 @@ static ssize_t ocfs2_filecheck_store(str const char *buf, size_t count) {struct ocfs2_filecheck_args args; -struct ocfs2_filecheck_entry *entry =NULL ; +struct ocfs2_filecheck_entry *entry;struct ocfs2_filecheck_sysfs_entry *ent;ssize_t ret =0 ;
@@ -527,12 +527,19 @@ static ssize_t ocfs2_filecheck_store(strreturn (!ret ? count : ret); } + entry =kmalloc (sizeof (*entry),GFP_NOFS ); +if (!entry) { + ret = -ENOMEM ; + goto out; + } +spin_lock (&ent->fs_fcheck->fc_lock);if ((ent->fs_fcheck->fc_size >= ent->fs_fcheck->fc_max) && - (ent->fs_fcheck->fc_done =0 )) { -mlog (ML_ERROR , -"Online file check queue(%u) is full\n" , - ent->fs_fcheck->fc_max); + (ent->fs_fcheck->fc_done =0 )) { +mlog (ML_ERROR ,"Online file check queue(%u) is full\n" , + ent->fs_fcheck->fc_max); +kfree (entry); + entry =NULL ; ret = -EBUSY ; }else { if ((ent->fs_fcheck->fc_size >= ent->fs_fcheck->fc_max) &&
@@ -544,26 +551,21 @@ static ssize_t ocfs2_filecheck_store(strBUG_ON (!ocfs2_filecheck_erase_entry (ent)); } - entry =kmalloc (sizeof (struct ocfs2_filecheck_entry ),GFP_NOFS ); -if (entry) { - entry->fe_ino = args.fa_ino; - entry->fe_type = args.fa_type; - entry->fe_done =0 ; - entry->fe_status =OCFS2_FILECHECK_ERR_INPROGRESS ; -list_add_tail (&entry->fe_list, - &ent->fs_fcheck->fc_head); - - ent->fs_fcheck->fc_size++; - ret = count; - }else { - ret = -ENOMEM ; - } + entry->fe_ino = args.fa_ino; + entry->fe_type = args.fa_type; + entry->fe_done =0 ; + entry->fe_status =OCFS2_FILECHECK_ERR_INPROGRESS ; +list_add_tail (&entry->fe_list, &ent->fs_fcheck->fc_head); + + ent->fs_fcheck->fc_size++; + ret = count; }spin_unlock (&ent->fs_fcheck->fc_lock);if (entry)ocfs2_filecheck_handle_entry (ent, entry); +out:ocfs2_filecheck_sysfs_put (ent);return ret; }
_
Thanks, Andrew. Looks good.
regards,
dan carpenter
Hi Andrew and Dan,
Thank for your efforts.
It is better than before.
Thanks a lot.
Gang
Quoted 106 lines
Quoted 1 line
Quoted 1 line
fs/ocfs2/filecheck.c static ssize_t ocfs2_filecheck_store(struct kobject
Quoted 14 lines · On Mon, 27 Jul 2015 11:27:23 +0300 Dan Carpenter <[email protected]>…
We're hold "
spin_lock(&ent->fs_fcheck->fc_lock)" so the allocation has to beGFP_ATOMIC.I changed the
sizeof()because otherwise the line goes over the 80 character limit and also the new way is prefered kernel style.Fixes e467fe5da718 ('ocfs2: sysfile interfaces for online file check')Signed-off-by Dan Carpenter <[email protected]>fs/ocfs2/filecheck.c +0
-0@@ -544,7 +544,7 @@ static ssize_t ocfs2_filecheck_store(struct kobject*kobj,
fs/ocfs2/filecheck.c static ssize_t ocfs2_filecheck_store(str
Quoted 8 lines
fs/ocfs2/filecheck.c +1
-1BUG_ON (!ocfs2_filecheck_erase_entry (ent)); } - entry =kmalloc (sizeof (struct ocfs2_filecheck_entry ),GFP_NOFS ); + entry =kmalloc (sizeof (*entry),GFP_ATOMIC );if (entry) { entry->fe_ino = args.fa_ino; entry->fe_type = args.fa_type;
GFP_NOFSis more reliable thanGFP_ATOMIC, so we should retain that if possible. And it's pretty easy to do here.Gang, please carefully review and test?
fs/ocfs2/filecheck.c renamed from fs/ocfs2/filecheck.c~ocfs2-sysfile-interfaces-for-online-file-check-fix-2 +21
-19@@ -501,7 +501,7 @@ static ssize_t ocfs2_filecheck_store(str const char *buf, size_t count) {struct ocfs2_filecheck_args args; -struct ocfs2_filecheck_entry *entry =NULL ; +struct ocfs2_filecheck_entry *entry;struct ocfs2_filecheck_sysfs_entry *ent;ssize_t ret =0 ;@@ -527,12 +527,19 @@ static ssize_t ocfs2_filecheck_store(strreturn (!ret ? count : ret); } + entry =kmalloc (sizeof (*entry),GFP_NOFS ); +if (!entry) { + ret = -ENOMEM ; + goto out; + } +spin_lock (&ent->fs_fcheck->fc_lock);if ((ent->fs_fcheck->fc_size >= ent->fs_fcheck->fc_max) && - (ent->fs_fcheck->fc_done =0 )) { -mlog (ML_ERROR , -"Online file check queue(%u) is full\n" , - ent->fs_fcheck->fc_max); + (ent->fs_fcheck->fc_done =0 )) { +mlog (ML_ERROR ,"Online file check queue(%u) is full\n" , + ent->fs_fcheck->fc_max); +kfree (entry); + entry =NULL ; ret = -EBUSY ; }else { if ((ent->fs_fcheck->fc_size >= ent->fs_fcheck->fc_max) &&@@ -544,26 +551,21 @@ static ssize_t ocfs2_filecheck_store(strBUG_ON (!ocfs2_filecheck_erase_entry (ent)); } - entry =kmalloc (sizeof (struct ocfs2_filecheck_entry ),GFP_NOFS ); -if (entry) { - entry->fe_ino = args.fa_ino; - entry->fe_type = args.fa_type; - entry->fe_done =0 ; - entry->fe_status =OCFS2_FILECHECK_ERR_INPROGRESS ; -list_add_tail (&entry->fe_list, - &ent->fs_fcheck->fc_head); - - ent->fs_fcheck->fc_size++; - ret = count; - }else { - ret = -ENOMEM ; - } + entry->fe_ino = args.fa_ino; + entry->fe_type = args.fa_type; + entry->fe_done =0 ; + entry->fe_status =OCFS2_FILECHECK_ERR_INPROGRESS ; +list_add_tail (&entry->fe_list, &ent->fs_fcheck->fc_head); + + ent->fs_fcheck->fc_size++; + ret = count; }spin_unlock (&ent->fs_fcheck->fc_lock);if (entry)ocfs2_filecheck_handle_entry (ent, entry); +out:ocfs2_filecheck_sysfs_put (ent);return ret; }_