[PATCH] relayfs: decouple buffer creation from inode creation
[firefly-linux-kernel-4.4.55.git] / fs / relayfs / relay.c
index 16446a15c96d956d84d83859a0660f4a8736bc29..7fbda177ad8fd144cc359817a483211bd90c0c45 100644 (file)
@@ -171,12 +171,17 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan,
        struct rchan_buf *buf;
        struct dentry *dentry;
 
+       buf = relay_create_buf(chan);
+       if (!buf)
+               return NULL;
+
        /* Create file in fs */
-       dentry = relayfs_create_file(filename, parent, S_IRUSR, chan);
-       if (!dentry)
+       dentry = relayfs_create_file(filename, parent, S_IRUSR, buf);
+       if (!dentry) {
+               relay_destroy_buf(buf);
                return NULL;
+       }
 
-       buf = RELAYFS_I(dentry->d_inode)->buf;
        buf->dentry = dentry;
        __relay_reset(buf, 1);
 
@@ -333,8 +338,7 @@ size_t relay_switch_subbuf(struct rchan_buf *buf, size_t length)
        return length;
 
 toobig:
-       printk(KERN_WARNING "relayfs: event too large (%Zd)\n", length);
-       WARN_ON(1);
+       buf->chan->last_toobig = length;
        return 0;
 }
 
@@ -399,6 +403,11 @@ void relay_close(struct rchan *chan)
                relay_close_buf(chan->buf[i]);
        }
 
+       if (chan->last_toobig)
+               printk(KERN_WARNING "relayfs: one or more items not logged "
+                      "[item size (%Zd) > sub-buffer size (%Zd)]\n",
+                      chan->last_toobig, chan->subbuf_size);
+
        kref_put(&chan->kref, relay_destroy_channel);
 }